]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/example/x3/calc/calc8/statement_def.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / spirit / example / x3 / calc / calc8 / statement_def.hpp
1 /*=============================================================================
2 Copyright (c) 2001-2014 Joel de Guzman
3
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 =============================================================================*/
7 #if !defined(BOOST_SPIRIT_X3_CALC8_STATEMENT_DEF_HPP)
8 #define BOOST_SPIRIT_X3_CALC8_STATEMENT_DEF_HPP
9
10 #include <boost/spirit/home/x3.hpp>
11 #include <boost/spirit/home/x3/support/utility/annotate_on_success.hpp>
12 #include "ast.hpp"
13 #include "ast_adapted.hpp"
14 #include "statement.hpp"
15 #include "expression.hpp"
16 #include "common.hpp"
17 #include "error_handler.hpp"
18
19 namespace client { namespace parser
20 {
21 using x3::raw;
22 using x3::lexeme;
23 using namespace x3::ascii;
24
25 struct statement_list_class;
26 struct variable_declaration_class;
27 struct assignment_class;
28 struct variable_class;
29
30 typedef x3::rule<statement_list_class, ast::statement_list> statement_list_type;
31 typedef x3::rule<variable_declaration_class, ast::variable_declaration> variable_declaration_type;
32 typedef x3::rule<assignment_class, ast::assignment> assignment_type;
33 typedef x3::rule<variable_class, ast::variable> variable_type;
34
35 statement_type const statement = "statement";
36 statement_list_type const statement_list = "statement_list";
37 variable_declaration_type const variable_declaration = "variable_declaration";
38 assignment_type const assignment = "assignment";
39 variable_type const variable = "variable";
40
41 // Import the expression rule
42 namespace { auto const& expression = client::expression(); }
43
44 auto const statement_list_def =
45 +(variable_declaration | assignment)
46 ;
47
48 auto const variable_declaration_def =
49 lexeme["var" >> !(alnum | '_')] // make sure we have whole words
50 > assignment
51 ;
52
53 auto const assignment_def =
54 variable
55 > '='
56 > expression
57 > ';'
58 ;
59
60 auto const variable_def = identifier;
61 auto const statement_def = statement_list;
62
63 BOOST_SPIRIT_DEFINE(
64 statement
65 , statement_list
66 , variable_declaration
67 , assignment
68 , variable
69 );
70
71 struct statement_class : error_handler_base, x3::annotate_on_success {};
72 struct assignment_class : x3::annotate_on_success {};
73 struct variable_class : x3::annotate_on_success {};
74 }}
75
76 namespace client
77 {
78 parser::statement_type const& statement()
79 {
80 return parser::statement;
81 }
82 }
83
84 #endif