144namespace layer1_foundations {
151typedef const double (*
ThreeArgFunction) (
const double arg1,
const double arg2,
const double arg3);
154static std::map<std::string, OneArgFunction> OneArgumentFunctions;
155static std::map<std::string, TwoArgFunction> TwoArgumentFunctions;
156static std::map<std::string, ThreeArgFunction> ThreeArgumentFunctions;
159#define STD_FUNCTION(arg) OneArgumentFunctions [#arg] = arg
161static int LoadOneArgumentFunctions ()
163 OneArgumentFunctions [
"abs"] = fabs;
185 OneArgumentFunctions [
"int"] = DoInt;
186 OneArgumentFunctions [
"rand"] = DoRandom;
187 OneArgumentFunctions [
"rand"] = DoRandom;
188 OneArgumentFunctions [
"percent"] = DoPercent;
193static int LoadTwoArgumentFunctions ()
196 TwoArgumentFunctions [
"min"] = DoMin;
197 TwoArgumentFunctions [
"max"] = DoMax;
198 TwoArgumentFunctions [
"mod"] = DoFmod;
199 TwoArgumentFunctions [
"pow"] = DoPow;
200 TwoArgumentFunctions [
"roll"] = DoRoll;
205static int LoadThreeArgumentFunctions ()
208 ThreeArgumentFunctions [
"if"] = DoIf;
219 symbols_ [
"pi"] = 3.1415926535897932385;
220 symbols_ [
"e"] = 2.7182818284590452354;
221 LoadOneArgumentFunctions ();
222 LoadTwoArgumentFunctions ();
223 LoadThreeArgumentFunctions ();
226expression_parser::~expression_parser()
234double expression_parser::Function(
int verbose_level, std::string &word)
236 int f_v = (verbose_level >= 1);
241 std::map<std::string, OneArgFunction>::const_iterator si;
242 si = OneArgumentFunctions.find (word);
243 if (si != OneArgumentFunctions.end ())
246 std::cout <<
"expression_parser::Primary one argument function" << std::endl;
250 Lexer.
GetToken (verbose_level,
true);
252 std::cout <<
"expression_parser::Primary one argument function done" << std::endl;
254 return si->second (v);
258 std::map<std::string, TwoArgFunction>::const_iterator di;
259 di = TwoArgumentFunctions.find (word);
260 if (di != TwoArgumentFunctions.end ())
263 std::cout <<
"expression_parser::Primary two argument function" << std::endl;
269 Lexer.
GetToken (verbose_level,
true);
271 std::cout <<
"expression_parser::Primary two argument function dibe" << std::endl;
273 return di->second (v1, v2);
277 std::map<std::string, ThreeArgFunction>::const_iterator ti;
278 ti = ThreeArgumentFunctions.find (word);
279 if (ti != ThreeArgumentFunctions.end ())
282 std::cout <<
"expression_parser::Primary three argument function" << std::endl;
290 Lexer.
GetToken (verbose_level,
true);
292 std::cout <<
"expression_parser::Primary three argument function done" << std::endl;
294 return ti->second (v1, v2, v3);
297 throw std::runtime_error (
"Function '" + word +
"' not implemented.");
304 int &f_single_literal, std::string &single_literal,
int &f_has_seen_minus,
const bool get)
306 int f_v = (verbose_level >= 1);
312 std::cout <<
"expression_parser::Primary" << std::endl;
314 f_single_literal =
false;
315 f_has_seen_minus =
false;
320 std::cout <<
"expression_parser::Primary opening node " << N->
idx << std::endl;
331 Lexer->
GetToken (verbose_level,
true);
333 std::cout <<
"expression_parser::Primary NUMBER " << v <<
" done" << std::endl;
341 std::string word = Lexer->
word_;
347 Lexer->
GetToken (verbose_level,
true);
355 f_single_literal =
true;
356 single_literal.assign(word);
370 std::cout <<
"Parser::Primary assignment" << std::endl;
374 throw std::runtime_error (
"Divide by zero");
382 std::cout <<
"expression_parser::Primary symbol " << word << std::endl;
392 std::cout <<
"expression_parser::Primary unary minus" << std::endl;
395 N =
Primary(verbose_level, f_single_literal, single_literal, f_has_seen_minus,
true);
396 if (f_has_seen_minus) {
397 std::cout <<
"expression_parser::Primary double minus" << std::endl;
400 f_has_seen_minus =
true;
407 std::cout <<
"expression_parser::Primary unary not" << std::endl;
409 f_single_literal =
true;
410 double val2 = (
Primary (verbose_level, f_single_literal, single_literal,
true) == 0.0) ? 1.0 : 0.0;
416 std::cout <<
"expression_parser::Primary left hand parenthesis, calling CommaList" << std::endl;
420 std::cout <<
"expression_parser::Primary left hand parenthesis, after CommaList" << std::endl;
423 Lexer->
GetToken (verbose_level,
true);
425 std::cout <<
"expression_parser::Primary left hand parenthesis done" << std::endl;
429 N1->
print(std::cout);
434 std::string remainder;
436 remainder.assign(Lexer->
pWord_);
437 throw std::runtime_error (
"Unexpected token: " + Lexer->
word_ +
" at " + remainder);
443syntax_tree_node *expression_parser::Term (
int verbose_level,
const bool get)
446 int f_v = (verbose_level >= 1);
447 int f_single_literal;
448 std::string single_literal;
452 int f_has_seen_minus;
453 int nb_minus_signs = 0;
456 std::cout <<
"expression_parser::Term" << std::endl;
464 N =
new syntax_tree_node;
468 std::cout <<
"expression_parser::Term opening node " << N->
idx << std::endl;
471 std::cout <<
"expression_parser::Term before Primary" << std::endl;
473 syntax_tree_node *left =
Primary (verbose_level, f_single_literal, single_literal, f_has_seen_minus, get);
474 if (f_has_seen_minus) {
478 std::cout <<
"expression_parser::Term after Primary, f_single_literal = " << f_single_literal << std::endl;
494 std::cout <<
"expression_parser::Term first descendant of " << N->
idx <<
" is node " << N->
Nodes[0]->
idx << std::endl;
503 std::cout <<
"expression_parser::Term MULTIPLY, calling Primary" << std::endl;
505 syntax_tree_node * N2;
506 N2 =
Primary (verbose_level, f_single_literal, single_literal, f_has_seen_minus,
true);
508 std::cout <<
"Parser::Term MULTIPLY, after Primary, f_single_literal=" << f_single_literal << std::endl;
510 if (f_has_seen_minus) {
514 if (f_single_literal) {
515 std::cout <<
"single_literal = " << single_literal << std::endl;
526 std::cout <<
"not a single_literal, N->nb_nodes=" << N->
nb_nodes << std::endl;
530 if (
ODD(nb_minus_signs)) {
540 std::cout <<
"expression_parser::Term DIVIDE, calling Primary" << std::endl;
542 double d =
Primary (verbose_level, f_single_literal, single_literal,
true);
544 std::cout <<
"expression_parser::Term DIVIDE, after Primary" << std::endl;
547 throw std::runtime_error (
"Divide by zero");
558 std::cout <<
"expression_parser::Term before return, ";
563 std::cout << std::endl;
569 std::cout <<
"expression_parser::Term done" << std::endl;
576 int f_v = (verbose_level >= 1);
577 int f_single_literal;
578 std::string single_literal;
582 int f_has_seen_minus;
583 int nb_minus_signs = 0;
586 std::cout <<
"expression_parser::Term" << std::endl;
596 std::cout <<
"expression_parser::Term opening node " << N->
idx << std::endl;
599 std::cout <<
"expression_parser::Term before Primary" << std::endl;
602 if (f_has_seen_minus) {
606 std::cout <<
"expression_parser::Term after Primary, f_single_literal = " << f_single_literal << std::endl;
610 if (f_single_literal) {
622 std::cout <<
"expression_parser::Term first descendant of " << N->
idx <<
" is node " << N->
Nodes[0]->
idx << std::endl;
627 switch (Lexer->
type_)
631 std::cout <<
"expression_parser::Term MULTIPLY, calling Primary" << std::endl;
634 N2 =
Primary (verbose_level, f_single_literal, single_literal, f_has_seen_minus,
true);
636 std::cout <<
"Parser::Term MULTIPLY, after Primary, f_single_literal=" << f_single_literal << std::endl;
638 if (f_has_seen_minus) {
642 if (f_single_literal) {
644 std::cout <<
"single_literal = " << single_literal << std::endl;
646 if (f_single_literal) {
657 std::cout <<
"not a single_literal, N->nb_nodes=" << N->
nb_nodes << std::endl;
662 if (
ODD(nb_minus_signs)) {
672 std::cout <<
"expression_parser::Term DIVIDE, calling Primary" << std::endl;
674 double d =
Primary (verbose_level, f_single_literal, single_literal,
true);
676 std::cout <<
"expression_parser::Term DIVIDE, after Primary" << std::endl;
679 throw std::runtime_error (
"Divide by zero");
688 std::cout <<
"expression_parser::Term before return ";
692 std::cout << std::endl;
693 std::cout <<
"expression_parser::Term created the following node:" << endl;
695 std::cout <<
"expression_parser::Term done" << endl;
701 std::cout <<
"expression_parser::Term done" << std::endl;
710 int f_v = (verbose_level >= 1);
714 std::cout <<
"expression_parser::AddSubtract" << std::endl;
720 std::cout <<
"expression_parser::AddSubtract opening node " << N->
idx << std::endl;
723 std::cout <<
"expression_parser::AddSubtract before Term" << std::endl;
729 std::cout <<
"expression_parser::AddSubtract after Term" << std::endl;
733 switch (Lexer->
type_)
737 std::cout <<
"expression_parser::AddSubtract PLUS before Term" << std::endl;
740 left =
Term (verbose_level,
true);
746 std::cout <<
"expression_parser::AddSubtract PLUS after Term" << std::endl;
751 std::cout <<
"expression_parser::AddSubtract MINUS before Term" << std::endl;
753 left =
Term (verbose_level,
true);
755 std::cout <<
"expression_parser::AddSubtract MINUS after Term" << std::endl;
761 std::cout <<
"expression_parser::AddSubtract pushing a minus" << std::endl;
768 std::cout <<
"expression_parser::AddSubtract before return" << std::endl;
777 std::cout <<
"expression_parser::AddSubtract done" << std::endl;
789 case LT: left = left <
AddSubtract (verbose_level,
true) ? 1.0 : 0.0;
break;
790 case GT: left = left >
AddSubtract (verbose_level,
true) ? 1.0 : 0.0;
break;
791 case LE: left = left <=
AddSubtract (verbose_level,
true) ? 1.0 : 0.0;
break;
792 case GE: left = left >=
AddSubtract (verbose_level,
true) ? 1.0 : 0.0;
break;
793 case EQ: left = left ==
AddSubtract (verbose_level,
true) ? 1.0 : 0.0;
break;
794 case NE: left = left !=
AddSubtract (verbose_level,
true) ? 1.0 : 0.0;
break;
795 default:
return left;
804 int f_v = (verbose_level >= 1);
808 std::cout <<
"expression_parser::Expression" << std::endl;
811 std::cout <<
"expression_parser::Expression before Comparison" << std::endl;
815 std::cout <<
"expression_parser::Expression after Comparison" << std::endl;
819 std::cout <<
"expression_parser::Expression after Comparison" << std::endl;
828 std::cout <<
"expression_parser::Expression AND before Comparison" << std::endl;
832 std::cout <<
"expression_parser::Expression AND after Comparison" << std::endl;
846 std::cout <<
"expression_parser::Expression OR before Comparison" << std::endl;
850 std::cout <<
"expression_parser::Expression OR after Comparison" << std::endl;
857 std::cout <<
"expression_parser::Expression before return" << std::endl;
865 std::cout <<
"expression_parser::Expression:" << std::endl;
875 int f_v = (verbose_level >= 1);
878 std::cout <<
"expression_parser::CommaList" << std::endl;
881 std::cout <<
"expression_parser::CommaList before Expression" << std::endl;
885 std::cout <<
"expression_parser::CommaList after Expression" << std::endl;
889 std::cout <<
"expression_parser::CommaList:" << std::endl;
900 std::cout <<
"expression_parser::CommaList COMMA, before Expression" << std::endl;
904 std::cout <<
"expression_parser::CommaList COMMA, after Expression" << std::endl;
909 std::cout <<
"expression_parser::CommaList done" << std::endl;
917void expression_parser::parse (
syntax_tree *tree, std::string & program,
int verbose_level)
919 int f_v = (verbose_level >= 1);
922 std::cout <<
"expression_parser::parse" << std::endl;
930 std::cout <<
"expression_parser::parse before CommaList" << std::endl;
934 std::cout <<
"expression_parser::parse after CommaList" << std::endl;
937 throw std::runtime_error (
"Unexpected text at end of expression: " + std::string (Lexer->
pWordStart_));
class to parse expressions
syntax_tree_node * CommaList(int verbose_level, const bool get)
syntax_tree_node * AddSubtract(int verbose_level, const bool get)
syntax_tree_node * Term(int verbose_level, const bool get)
syntax_tree_node * Primary(int verbose_level, int &f_single_literal, std::string &single_literal, int &f_has_seen_minus, const bool get)
syntax_tree_node * Expression(int verbose_level, const bool get)
syntax_tree_node * Comparison(int verbose_level, const bool get)
std::map< std::string, double > symbols_
lexical analysis of expressions
void CheckToken(TokenType wanted)
TokenType GetToken(int verbose_level, const bool ignoreSign=false)
syntax_tree_node_terminal * T
terminal note in the syntax tree of an expression
interior node in a syntax tree
void print(std::ostream &ost)
syntax_tree_node * Nodes[MAX_NODES_SYNTAX_TREE]
enum syntax_tree_node_operation_type type
void print_without_recursion(std::ostream &ost)
syntax_tree_node_terminal * T
the syntax tree of an expression
void print_monomial(std::ostream &ost, int *monomial)
int identify_single_literal(std::string &single_literal)
std::vector< std::string > managed_variables
#define STD_FUNCTION(arg)
#define Int_vec_zero(A, B)
const double(* TwoArgFunction)(const double arg1, const double arg2)
const double(* ThreeArgFunction)(const double arg1, const double arg2, const double arg3)
double(* OneArgFunction)(double arg)
the orbiter library for the classification of combinatorial objects