Antlr-Frage 2



  • Ich versuche mit Hilfe ovn Antlr einen einfachen Expression-Parser zu schreiben.
    Mein bsiheriger Ansatz sieht so aus:

    grammar MyExpr;
    
    input: (expr NEWLINE)+;
    
    expr: functionCall
        | ID
    	| booleanExpression
        | arithmeticExpression;
    
    booleanExpression: '(' booleanExpression ')' 
    	             |'not' booleanExpression
    				 | booleanExpression ('or' | 'xor') booleanExpression
                     | booleanExpression ('and') booleanExpression
                     | arithmeticExpression ('==') arithmeticExpression
                     | functionCall
                     | ID
                     | 'true'
                     | 'false';
    
    arithmeticExpression: '(' arithmeticExpression ')'
                        | '-' arithmeticExpression
    					| <assoc = right> arithmeticExpression '^' arithmeticExpression
                        | arithmeticExpression ('*' | '/') arithmeticExpression
    					| arithmeticExpression ('+' | '-') arithmeticExpression
    					| functionCall
    					| ID
                        | INT;
    
    expressionList: expr (',' expr)*;
    
    functionCall: ID '(' expressionList ')'; 
    
    INT: DIGIT+;
    
    ID: LETTER+ ( LETTER | DIGIT )+;
    
    fragment LETTER : [a-zA-Z];
    fragment DIGIT: [0-9];
    NEWLINE : '\r'? '\n';
    

    Was mir hier auffällt, ist dass ich Bausteine wie ID oder später auch Array-Referenzierungen in allen Regeln expr , bool, arithmetic haben muss.

    Um das zu umgehen, müsste ich alles in die Regel expr reinpacken, was ginge.
    Andererseits gefäält mir der etwas modularere Aufbau ganz gut und ich würde gerne versuchen zwischen arithmetischen und boolschen AUsdrücken unterscheiden zu können.

    Kann mir jemand dazu einen Tipp geben?


Anmelden zum Antworten