2 Stimmen

Wie entfernt man die linke Rekursion?

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X