1/*=============================================================================
2 Copyright (c) 2001-2015 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_REPR_REXPR_DEF_HPP)
8#define BOOST_SPIRIT_X3_REPR_REXPR_DEF_HPP
9
10#include "ast.hpp"
11#include "ast_adapted.hpp"
12#include "error_handler.hpp"
13#include "rexpr.hpp"
14
15#include <boost/spirit/home/x3.hpp>
16#include <boost/spirit/home/x3/support/utility/annotate_on_success.hpp>
17
18namespace rexpr { namespace parser
19{
20 namespace x3 = boost::spirit::x3;
21 namespace ascii = boost::spirit::x3::ascii;
22
23 using x3::lit;
24 using x3::lexeme;
25
26 using ascii::char_;
27 using ascii::string;
28
29 ///////////////////////////////////////////////////////////////////////////
30 // Rule IDs
31 ///////////////////////////////////////////////////////////////////////////
32
33 struct rexpr_value_class;
34 struct rexpr_key_value_class;
35 struct rexpr_inner_class;
36
37 ///////////////////////////////////////////////////////////////////////////
38 // Rules
39 ///////////////////////////////////////////////////////////////////////////
40
41 x3::rule<rexpr_value_class, ast::rexpr_value> const
42 rexpr_value = "rexpr_value";
43
44 x3::rule<rexpr_key_value_class, ast::rexpr_key_value> const
45 rexpr_key_value = "rexpr_key_value";
46
47 x3::rule<rexpr_inner_class, ast::rexpr> const
48 rexpr_inner = "rexpr";
49
50 rexpr_type const rexpr = "rexpr";
51
52 ///////////////////////////////////////////////////////////////////////////
53 // Grammar
54 ///////////////////////////////////////////////////////////////////////////
55
56 auto const quoted_string =
57 lexeme['"' >> *(char_ - '"') >> '"'];
58
59 auto const rexpr_value_def =
60 quoted_string | rexpr_inner;
61
62 auto const rexpr_key_value_def =
63 quoted_string > '=' > rexpr_value;
64
65 auto const rexpr_inner_def =
66 '{' > *rexpr_key_value > '}';
67
68 auto const rexpr_def = rexpr_inner_def;
69
70 BOOST_SPIRIT_DEFINE(rexpr_value, rexpr, rexpr_inner, rexpr_key_value);
71
72 ///////////////////////////////////////////////////////////////////////////
73 // Annotation and Error handling
74 ///////////////////////////////////////////////////////////////////////////
75
76 // We want these to be annotated with the iterator position.
77 struct rexpr_value_class : x3::annotate_on_success {};
78 struct rexpr_key_value_class : x3::annotate_on_success {};
79 struct rexpr_inner_class : x3::annotate_on_success {};
80
81 // We want error-handling only for the start (outermost) rexpr
82 // rexpr is the same as rexpr_inner but without error-handling (see error_handler.hpp)
83 struct rexpr_class : x3::annotate_on_success, error_handler_base {};
84}}
85
86namespace rexpr
87{
88 parser::rexpr_type const& rexpr()
89 {
90 return parser::rexpr;
91 }
92}
93
94#endif
95

source code of boost/libs/spirit/example/x3/rexpr/rexpr_full/rexpr/rexpr_def.hpp