1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /*=============================================================================
- Copyright (c) 2001-2011 Joel de Guzman
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- =============================================================================*/
- #include "function.hpp"
- #include "error_handler.hpp"
- #include "annotation.hpp"
- namespace client { namespace parser
- {
- template <typename Iterator>
- function<Iterator>::function(error_handler<Iterator>& error_handler)
- : function::base_type(start), body(error_handler)
- {
- qi::_1_type _1;
- qi::_2_type _2;
- qi::_3_type _3;
- qi::_4_type _4;
- qi::_val_type _val;
- qi::raw_type raw;
- qi::lexeme_type lexeme;
- qi::alpha_type alpha;
- qi::alnum_type alnum;
- qi::string_type string;
- using qi::on_error;
- using qi::on_success;
- using qi::fail;
- using boost::phoenix::function;
- typedef function<client::error_handler<Iterator> > error_handler_function;
- typedef function<client::annotation<Iterator> > annotation_function;
- name =
- !body.expr.keywords
- >> raw[lexeme[(alpha | '_') >> *(alnum | '_')]]
- ;
- identifier = name;
- argument_list = -(identifier % ',');
- start =
- lexeme[(string("void") | string("int"))
- >> !(alnum | '_')] // make sure we have whole words
- > 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));
- }
- }}
|