dab14454d1
[SVN r73979]
105 lines
3.3 KiB
C++
105 lines
3.3 KiB
C++
/*=============================================================================
|
|
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));
|
|
}
|
|
}}
|
|
|
|
|