/*============================================================================= 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 statement::statement(std::vector& 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(start, error_handler(_4, _3, _2)); } #endif