123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #ifndef META_HS_GRAMMAR_HPP
- #define META_HS_GRAMMAR_HPP
- // Copyright Abel Sinkovics (abel@sinkovics.hu) 2012.
- // Distributed under the Boost Software License, Version 1.0.
- // (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #include <token.hpp>
- #include <semantic.hpp>
- #include <boost/metaparse/middle_of.hpp>
- #include <boost/metaparse/transform.hpp>
- #include <boost/metaparse/sequence.hpp>
- #include <boost/metaparse/last_of.hpp>
- #include <boost/metaparse/one_of.hpp>
- #include <boost/metaparse/foldl_reject_incomplete_start_with_parser.hpp>
- #include <boost/metaparse/foldr_start_with_parser.hpp>
- #include <boost/metaparse/entire_input.hpp>
- #include <boost/metaparse/build_parser.hpp>
- namespace grammar
- {
- /*
- * The grammar
- *
- * definition ::= token::name+ token::define expression
- * expression ::= cmp_exp
- * cmp_exp ::= plus_exp (token::cmp plus_exp)*
- * plus_exp ::= mult_exp ((token::plus | token::minus) mult_exp)*
- * mult_exp ::= application ((token::mult | token::div) application)*
- * application ::= single_exp+
- * single_exp ::= if_exp | token::name | token::int_ | bracket_exp
- * if_exp ::= token::if_ expression token::then expression token::else_ expression
- * bracket_exp ::= token::open_bracket expression token::close_bracket
- */
-
- struct expression;
-
- typedef
- boost::metaparse::middle_of<
- token::open_bracket,
- expression,
- token::close_bracket
- >
- bracket_exp;
-
- typedef
- boost::metaparse::transform<
- boost::metaparse::sequence<
- boost::metaparse::last_of<token::if_, expression>,
- boost::metaparse::last_of<token::then, expression>,
- boost::metaparse::last_of<token::else_, expression>
- >,
- semantic::if_
- >
- if_exp;
-
- typedef
- boost::metaparse::one_of<
- if_exp,
- boost::metaparse::transform<token::name, semantic::ref>,
- boost::metaparse::transform<token::int_, semantic::value>,
- bracket_exp
- >
- single_exp;
-
- typedef
- boost::metaparse::foldl_reject_incomplete_start_with_parser<
- single_exp,
- single_exp,
- semantic::application
- >
- application;
-
- typedef
- boost::metaparse::foldl_reject_incomplete_start_with_parser<
- boost::metaparse::sequence<
- boost::metaparse::one_of<token::mult, token::div>,
- application
- >,
- application,
- semantic::binary_op
- >
- mult_exp;
-
- typedef
- boost::metaparse::foldl_reject_incomplete_start_with_parser<
- boost::metaparse::sequence<
- boost::metaparse::one_of<token::plus, token::minus>,
- mult_exp
- >,
- mult_exp,
- semantic::binary_op
- >
- plus_exp;
-
- typedef
- boost::metaparse::foldl_reject_incomplete_start_with_parser<
- boost::metaparse::sequence<token::cmp, plus_exp>,
- plus_exp,
- semantic::binary_op
- >
- cmp_exp;
-
- struct expression : cmp_exp {};
-
- typedef
- boost::metaparse::transform<
- boost::metaparse::sequence<
- token::name,
- boost::metaparse::foldr_start_with_parser<
- token::name,
- boost::metaparse::last_of<token::define, expression>,
- semantic::lambda
- >
- >,
- semantic::pair
- >
- definition;
-
- typedef
- boost::metaparse::build_parser<
- boost::metaparse::entire_input<definition>
- >
- def_parser;
- }
- #endif
|