Einfache Algebra nach boost::spirit übersetzen
-
Hallo zusammen,
ich schreibe gerade einen einfachen Einheitenparser und habe mich dazu mal an boost::spirit gewagt.
Um eine simple Algebra für Multiplikation und Division meiner Klasse "Unit" zu unterstützen, würde ich gerne schreiben:qi::rule<Iterator, Unit()> unit; unit = (/*unit Produktionsregeln*/) | // unit Algebra ( '(' >> unit[_val = _1] >> ')' ) | ( unit[_val = _1] >> unit[_val *= _1] ) | ( unit[_val = _1] >> '/' >> unit[_val /= _1] );Leider geht das wegen left recursion (-> stack-overflow) nicht in spirit.
Wie bekomme ich das denn möglichst einfach nach spirit übersetzt?
Ich möchte wenn möglich keinen AST aufbauen, sondern die Einheiten direkt über deren überladene Operatoren verwursten.
-
Das ergibt doch garkeinen Sinn. Schreib mal die EBNF dazu auf. Irgendwo muss da ein int_ oder sowas vorkommen.
-
Kellerautomat schrieb:
Das ergibt doch garkeinen Sinn. Schreib mal die EBNF dazu auf. Irgendwo muss da ein int_ oder sowas vorkommen.
Ja richtig, ich habe zu viel gekürzt. Es gibt noch Produktionsregeln für die unit, die aber keine Rolle spielen. (EP editiert)
Die Frage ist, wie ich die Algebra in spirit abbilden kann.Edit:
Ok, habe es nun selber herausgefunden.
Es geht so:qi::rule<Iterator, Unit()> unit; qi::rule<Iterator, Unit()> unit_term; unit = (/* Produktionsregeln */) | ('(' >> unit_term[_val=_1] >> ')'); unit_term = unit[_val=_1] >> *( unit[_val*=_1] | ('/' >> unit[_val/=_1]) );