78 struct SystemParser : qi::grammar<Iterator, System(), Skipper>
82 SystemParser() : function_parser_(&encountered_symbols_),
84 SystemParser::base_type(root_rule_)
86 namespace phx = boost::phoenix;
94 using boost::spirit::lexeme;
97 declarative_symbols_.add(
"variable_group",0);
98 declarative_symbols_.add(
"hom_variable_group",1);
99 declarative_symbols_.add(
"variable",2);
100 declarative_symbols_.add(
"function",3);
101 declarative_symbols_.add(
"constant",4);
102 declarative_symbols_.add(
"parameter",5);
103 declarative_symbols_.add(
"implicit_parameter",6);
104 declarative_symbols_.add(
"pathvariable",7);
105 declarative_symbols_.add(
"random",8);
106 declarative_symbols_.add(
"random_real",9);
113 special_numbers_.add(
"pi",
node::Pi());
114 special_numbers_.add(
"Pi", special_numbers_.at(
"pi"));
116 special_numbers_.add(
"e",
node::E());
117 special_numbers_.add(
"E", special_numbers_.at(
"e"));
120 special_numbers_.add(
"i",
node::I());
121 special_numbers_.add(
"I", special_numbers_.at(
"i"));
125 encountered_symbols_.add(
"pi", special_numbers_.at(
"pi"));
126 encountered_symbols_.add(
"Pi", special_numbers_.at(
"pi"));
128 encountered_symbols_.add(
"e", special_numbers_.at(
"e"));
129 encountered_symbols_.add(
"E", special_numbers_.at(
"e"));
132 encountered_symbols_.add(
"i", special_numbers_.at(
"i"));
133 encountered_symbols_.add(
"I", special_numbers_.at(
"i"));
140 root_rule_.name(
"system_parsing");
169 variables_.name(
"variables_"); hom_variable_group_.name(
"hom_variable_group_"); variable_group_.name(
"variable_group_"); implicit_parameters_.name(
"implicit_parameters_");
172 variables_ =
"variable" > genericvargp_ >
';';
173 hom_variable_group_ =
"hom_variable_group" > genericvargp_ >
';';
174 variable_group_ =
"variable_group" > genericvargp_ >
';';
175 implicit_parameters_ =
"implicit_parameter" > genericvargp_ >
';';
179 path_variable_.name(
"path_variable_");
180 path_variable_ =
"pathvariable" > new_variable_ >
';';
184 genericvargp_.name(
"genericvargp_");
185 genericvargp_ = new_variable_ %
',';
187 new_variable_.name(
"new_variable_");
188 new_variable_ = unencountered_symbol_ [boost::phoenix::bind( [
this](Var & V, std::string str)
190 MakeAndAddVariable(V,str);
195 functions_.name(
"functions_"); constants_.name(
"constants_"); parameters_.name(
"parameters_");
197 functions_ =
"function" > genericfuncgp_ >
';';
198 constants_ =
"constant" > genericfuncgp_ >
';';
199 parameters_ =
"parameter" > genericfuncgp_ >
';';
202 genericfuncgp_.name(
"genericfuncgp_");
203 genericfuncgp_ = new_function_ %
',';
206 new_function_.name(
"new_function_");
207 new_function_ = unencountered_symbol_ [boost::phoenix::bind( [
this](Fn & F, std::string str)
209 MakeAndAddFunction(F,str);
216 unencountered_symbol_.name(
"unencountered_symbol_");
217 unencountered_symbol_ = valid_variable_name_ - lexeme[( declarative_symbols_ | encountered_symbols_ )];
224 valid_variable_name_.name(
"valid_variable_name_");
225 valid_variable_name_ = +qi::alpha >> *(qi::alnum | qi::char_(
"[]_") );
230 definition_.name(
"definition_");
231 definition_ = (encountered_functions_ >
'=' > function_parser_ >
';') [phx::bind( [](
const Fn & F,
const Nd & N)
239 subfunction_.name(
"subfunction");
240 subfunction_ = new_function_ [_a = _1] >
'=' >
241 function_parser_ [_val = _a, phx::bind( [](Fn & F,
const Nd & N)
288 using phx::construct;
289 using namespace qi::labels;
290 qi::on_error<qi::fail>
293 val(
"System parser could not complete parsing. Expecting ")<<
296 construct<std::string>(_3,_2)<<
309 qi::rule<Iterator,
System(), Skipper > root_rule_;
312 qi::rule<Iterator, VariableGroup(), Skipper > variable_group_, hom_variable_group_, variables_, implicit_parameters_;
313 qi::rule<Iterator, VariableGroup(), Skipper > genericvargp_;
315 qi::rule<Iterator, Var(), Skipper> path_variable_;
316 qi::rule<Iterator, Var()> new_variable_;
321 qi::rule<Iterator, std::vector<Fn>(), Skipper > functions_, constants_, parameters_;
322 qi::rule<Iterator, std::vector<Fn>(), Skipper > genericfuncgp_;
323 qi::rule<Iterator, Fn(), Skipper, qi::locals<Fn> > subfunction_;
325 qi::rule<Iterator, Fn()> new_function_;
328 qi::rule<Iterator, std::string()> unencountered_symbol_;
332 qi::rule<Iterator, std::string()> valid_variable_name_;
334 qi::rule<Iterator, Skipper, qi::unused_type> definition_;
337 qi::symbols<char,Nd> encountered_symbols_;
338 qi::symbols<char,int> declarative_symbols_;
339 qi::symbols<char,Fn> encountered_functions_;
340 qi::symbols<char,Nd> special_numbers_;
348 void MakeAndAddFunction(Fn & F, std::string str)
350 F = Function::Make(str);
351 encountered_symbols_.add(str, F);
352 encountered_functions_.add(str,F);
359 void MakeAndAddVariable(Var & V, std::string str)
361 V = Variable::Make(str);
362 encountered_symbols_.add(str, V);
366 void SetRootNode(Fn & F,
const Nd & N)