• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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