// This file is part of fityk program. Copyright (C) Marcin Wojdyr
// Licence: GNU General Public License version 2
// $Id: datatrans3.cpp 264 2007-03-01 10:10:54Z wojdyr $

/// big grammars in Spirit take a lot of time and memory to compile
/// so they must be splitted into separate compilation units
/// that's the only reason why this file is not a part of datatrans.cpp

#include "datatrans3.h"
#include "datatrans4.h"
#include "datatrans2.h"
using namespace datatrans;


template <typename ScannerT>
DataE2Grammar::definition<ScannerT>::definition(DataE2Grammar const& /*self*/)
{
    index 
        =  ch_p('[') >> ( (ch_p('x') >> '=' >> DataExpressionG >> ch_p(']'))
                                                           [push_op(OP_x_IDX)]
                        | (DataExpressionG >> ch_p(']'))
                        )
        |  (!(ch_p('[') >> ']')) [push_op(OP_VAR_n)]
        ;

    //--------

    real_constant
        =  real_p [push_double()] 
        |  as_lower_d["pi"] [push_the_double(M_PI)]
        |  as_lower_d["true"] [push_the_double(1.)]
        |  as_lower_d["false"] [push_the_double(0.)]
#ifndef STANDALONE_DATATRANS
        |  VariableLhsG [push_var()]
        |  ((FunctionLhsG 
            | !lexeme_d['@' >> uint_p >> '.']
              >> ((str_p("F[")|"Z[") >> int_p >> ch_p(']')) 
            )
            >> lexeme_d['.' >> +(alnum_p|'_')])[push_func_param()]


#endif //not STANDALONE_DATATRANS
        ;

    parameterized_args
        =  ch_p('[') [push_op(OP_PLIST_BEGIN)]
            >> DataExpressionG % ch_p(',')[push_op(OP_PLIST_SEP)]
                >>  ch_p(']') [push_op(OP_PLIST_END)]
                    >> '(' >> DataExpressionG >> ')'
        ;

    real_variable 
        =  ("x" >> index) [push_op(OP_VAR_x)]
        |  ("y" >> index) [push_op(OP_VAR_y)]
        |  ("s" >> index) [push_op(OP_VAR_s)]
        |  ("a" >> index) [push_op(OP_VAR_a)]
        |  ("X" >> index) [push_op(OP_VAR_X)]
        |  ("Y" >> index) [push_op(OP_VAR_Y)]
        |  ("S" >> index) [push_op(OP_VAR_S)]
        |  ("A" >> index) [push_op(OP_VAR_A)]
        |  str_p("n") [push_op(OP_VAR_n)] 
        |  str_p("M") [push_op(OP_VAR_M)]
        ;

    aggregate_arg
        = '(' >> DataExpressionG 
          >> !(str_p("if") [push_op(OP_AGCONDITION)]
               >> DataExpressionG)
          >> ch_p(')') [push_op(OP_END_AGGREGATE)]
        ;

    rprec6 
        =   real_constant
        |   '(' >> DataExpressionG >> ')'
        |   DataExprFunG
            // `aggregate functions' will be refactored in replace_aggregates()
        |   as_lower_d["sum"] [push_op(OP_AGSUM)]
            >> aggregate_arg
        |   as_lower_d["min"] [push_op(OP_AGMIN)] //"min" is after "min2"
            >> aggregate_arg
        |   as_lower_d["max"] [push_op(OP_AGMAX)]
            >> aggregate_arg
        |   as_lower_d["avg"] [push_op(OP_AGAVG)]
            >> aggregate_arg
        |   as_lower_d["stddev"] [push_op(OP_AGSTDDEV)]
            >> aggregate_arg
        |   as_lower_d["darea"] [push_op(OP_AGAREA)]
            >> aggregate_arg
        |   (as_lower_d["interpolate"] >> parameterized_args)
                                          [parameterized_op(PF_INTERPOLATE)]
        |   (as_lower_d["spline"] >> parameterized_args)
                                          [parameterized_op(PF_SPLINE)]
        |   real_variable   //"s" is checked after "sin" and "sqrt"   
        ;
}

// explicit template instantiations 
template DataE2Grammar::definition<scanner<char const*, scanner_policies<skipper_iteration_policy<iteration_policy>, match_policy, no_actions_action_policy<action_policy> > > >::definition(DataE2Grammar const&);

template DataE2Grammar::definition<scanner<char const*, scanner_policies<skipper_iteration_policy<iteration_policy>, match_policy, no_actions_action_policy<no_actions_action_policy<action_policy> > > > >::definition(DataE2Grammar const&);

template DataE2Grammar::definition<scanner<char const*, scanner_policies<skipper_iteration_policy<iteration_policy>, match_policy, action_policy> > >::definition(DataE2Grammar const&);

DataE2Grammar DataE2G;




syntax highlighted by Code2HTML, v. 0.9.1