]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 |