2016-08-08 38 views
0

bereitete ich eine Grammatik für eine Mini-Sprache, die ich zu schaffen bin, aber ich bin einen gegenseitigen linken Rekursionsfehlers zwischen var und functioncallAntlr4 gegenseitige Linksrekursion Fehler

var 
: NAME 
| var '[' exp ']' 
| var '.' var 
| functioncall '.' var 
; 
functioncall 
: NAME '(' (exp)? (',' exp)* ')' 
| var '.' functioncall 
| functioncall '.' functioncall 
; 

speziell auf var : functioncall '.' functioncall und functioncall : var '.' functioncall bekommen, die grundsätzlich zu somefunction().var entspricht und instanceofClass.function().

Gibt es eine Möglichkeit, dies zu erreichen?

Edit: Grammatik sollte auch so etwas wie var '=' exp ermöglichen, wo var instance.var oder function().var sein kann

Antwort

2

Antlr 4 (und nicht davor) beidseitiges Rekursion in derselben Regel umgehen kann. So etwas wie

expr: expr '+' expr | NUMBER 

ist gültig.

Wir können also eine weitere neue Regel erstellen, um entweder einen var- oder einen Funktionsaufruf zu abstrahieren.

value 
: var 
| functioncall 
| value '.' value 
; 

var 
: NAME 
| var '[' exp ']' 
; 

functioncall 
: NAME '(' exp? (',' exp)* ')' 
; 

Nicht nur die Grammatik ist einfacher zu parsen (für menschliche Leser), aber jetzt haben Sie keine gegenseitige Rekursion.

Hinweis: ungetestet.

+0

Diese Grammatik funktioniert in den meisten Fällen außer einem. Die Sprache soll auch einen einfachen Funktionsaufruf ermöglichen, d. H. Eine Zeile, die einfach einen Funktionsaufruf enthält. Aber es ist nicht erlaubt, eine Variable in einer einzelnen Zeile zuzulassen, d.h. eine Zeile, die nur 'instance.function() 'enthält, ist gültig, aber' variable 'ist nicht gültig. Früher habe ich dies zugelassen, indem ich keine einzelne Variable in einer Zeile zugelassen habe. Irgendein Weg, dies zu erreichen? – Crimson7

+0

@Nick_McCoy verbessern Sie einfach die 'value: var' Regel um die notwendige Syntax hinzuzufügen, wie' value: var '.' Wert ". – Mephy

+0

das wird nicht so etwas wie var '=' exp erlauben. Lies auch meinen bearbeiteten Kommentar – Crimson7