/*=============================================================================
    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_MINI_CB)
#define BOOST_SPIRIT_MINI_CB

#include "mini_c.hpp"

///////////////////////////////////////////////////////////////////////////////
//  Our expression grammar and compiler
///////////////////////////////////////////////////////////////////////////////
template <typename Iterator>
expression<Iterator>::expression(
    std::vector<int>& code
  , symbols<char, int>& vars
  , symbols<char, function_info>& functions)
  : expression::base_type(expr)
  , code(code)
  , vars(vars)
  , functions(functions)
  , op(code)
{
    expr =
        equality_expr.alias()
        ;

    equality_expr =
        logical_expr
        >> *(   ("==" > logical_expr        [op(op_eq)])
            |   ("!=" > logical_expr        [op(op_neq)])
            )
        ;

    logical_expr =
        relational_expr
        >> *(   ("&&" > relational_expr     [op(op_and)])
            |   ("||" > relational_expr     [op(op_or)])
            )
        ;

    relational_expr =
        additive_expr
        >> *(   ("<=" > additive_expr       [op(op_lte)])
            |   ('<' > additive_expr        [op(op_lt)])
            |   (">=" > additive_expr       [op(op_gte)])
            |   ('>' > additive_expr        [op(op_gt)])
            )
        ;

    additive_expr =
        multiplicative_expr
        >> *(   ('+' > multiplicative_expr  [op(op_add)])
            |   ('-' > multiplicative_expr  [op(op_sub)])
            )
        ;

    multiplicative_expr =
        unary_expr
        >> *(   ('*' > unary_expr           [op(op_mul)])
            |   ('/' > unary_expr           [op(op_div)])
            )
        ;

    unary_expr =
            primary_expr
        |   ('!' > primary_expr             [op(op_not)])
        |   ('-' > primary_expr             [op(op_neg)])
        |   ('+' > primary_expr)
        ;

    primary_expr =
        uint_                               [op(op_int, _1)]
        |   variable
        |   function_call
        |   lit("true")                     [op(op_true)]
        |   lit("false")                    [op(op_false)]
        |   '(' > expr > ')'
        ;

    variable =
        (
            lexeme[
                vars
                >> !(alnum | '_')           // make sure we have whole words
            ]
        )                                   [op(op_load, _1)]
        ;

    function_call =
        functions                           [_a = _1]
        >>  '('
        >> -(
                expr                        [++_b]
                >> *(',' > expr             [++_b])
            )
        >   lit(')')                        [op(_a, _b, _pass)]
        ;

    expr.name("expression");
    equality_expr.name("equality-expression");
    relational_expr.name("relational-expression");
    logical_expr.name("logical-expression");
    additive_expr.name("additive-expression");
    multiplicative_expr.name("multiplicative-expression");
    unary_expr.name("unary-expression");
    primary_expr.name("primary-expression");
    variable.name("variable");
    function_call.name("function-call");

    on_error<fail>(expr, ::error_handler(_4, _3, _2)); // $$$ fix!
}

#endif
