Frage

Wie rekursive Aufstieg Parser arbeiten? Ich habe eine rekursive Abstiegs Parser selbst geschrieben, aber ich verstehe nicht, LR alles gut-Parser. Was ich href="http://en.wikipedia.org/wiki/Recursive_ascent_parser" auf Wikipedia hat meine Verwirrung nur hinzugefügt.

Eine andere Frage ist, warum rekursive Aufstieg Parsern nicht mehr als ihre tabellenbasierten Pendants verwendet werden. Es scheint, dass rekursive Aufstieg Parser mehr Leistung insgesamt haben.

War es hilfreich?

Lösung

Das clasical Drachen Buch sehr gut erklärt, wie LR Arbeit-Parser. Es gibt auch Parsingtechniken. A Practical Guide. wo Sie sie lesen können, wenn ich mich gut erinnere. Der Artikel in wikipedia (zumindest die Einführung) ist nicht richtig. Sie wurden von Donald Knuth, erstellt und erklärt er sich in seiner The Art of Computer Programming Band 5. Wenn Sie Spanisch verstehen, gibt es eine vollständige Liste der Bücher hier von mir geschrieben. Nicht alle, dass Bücher in Spanisch sind, auch nicht.

Bevor zu verstehen, wie sie funktionieren, müssen Sie ein paar Begriffe wie zuerst verstehen, folgt und Look-Ahead. Außerdem empfehle ich Ihnen wirklich die Konzepte hinter LL (Nachkomme) Parser, bevor Sie versuchen LR (aufsteigend) Parsern zu verstehen, zu verstehen.

Es gibt eine Familie von Parsern LR, speziell LR (K), SLR (K) und LALR (K), wobei K wie viele Look-Ahead sie arbeiten müssen. Yacc unterstützt LALR (1) Parser, aber Sie können Änderungen vornehmen, nicht Theorie basiert, um es mit leistungsfähigeren Art von Grammatiken arbeitet zu machen.

über Leistung, hängt es von der Grammatik analysiert. Sie führen in der linearen Zeit, aber wie viele Raum, den sie benötigen, hängt davon ab, wie viele Staaten bauen Sie für den letzten Parser.

Andere Tipps

Ich persönlich eine harte Zeit zu verstehen, wie ein Funktionsaufruf schneller sein kann - viel weniger „deutlich schneller“ als eine Lookup-Tabelle. Und ich vermute, dass auch „deutlich schneller“ unbedeutend ist im Vergleich zu alles andere, dass ein Lexer / Parser (in erster Linie des Lesen und Zeichenüber die Datei) zu tun hat. Ich schaute auf der Wikipedia-Seite, aber nicht den Referenzen folgen; hat der Autor tatsächlich ein komplettes Lexer / Parser Profil?

Mehr interessant für mich ist der Rückgang des tabellengesteuerte Parsers in Bezug auf rekursive Abstieg. I kommt aus einem C Hintergrund, wo yacc (oder gleichwertig) der Parser-Generator der Wahl war. Als ich nach Java bewegte, fand ich eine tabellengesteuerte Implementierung (JavaCup) und mehr rekursiven Abstiegs-Implementierungen (JavaCC, ANTLR).

Ich vermute, dass die Antwort auf die Antwort von „warum Java anstelle von C“ ähnlich ist: eine hohe Ausführungsgeschwindigkeit als die Geschwindigkeit der Entwicklung ist nicht so wichtig. Wie in dem Artikel Wikipedia erwähnt, tabellengesteuerte Parser sind ziemlich unmöglich, von Code zu verstehen (zurück, wenn ich sie benutze, konnte ich ihre Taten folgen, aber habe nie die Grammatik von dem Parser rekonstruieren konnte). Rekursiven Abstieg im Vergleich dazu ist sehr intuitiv (was ohne Zweifel ist, warum es tabellengesteuert von etwa 20 Jahren früher).

Den Wikipedia-Artikel über rekursive Aufstieg Parsing Referenzen, was das ursprüngliche Papier auf dem Thema zu sein scheint ( "Very Fast LR Parsing"). Skimming, dass das Papier ein paar Dinge für mich klären. Dinge, die ich bemerkt:

  1. Das Papier spricht über Assembler-Code zu erzeugen. Ich frage mich, wenn Sie die gleichen Dinge tun, was sie tun können, wenn Sie C oder Java-Code sind zu erzeugen, statt; siehe Abschnitte 4 und 5, „Fehlerbehebung“ und „Stack-Überlauf checking“. (Ich versuche nicht, ihre Technik FUD - es könnte gut funktionieren out -. Nur sagen, dass es etwas, was Sie wollen vielleicht prüfen, bevor sie sich)

  2. Sie vergleichen ihre rekursive Aufstieg Werkzeug, um ihre eigenen tabellengesteuerte Parser. Aus der Beschreibung in ihren Ergebnissen Abschnitt, es sieht aus wie ihre tabellengesteuerte Parser „vollständig interpretiert“; es erfordert keinen benutzerdefinierten generierten Code. Ich frage mich, ob es ein Mittelweg, wo die Gesamtstruktur noch tabellengesteuert ist, aber Sie benutzerdefinierten Code für bestimmte Aktionen erzeugen die Dinge zu beschleunigen.

Das Papier von der Wikipedia-Seite verwiesen:

Ein weiteres Papier über die Verwendung von Code-Generierung statt Tabelleninterpretation:

Beachten Sie auch, dass rekursiv absteigendes Parsing ist nicht der schnellste Weg, LL-Grammatik-basierten Sprachen zu analysieren:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top