Könnte mir bitte jemand erklären, warum Recursive-Descent-Parser nicht mit einer Grammatik arbeiten können, die Linksrekursion enthält?Warum kann ein Recursive-Descent-Parser keine linke Rekursion behandeln?
19
A
Antwort
27
betrachten:
A ::= A B
der entsprechende Code
boolean A() {
if (A()) {
return B();
}
return false;
}
ist die unendliche Rekursion sehen?
16
Denn wer interessiert
A ::= A B | A C | D | E
kann wie folgt umgeschrieben werden:
A ::= (D | E) (B | C)*
Die allgemeine Form der Transformation ist: eine der nicht links rekursive Disjunktionen von einer beliebigen Anzahl von links gefolgt Rekursive Disjunkte ohne das erste Element.
Die Reform des Action-Code ist ein bisschen Trickery, aber ich denke, dass Plug-n-Tuck auch sein kann.
Verwandte Themen
- 1. Warum unterstützt OpenCL keine Rekursion?
- 2. Linke Rekursion und rechte Rekursion erzeugen denselben Syntaxbaum oder nicht?
- 3. Parsing boolean Ausdruck ohne linke Hand Rekursion
- 4. Wie diese Linke Rekursion für LL Parser zu beseitigen ist
- 5. ControllerAdvice keine Ausnahme behandeln
- 6. Warum funktioniert Rekursion nicht?
- 7. Python-Rekursion mit Liste gibt keine zurück
- 8. Wie kann ich die linke Rekursion in der folgenden Grammatik eliminieren?
- 9. Warum kann keine Zuweisungsanweisung
- 10. Warum fällt meine Rekursion durch?
- 11. Kann ein ASP.NET HttpHandler ein http 400 - Bad Request behandeln?
- 12. konvertieren Rekursion zu 'Tail-Rekursion'
- 13. Warum passiert hier eine Rekursion?
- 14. ActiveScaffold gibt Stack zu tief Fehler; kann keine Rekursion finden
- 15. kann ich ein Flowlayoutpanel wie ein Listenfeld behandeln
- 16. Warum kann die linke Seite einer Zuweisung kein Inkrementausdruck sein?
- 17. Keine Aktivität Absicht behandeln action.dial
- 18. G ++ Compiler wird keine Rekursion erlauben?
- 19. Was ist und ist keine Rekursion?
- 20. Suche nach stark verbundenen Komponenten - keine Rekursion
- 21. StackOverFlowException - aber oviously KEINE Rekursion/Endlosschleife
- 22. Warum "requestAnimationFrame" Rekursion wird nicht RAM auffressen?
- 23. Warum "requestAnimationFrame" Rekursion wird nicht RAM auffressen?
- 24. Sql Rekursion ohne Rekursion
- 25. Warum Javascript eine Zahl behandeln, als ein Zweierkomplement
- 26. Warum heißt es "offene (oder geschlossene) Rekursion?
- 27. Warum kann ein Ausdrucksbaum keine benannte Argumentspezifikation enthalten?
- 28. Warum erfasst das Signal "linkClicked (const QUrl &)" keine QUrl für die linke Maustaste?
- 29. Rekursion lösen
- 30. Warum Python-Rekursion zurückgeben Keiner Wert
Zum ersten Mal sah ich Ratschläge, ein neues Nicht-Terminal zu verwenden, normalerweise A ' –
Nun, einige BNF-basierte Tools erlauben keine() Gruppen, so dass Sie mit der neuen Regellösung stecken bleiben . Ich bin ein bisschen zu der Form, die ich vorgeschlagen habe, weil mein Parser-Generator auch die Aktionstransformation ausführen muss, so dass es viel einfacher ist, es ohne eine neue Regel arbeiten zu lassen. – BCS
Das beantwortet die Frage nicht wirklich. Wäre besser als Kommentar. –