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. 🙂


Anmelden zum Antworten