]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/metaparse/example/meta_hs/grammar.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / metaparse / example / meta_hs / grammar.hpp
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