blob: d3135e22d22bf77c2840f57cab32c37aaebf2a2a [file] [log] [blame]
/*=============================================================================
Copyright (c) 2001-2010 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)
=============================================================================*/
#if !defined(BOOST_SPIRIT_CALC6C)
#define BOOST_SPIRIT_CALC6C
#include "calc6.hpp"
///////////////////////////////////////////////////////////////////////////////
// Our statement grammar and compiler
///////////////////////////////////////////////////////////////////////////////
template <typename Iterator>
statement<Iterator>::statement(std::vector<int>& code)
: statement::base_type(start)
, code(code)
, nvars(0)
, expr(code, vars)
, add_var(vars)
, op(code)
{
using qi::lexeme;
using qi::lit;
using qi::raw;
using namespace qi::labels;
using qi::on_error;
using qi::fail;
using ascii::alnum;
using ascii::alpha;
identifier %=
raw[lexeme[alpha >> *(alnum | '_')]]
;
var_ref =
lexeme
[
vars [_val = _1]
>> !(alnum | '_') // make sure we have whole words
]
;
var_decl =
lexeme[
"var"
>> !(alnum | '_') // make sure we have whole words
]
> !var_ref // make sure the variable isn't redeclared
> identifier [add_var(_1, ref(nvars))]
> (';' | '=' > assignment_rhs(ref(nvars)-1))
;
assignment =
var_ref [_a = _1]
>> '='
> assignment_rhs(_a)
;
assignment_rhs =
expr
> lit(';') [op(op_store, _r1)]
;
start = +(var_decl | assignment);
identifier.name("identifier");
var_ref.name("variable-reference");
var_decl.name("variable-declaration");
assignment.name("assignment");
assignment_rhs.name("assignment-rhs");
on_error<fail>(start, error_handler(_4, _3, _2));
}
#endif