123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /*=============================================================================
- Copyright (c) 2001-2011 Joel de Guzman
- Copyright (c) 2001-2011 Hartmut Kaiser
- 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 "expression.hpp"
- #include "error_handler.hpp"
- #include "annotation.hpp"
- #include <boost/spirit/include/phoenix_function.hpp>
- #include <boost/spirit/include/lex_plain_token.hpp>
- namespace client { namespace parser
- {
- template <typename Iterator, typename Lexer>
- expression<Iterator, Lexer>::expression(
- error_handler<typename Lexer::base_iterator_type, Iterator>& error_handler
- , Lexer const& l)
- : expression::base_type(expr), lexer(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;
- ///////////////////////////////////////////////////////////////////////
- // Main expression grammar
- expr =
- unary_expr
- >> *(tokenid_mask(token_ids::op_binary) > unary_expr)
- ;
- unary_expr =
- postfix_expr
- | (tokenid_mask(token_ids::op_unary) > unary_expr)
- ;
- postfix_expr =
- function_call
- | primary_expr
- ;
- primary_expr =
- lexer.lit_uint
- | lexer.true_or_false
- | identifier
- | '(' > expr > ')'
- ;
- function_call =
- (identifier >> '(')
- > argument_list
- > ')'
- ;
- argument_list = -(expr % ',');
- identifier = lexer.identifier;
- ///////////////////////////////////////////////////////////////////////
- // Debugging and error handling and reporting support.
- BOOST_SPIRIT_DEBUG_NODES(
- (expr)
- (unary_expr)
- (postfix_expr)
- (primary_expr)
- (function_call)
- (argument_list)
- (identifier)
- );
- ///////////////////////////////////////////////////////////////////////
- // Error handling: on error in expr, call error_handler.
- on_error<fail>(expr,
- error_handler_function(error_handler)(
- "Error! Expecting ", _4, _3));
- ///////////////////////////////////////////////////////////////////////
- // Annotation: on success in unary_expr, postfix_expr,
- // and primary_expr call annotation.
- on_success(unary_expr,
- annotation_function(error_handler.iters)(_val, _1));
- on_success(postfix_expr,
- annotation_function(error_handler.iters)(_val, _1));
- on_success(primary_expr,
- annotation_function(error_handler.iters)(_val, _1));
- }
- }}
|