2016-05-17 5 views
0

Ein Auszug meiner ANTLR v4 Grammatik sieht wie folgt aus:Einer komme alternative

expression: 
    | expression BINARY_OPERATOR expression 
    | unaryExpression 
    | nularExpression 
; 
unaryExpression: 
    ID expression 
; 

nularExpression: 
    ID 
    | NUMBER 
    | STRING 
; 

Mein Ziel ist es, die Sprache entsprechen alle notwendigen Schlüsselwörter ohne zu wissen, und deshalb bin ich einfach Schlüsselwörter als IDs entsprechen.
Allerdings gibt es binäre Operatoren, die ein Argument auf beiden Seiten des Keywords (z. B. Stichwort) nehmen und daher "spezielle Behandlung" benötigen. Wie Sie sehen können, habe ich diese "spezielle Behandlung" bereits in die expression Regel aufgenommen.

Das eigentliche Problem besteht nun darin, dass einige dieser binären Operatoren als unäre Operatoren (= normale Schlüsselwörter) verwendet werden können, was bedeutet, dass das linke Argument nicht angegeben werden muss.
Die obige Grammatik kann diesen Fall nicht ertragen, weil jedes Mal, wenn ich versuchte, dies zu implementieren, ich jeden binären Operator als unären Operator verbraucht habe.

Beispiel:
des count Nehmen wir an, ist ein binärer Operator.
Mögliche Syntaxen sind <arg1> count <arg2> und count <arg>

meine Versuche Alle oben genannten Fall Gruppierung wie (myArgument (count (otherArgument))) statt (myArgument) count (otherArgument)


Mein Gehirn tellsme endete zu implementieren, dass die Lösung für dieses Problem den Parser zu sagen ist, immer zwei Argumente für einen binären Operator zu nehmen, und wenn dies fehlschlägt, sollte es versuchen, den binären Operator als einen unären zu verwenden.
Weiß jemand, wie man das erreicht?

Antwort

0

Wie wäre es etwa so:

lower_precedence_expression 
: ID higher_precedence_expression 
| higher_precedence_expression 
; 

higher_precedence_expression 
: higher_precedence_expression ID lower_precedence_expression 
| ID 
| NUMBER 
| STRING 
; 

?