function<Iterator, Lexer>::function( error_handler<typename Lexer::base_iterator_type, Iterator>& error_handler , Lexer const& l) : function::base_type(start), body(error_handler, l) { qi::_1_type _1; qi::_2_type _2; qi::_3_type _3; qi::_4_type _4; qi::_val_type _val; using qi::on_error; using qi::on_success; using qi::fail; using boost::phoenix::function; typedef client::error_handler<typename Lexer::base_iterator_type, Iterator> error_handler_type; typedef function<error_handler_type> error_handler_function; typedef function<client::annotation<Iterator> > annotation_function; identifier = body.expr.identifier; argument_list = -(identifier % ','); start = (l.token("void") | l.token("int")) > identifier > '(' > argument_list > ')' > (';' | '{' > body > '}') ; // Debugging and error handling and reporting support. BOOST_SPIRIT_DEBUG_NODES( (identifier) (argument_list) (start) ); // Error handling: on error in start, call error_handler. on_error<fail>(start, error_handler_function(error_handler)( "Error! Expecting ", _4, _3)); // Annotation: on success in start, call annotation. on_success(identifier, annotation_function(error_handler.iters)(_val, _1)); }
statement<Iterator, Lexer>::statement( error_handler<typename Lexer::base_iterator_type, Iterator>& error_handler , Lexer const& l) : statement::base_type(statement_list), expr(error_handler, l) { qi::_1_type _1; qi::_2_type _2; qi::_3_type _3; qi::_4_type _4; qi::_val_type _val; qi::tokenid_mask_type tokenid_mask; using qi::on_error; using qi::on_success; using qi::fail; using boost::phoenix::function; typedef client::error_handler<typename Lexer::base_iterator_type, Iterator> error_handler_type; typedef function<error_handler_type> error_handler_function; typedef function<client::annotation<Iterator> > annotation_function; statement_list = +statement_ ; statement_ = variable_declaration | assignment | compound_statement | if_statement | while_statement | return_statement | expr | ';' ; variable_declaration = l("int") > expr.identifier > -(l("=") > expr) > ';' ; assignment = expr.identifier > tokenid_mask(token_ids::op_assign) > expr > ';' ; if_statement = l("if") > '(' > expr > ')' > statement_ > -( l("else") > statement_ ) ; while_statement = l("while") > '(' > expr > ')' > statement_ ; compound_statement = '{' >> -statement_list >> '}' ; return_statement = l("return") > -expr > ';' ; // Debugging and error handling and reporting support. BOOST_SPIRIT_DEBUG_NODES( (statement_list) (statement_) (variable_declaration) (assignment) (if_statement) (while_statement) (compound_statement) (return_statement) ); // Error handling: on error in statement_list, call error_handler. on_error<fail>(statement_list, error_handler_function(error_handler)( "Error! Expecting ", _4, _3)); // Annotation: on success in variable_declaration, // assignment and return_statement, call annotation. on_success(variable_declaration, annotation_function(error_handler.iters)(_val, _1)); on_success(assignment, annotation_function(error_handler.iters)(_val, _1)); on_success(return_statement, annotation_function(error_handler.iters)(_val, _1)); }