Parser fuer Ausdruecke mit binaeren Operatoren
-
Hallo Leute!
Ich wuerde euch gerne meine Arbeit der letzten Stunden praesentieren. Urspruenglich wollte ich einen einfachen Matheparser bauen, stattdessen ist daraus aber ein Parser-Generator fuer binaere Operatoren geworden.

Hier ein Codebeispiel, wie man ihn verwendet:
typedef operator_table < operator_group < operator_left<'+', node_add>, operator_left<'-', node_sub> >, operator_group < operator_left<'*', node_mul>, operator_left<'/', node_div> >, operator_group < operator_right<'^', node_pow> > > operators; struct binary_operator_parser { static std::unique_ptr<node_base> parse(char const*& string) { // whitespace_skipper: Irgendwie selbsterklaerend. Legt fest, dass Leerzeichen uebersprungen werden. // primary_expression_parser: Der naechste, aufzurufende Parser. // operators: Die Operatorendefinition. return ::parse<whitespace_skipper, primary_expression_parser, operators>(string); } };operator_table fasst die Operatoren in einem Typ zusammen. Eine operator_group repraesentiert eine Gruppe von Operatoren mit der selben Prioritaet. operator_left bzw operator_right ist ein links/rechtsassoziativer Operator. Der erste Parameter ist das Symbol (derzeit nur ein einzelnes Zeichen moeglich), der zweite Parameter der Typ der entsprechenden AST-Node.
Hier ein vollstaendiges, kompilierbares Beispiel, inkl. Implementierung (Aus mehreren Dateien zusammengewuerfel, daher die Include-Guards): http://ideone.com/si1fy
Feedback waere supi

Gruessle,
Der Kellerautomat
-
Warum das Rad neu erfinden? Ich fand flex+bison immer ganz nett.
-
Oder boost::spirit

-
Am besten macht ein Mod den Thread einfach zu, wenn hier nichts brauchbares mehr kommt.
-
Schöner Code, gefällt mir.
