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_AST_HPP)
8#define BOOST_SPIRIT_X3_CALC8_AST_HPP
9
10#include <boost/spirit/home/x3/support/ast/variant.hpp>
11#include <boost/spirit/home/x3/support/ast/position_tagged.hpp>
12#include <boost/fusion/include/io.hpp>
13#include <list>
14
15namespace client { namespace ast
16{
17 ///////////////////////////////////////////////////////////////////////////
18 // The AST
19 ///////////////////////////////////////////////////////////////////////////
20 namespace x3 = boost::spirit::x3;
21
22 struct nil {};
23 struct signed_;
24 struct expression;
25
26 struct variable : x3::position_tagged
27 {
28 variable(std::string const& name = "") : name(name) {}
29 std::string name;
30 };
31
32 struct operand :
33 x3::variant<
34 nil
35 , unsigned int
36 , variable
37 , x3::forward_ast<signed_>
38 , x3::forward_ast<expression>
39 >
40 {
41 using base_type::base_type;
42 using base_type::operator=;
43 };
44
45 struct signed_
46 {
47 char sign;
48 operand operand_;
49 };
50
51 struct operation : x3::position_tagged
52 {
53 char operator_;
54 operand operand_;
55 };
56
57 struct expression : x3::position_tagged
58 {
59 operand first;
60 std::list<operation> rest;
61 };
62
63 struct assignment : x3::position_tagged
64 {
65 variable lhs;
66 expression rhs;
67 };
68
69 struct variable_declaration
70 {
71 assignment assign;
72 };
73
74 struct statement :
75 x3::variant<
76 variable_declaration
77 , assignment>
78 {
79 using base_type::base_type;
80 using base_type::operator=;
81 };
82
83 typedef std::list<statement> statement_list;
84
85 // print functions for debugging
86 inline std::ostream& operator<<(std::ostream& out, nil)
87 {
88 out << "nil";
89 return out;
90 }
91
92 inline std::ostream& operator<<(std::ostream& out, variable const& var)
93 {
94 out << var.name; return out;
95 }
96}}
97
98#endif
99

source code of boost/libs/spirit/example/x3/calc/calc8/ast.hpp