Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > by-pkgid > 87f956008f5479527bcce97ec30dbca7 > files > 190

fityk-debug-0.8.6-3mdv2009.1.i586.rpm

// This file is part of fityk program. Copyright (C) Marcin Wojdyr
// Licence: GNU General Public License version 2
// $Id: cmd2.h 400 2008-03-03 14:51:40Z wojdyr $

#ifndef FITYK__CMD2__H__
#define FITYK__CMD2__H__

/// 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
/// code here was originally part of datatrans.cpp (yes, .cpp)
///
/// this file is included only by datatrans*.cpp

#include <limits.h>
#include <boost/spirit/core.hpp>
#include <boost/spirit/actor/increment_actor.hpp>

#include "common.h"


using namespace boost::spirit;
class DataWithSum;

namespace cmdgram {

extern bool with_plus, deep_cp;
extern std::string t, t2, t3;
extern int tmp_int, tmp_int2, ds_pref;
extern double tmp_real, tmp_real2;
extern std::vector<std::string> vt, vr;
extern std::vector<int> vn, vds;
extern const int new_dataset;
extern const int all_datasets;
extern bool outdated_plot;
extern bool no_info_output;
extern std::string prepared_info;

std::vector<DataWithSum*> get_datasets_from_indata();

/// a part of command grammar 
struct IntRangeGrammar : public grammar<IntRangeGrammar>
{
    template <typename ScannerT>
    struct definition
    {
      definition(IntRangeGrammar const& /*self*/)
      {
          static const int zero = 0;
          static const int int_max = INT_MAX;

          t 
              = '[' >> (int_p[assign_a(tmp_int)] 
                       | eps_p[assign_a(tmp_int, zero)]
                       )
                    >> (':'
                        >> (int_p[assign_a(tmp_int2)] 
                           | eps_p[assign_a(tmp_int2, int_max)]
                           )
                        >> ']'
                       | ch_p(']')[assign_a(tmp_int2, tmp_int)]
                              [increment_a(tmp_int2)]//see assign_a error above
                       )  
              ;
      }
      rule<ScannerT> t;
      rule<ScannerT> const& start() const { return t; }
    };
};

extern IntRangeGrammar  IntRangeG;

struct CompactStrGrammar : public grammar<CompactStrGrammar>
{
    template <typename ScannerT>
    struct definition
    {
      definition(CompactStrGrammar const& /*self*/)
      {
          main 
            = lexeme_d['\'' >> (+~chset_p("'\n"))[assign_a(t)] 
                       >> '\'']
            | lexeme_d[+~chset_p(" \t\n\r;,#")] [assign_a(t)]
            ;
      }
      rule<ScannerT> main;
      rule<ScannerT> const& start() const { return main; }
    };
};

extern CompactStrGrammar CompactStrG;

} // namespace cmdgram


/// a part of command grammar
struct Cmd2Grammar : public grammar<Cmd2Grammar>
{
  template <typename ScannerT>
  struct definition
  {
    definition(Cmd2Grammar const& self);

    rule<ScannerT> transform, type_name, function_param, 
                   in_data, ds_prefix, 
                   dataset_handling, guess,
                   dataset_lhs, dataset_nr, 
                   optional_plus, 
                   plot_range, info_arg, statement;  

    rule<ScannerT> const& start() const { return statement; }
  };
};

extern Cmd2Grammar cmd2G;

#endif