/*=============================================================================
    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
