Ich versuche, eine Grammatik für eine einfache Sprache zu schreiben, die eine linke Rekursion hat, aber ich verstehe nicht wirklich wie.
Im Grunde sieht meine Grammatik so aus:
expr: expr('@'TYPE)? '.' ID '(' (expr ',') ')'
| expr '+' expr
| ID
| INTEGER
| STRING
INTEGER : ('0'..'9')+;
STRING : '"' ('a'..'z' | 'A'..'Z' | '0'..'9')* '"';
TYPE : ('String' | 'Bool' | 'Int')
ID : ('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'9')*;
Es gibt noch mehr, aber das ist der wichtige Teil mit der linken Rekursion, die ich zu entfernen versuche.
Ich habe im Internet nach Wikipedia Ich habe darüber nachgedacht und bin zu folgendem Ergebnis gekommen:
expr: function
| add
| ID
| INTEGER
| STRING
function : ( ('@'TYPE)? '.' ID '(' (expr',')* ')' function)?;
add : (('+' expr) add)?;
Allerdings sagt antlr immer noch, dass es links rekursiv ist, und ich kann es nicht dazu bringen, die Sprache zu erkennen, die ich haben möchte. Kann mir jemand helfen und mir erklären, wie ich die linke Rekursion entfernen kann?