1 /*=============================================================================
2     Copyright (c) 2001-2011 Joel de Guzman
3     Copyright (c) 2001-2011 Hartmut Kaiser
4 
5     Distributed under the Boost Software License, Version 1.0. (See accompanying
6     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
8 #include "statement.hpp"
9 #include "error_handler.hpp"
10 #include "annotation.hpp"
11 
12 namespace client { namespace parser
13 {
14     template <typename Iterator, typename Lexer>
statement(error_handler<typename Lexer::base_iterator_type,Iterator> & error_handler,Lexer const & l)15     statement<Iterator, Lexer>::statement(
16             error_handler<typename Lexer::base_iterator_type, Iterator>& error_handler
17           , Lexer const& l)
18       : statement::base_type(statement_list), expr(error_handler, l)
19     {
20         qi::_1_type _1;
21         qi::_2_type _2;
22         qi::_3_type _3;
23         qi::_4_type _4;
24 
25         qi::_val_type _val;
26 
27         using qi::on_error;
28         using qi::on_success;
29         using qi::fail;
30         using boost::phoenix::function;
31 
32         typedef client::error_handler<typename Lexer::base_iterator_type, Iterator>
33             error_handler_type;
34         typedef function<error_handler_type> error_handler_function;
35         typedef function<client::annotation<Iterator> > annotation_function;
36 
37         statement_list =
38             +statement_
39             ;
40 
41         statement_ =
42                 variable_declaration
43             |   assignment
44             |   compound_statement
45             |   if_statement
46             |   while_statement
47             |   return_statement
48             ;
49 
50         variable_declaration =
51                 l("int")
52             >   expr.identifier
53             >  -('=' > expr)
54             >   ';'
55             ;
56 
57         assignment =
58                 expr.identifier
59             >   '='
60             >   expr
61             >   ';'
62             ;
63 
64         if_statement =
65                 l("if")
66             >   '('
67             >   expr
68             >   ')'
69             >   statement_
70             >
71                -(
72                     l("else")
73                 >   statement_
74                 )
75             ;
76 
77         while_statement =
78                 l("while")
79             >   '('
80             >   expr
81             >   ')'
82             >   statement_
83             ;
84 
85         compound_statement =
86             '{' >> -statement_list >> '}'
87             ;
88 
89         return_statement =
90                 l("return")
91             >  -expr
92             >   ';'
93             ;
94 
95         // Debugging and error handling and reporting support.
96         BOOST_SPIRIT_DEBUG_NODES(
97             (statement_list)
98             (statement_)
99             (variable_declaration)
100             (assignment)
101             (if_statement)
102             (while_statement)
103             (compound_statement)
104             (return_statement)
105         );
106 
107         // Error handling: on error in statement_list, call error_handler.
108         on_error<fail>(statement_list,
109             error_handler_function(error_handler)(
110                 "Error! Expecting ", _4, _3));
111 
112         // Annotation: on success in variable_declaration,
113         // assignment and return_statement, call annotation.
114         on_success(variable_declaration,
115             annotation_function(error_handler.iters)(_val, _1));
116         on_success(assignment,
117             annotation_function(error_handler.iters)(_val, _1));
118         on_success(return_statement,
119             annotation_function(error_handler.iters)(_val, _1));
120     }
121 }}
122 
123 
124