1 #ifndef META_HS_GRAMMAR_HPP 2 #define META_HS_GRAMMAR_HPP 3 4 // Copyright Abel Sinkovics (abel@sinkovics.hu) 2012. 5 // Distributed under the Boost Software License, Version 1.0. 6 // (See accompanying file LICENSE_1_0.txt or copy at 7 // http://www.boost.org/LICENSE_1_0.txt) 8 9 #include <token.hpp> 10 #include <semantic.hpp> 11 12 #include <boost/metaparse/middle_of.hpp> 13 #include <boost/metaparse/transform.hpp> 14 #include <boost/metaparse/sequence.hpp> 15 #include <boost/metaparse/last_of.hpp> 16 #include <boost/metaparse/one_of.hpp> 17 #include <boost/metaparse/foldl_reject_incomplete_start_with_parser.hpp> 18 #include <boost/metaparse/foldr_start_with_parser.hpp> 19 #include <boost/metaparse/entire_input.hpp> 20 #include <boost/metaparse/build_parser.hpp> 21 22 namespace grammar 23 { 24 /* 25 * The grammar 26 * 27 * definition ::= token::name+ token::define expression 28 * expression ::= cmp_exp 29 * cmp_exp ::= plus_exp (token::cmp plus_exp)* 30 * plus_exp ::= mult_exp ((token::plus | token::minus) mult_exp)* 31 * mult_exp ::= application ((token::mult | token::div) application)* 32 * application ::= single_exp+ 33 * single_exp ::= if_exp | token::name | token::int_ | bracket_exp 34 * if_exp ::= token::if_ expression token::then expression token::else_ expression 35 * bracket_exp ::= token::open_bracket expression token::close_bracket 36 */ 37 38 struct expression; 39 40 typedef 41 boost::metaparse::middle_of< 42 token::open_bracket, 43 expression, 44 token::close_bracket 45 > 46 bracket_exp; 47 48 typedef 49 boost::metaparse::transform< 50 boost::metaparse::sequence< 51 boost::metaparse::last_of<token::if_, expression>, 52 boost::metaparse::last_of<token::then, expression>, 53 boost::metaparse::last_of<token::else_, expression> 54 >, 55 semantic::if_ 56 > 57 if_exp; 58 59 typedef 60 boost::metaparse::one_of< 61 if_exp, 62 boost::metaparse::transform<token::name, semantic::ref>, 63 boost::metaparse::transform<token::int_, semantic::value>, 64 bracket_exp 65 > 66 single_exp; 67 68 typedef 69 boost::metaparse::foldl_reject_incomplete_start_with_parser< 70 single_exp, 71 single_exp, 72 semantic::application 73 > 74 application; 75 76 typedef 77 boost::metaparse::foldl_reject_incomplete_start_with_parser< 78 boost::metaparse::sequence< 79 boost::metaparse::one_of<token::mult, token::div>, 80 application 81 >, 82 application, 83 semantic::binary_op 84 > 85 mult_exp; 86 87 typedef 88 boost::metaparse::foldl_reject_incomplete_start_with_parser< 89 boost::metaparse::sequence< 90 boost::metaparse::one_of<token::plus, token::minus>, 91 mult_exp 92 >, 93 mult_exp, 94 semantic::binary_op 95 > 96 plus_exp; 97 98 typedef 99 boost::metaparse::foldl_reject_incomplete_start_with_parser< 100 boost::metaparse::sequence<token::cmp, plus_exp>, 101 plus_exp, 102 semantic::binary_op 103 > 104 cmp_exp; 105 106 struct expression : cmp_exp {}; 107 108 typedef 109 boost::metaparse::transform< 110 boost::metaparse::sequence< 111 token::name, 112 boost::metaparse::foldr_start_with_parser< 113 token::name, 114 boost::metaparse::last_of<token::define, expression>, 115 semantic::lambda 116 > 117 >, 118 semantic::pair 119 > 120 definition; 121 122 typedef 123 boost::metaparse::build_parser< 124 boost::metaparse::entire_input<definition> 125 > 126 def_parser; 127 } 128 129 #endif 130 131