Orbiter 2022
Combinatorial Objects
expression_parser.h
Go to the documentation of this file.
1/*
2 * parser.h
3 *
4 * Created on: Feb 14, 2021
5 * Author: betten
6 */
7
8#ifndef SRC_LIB_FOUNDATIONS_EXPRESSION_PARSER_EXPRESSION_PARSER_H_
9#define SRC_LIB_FOUNDATIONS_EXPRESSION_PARSER_EXPRESSION_PARSER_H_
10
11
12
13namespace orbiter {
14namespace layer1_foundations {
15namespace expression_parser {
16
17
18// #############################################################################
19// expression_parser_domain.cpp
20// #############################################################################
21
22
23
25
27public:
32 std::string &name_of_formula,
33 std::string &formula_text,
34 std::string &managed_variables,
35 int f_evaluate,
36 std::string &parameters,
37 int verbose_level);
38 void evaluate(
40 std::string &formula_label,
41 std::string &parameters,
42 int verbose_level);
44 formula *F,
46 std::string &parameters,
47 int verbose_level);
48
49};
50
51
52
53
54
55// #############################################################################
56// expression_parser.cpp
57// #############################################################################
58
59
60
62
63
64
65
67
68
69
70 private:
71
72 lexer *Lexer;
73
74 public:
75
76 // symbol table - can be accessed directly (eg. to copy a batch in)
77 std::map<std::string, double> symbols_;
78
80
83
84
85 // access symbols with operator []
86 double & operator[] (std::string & key) { return symbols_ [key]; }
87
88
89
90 syntax_tree_node *Primary (int verbose_level,
91 int &f_single_literal, std::string &single_literal, int &f_has_seen_minus,
92 const bool get);
93 syntax_tree_node *Term (int verbose_level, const bool get);
94 syntax_tree_node *AddSubtract (int verbose_level, const bool get);
95 syntax_tree_node *Comparison (int verbose_level, const bool get);
96 syntax_tree_node *Expression (int verbose_level, const bool get);
97 syntax_tree_node *CommaList (int verbose_level, const bool get);
98 void parse(syntax_tree *tree, std::string & program, int verbose_level);
99
100};
101
102
103// #############################################################################
104// formula.cpp
105// #############################################################################
106
107
108
110
111
112
113
114class formula {
115
116
117public:
118
119 std::string name_of_formula;
121 std::string managed_variables;
122 std::string formula_text;
124
126
129
130
131 formula();
132 ~formula();
133 void print();
134 void init(std::string &label, std::string &label_tex,
135 std::string &managed_variables, std::string &formula_text,
136 int verbose_level);
138 syntax_tree_node **&Subtrees, int &nb_monomials,
139 int verbose_level);
141 syntax_tree_node **Subtrees, std::string &evaluate_text, int *Values,
142 int verbose_level);
143
144};
145
146
147// #############################################################################
148// lexer.cpp
149// #############################################################################
150
152
153
154
155class lexer {
156public:
157 std::string program_;
158
159 const char * pWord_;
160 const char * pWordStart_;
161 // last token parsed
163 std::string word_;
164 double value_;
166
167 lexer();
168 void print_token(std::ostream &ost, TokenType t);
169 void token_as_string(std::string &s, TokenType t);
170 TokenType GetToken (int verbose_level, const bool ignoreSign = false);
171 void create_text_token(std::string &txt);
172 void create_double_token(double dbl);
173 void CheckToken (TokenType wanted);
174
175};
176
177// #############################################################################
178// syntax_tree_node_terminal.cpp
179// #############################################################################
180
182
183
184
186public:
187 int f_int;
192 std::string value_text;
193
195 void print(std::ostream &ost);
196 void print_expression(std::ostream &ost);
197 void print_graphviz(std::ostream &ost);
198 int evaluate(std::map<std::string, std::string> &symbol_table,
199 field_theory::finite_field *F, int verbose_level);
200
201};
202
203
204
205// #############################################################################
206// syntax_tree_node.cpp
207// #############################################################################
208
209#define MAX_NODES_SYNTAX_TREE 1000
210
211
213
214
216public:
218 int idx;
219
222
224
227
230
232
235 void null();
237 syntax_tree_node **Subtrees, int verbose_level);
238 int is_homogeneous(int &degree, int verbose_level);
239 void print(std::ostream &ost);
240 int evaluate(std::map<std::string, std::string> &symbol_table,
241 field_theory::finite_field *F, int verbose_level);
242 void print_expression(std::ostream &ost);
243 void push_a_minus_sign();
244 void print_without_recursion(std::ostream &ost);
245 void export_graphviz(std::string &name, std::ostream &ost);
246 void export_graphviz_recursion(std::ostream &ost);
247};
248
249
250// #############################################################################
251// syntax_tree.cpp
252// #############################################################################
253
255
256
257
259public:
261 std::vector<std::string> managed_variables;
262
264
265 syntax_tree();
266 void print(std::ostream &ost);
267 void print_monomial(std::ostream &ost, int *monomial);
268 int identify_single_literal(std::string &single_literal);
269 int is_homogeneous(int &degree, int verbose_level);
271 syntax_tree_node **&Subtrees, int verbose_level);
272
273};
274
275
276
277
278
279
280
281}}}
282
283
284
285#endif /* SRC_LIB_FOUNDATIONS_EXPRESSION_PARSER_EXPRESSION_PARSER_H_ */
void parse_and_evaluate(field_theory::finite_field *F, std::string &name_of_formula, std::string &formula_text, std::string &managed_variables, int f_evaluate, std::string &parameters, int verbose_level)
int evaluate_formula(formula *F, field_theory::finite_field *Fq, std::string &parameters, int verbose_level)
void evaluate(field_theory::finite_field *Fq, std::string &formula_label, std::string &parameters, int verbose_level)
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)
void parse(syntax_tree *tree, std::string &program, int verbose_level)
syntax_tree_node * Expression(int verbose_level, const bool get)
syntax_tree_node * Comparison(int verbose_level, const bool get)
void evaluate(ring_theory::homogeneous_polynomial_domain *Poly, syntax_tree_node **Subtrees, std::string &evaluate_text, int *Values, int verbose_level)
Definition: formula.cpp:268
void init(std::string &label, std::string &label_tex, std::string &managed_variables, std::string &formula_text, int verbose_level)
Definition: formula.cpp:52
void get_subtrees(ring_theory::homogeneous_polynomial_domain *Poly, syntax_tree_node **&Subtrees, int &nb_monomials, int verbose_level)
Definition: formula.cpp:150
TokenType GetToken(int verbose_level, const bool ignoreSign=false)
Definition: lexer.cpp:124
void print_token(std::ostream &ost, TokenType t)
Definition: lexer.cpp:36
void token_as_string(std::string &s, TokenType t)
Definition: lexer.cpp:44
int evaluate(std::map< std::string, std::string > &symbol_table, field_theory::finite_field *F, int verbose_level)
int evaluate(std::map< std::string, std::string > &symbol_table, field_theory::finite_field *F, int verbose_level)
void split_by_monomials(ring_theory::homogeneous_polynomial_domain *Poly, syntax_tree_node **Subtrees, int verbose_level)
void export_graphviz(std::string &name, std::ostream &ost)
void split_by_monomials(ring_theory::homogeneous_polynomial_domain *Poly, syntax_tree_node **&Subtrees, int verbose_level)
Definition: syntax_tree.cpp:85
int is_homogeneous(int &degree, int verbose_level)
Definition: syntax_tree.cpp:61
void print_monomial(std::ostream &ost, int *monomial)
Definition: syntax_tree.cpp:33
int identify_single_literal(std::string &single_literal)
Definition: syntax_tree.cpp:47
homogeneous polynomials of a given degree in a given number of variables over a finite field GF(q)
Definition: ring_theory.h:88
#define MAX_NODES_SYNTAX_TREE
the orbiter library for the classification of combinatorial objects