Frage

Was ist der beste Weg, einen Parser in C ++ aus einer Datei mit Grammatik?

erstellen
War es hilfreich?

Lösung

Sie können auch einen Blick auf diese Links haben wollen:

Andere Tipps

Es hängt stark von der Grammatik. Ich neige dazu, Rekursiver Abstieg zu mögen, die in der Regel von Hand geschrieben werden (obwohl es möglich ist, eine aus einer Beschreibung der Grammatik zu erzeugen).

Wenn Sie vorhaben, einen Parser-Generator zu verwenden, gibt es wirklich zwei gute Möglichkeiten: byacc und Antlr. Wenn Sie wollen etwas, das (vernünftigerweise) kompatibel mit yacc ist, ist byacc (bei weitem) die beste Wahl. Wenn Sie von Anfang an fängst, keiner der beiden vorhandenen Code noch Erfahrung, die mit so etwas mit yacc kompatibel favorisiert, dann Antlr ist mit ziemlicher Sicherheit die beste Wahl.

Da es erwähnt worden ist, werde ich auch ein wenig über Bison sprechen. Ich würde vermeiden Bison wie die Pest, die es ist. Brooks Rat zu „Plan eines wegzuwerfen“ gilt auch hier. Robert Corbett (der Autor von byacc) schrieb Bison als seinen ersten Versuch an einem Parser-Generator. Leider gab er es GNU anstatt sie wegzuwerfen. In einem klassischen Fall von Marketing-technischen Exzellenz zu schlagen, ist Bison weit verbreitet (und sogar empfohlen, von denen, die es nicht besser wissen), während byacc relativ dunkel bleibt.

Edit: Ich hasse es zu tun, aber da es auch erwähnt worden ist, werde ich auch kommentieren Boost.Spirit. Während dies das coolste Beispiel Vorlage Meta-Programmierung sein um, hat es ein paar Probleme, die mich führen zu empfehlen vor dem Versuch, es zu ernsthaftem Einsatz zu bringen.

  1. Übersetzen mal mit ihm kann quälenden bekommen - 10 Minuten üblich ist, sowie eine größere / komplexere Grammatik kann sogar länger dauern (vorausgesetzt, es nicht den Compiler nicht abstürzen).
  2. Wenn Sie überhaupt einen Fehler machen, kann und wird häufig produzieren irrsinnig lange Fehlermeldungen, die praktisch unmöglich zu entziffern sind. Fehlermeldungen von Template-Code schwer sind notorisch schlecht sowieso, und Geist betont das System mehr als fast alles andere.

Glauben Sie mir: die Tatsache, dass Sie so etwas wie Geist überhaupt ist direkt an der Grenze zwischen eindrucksvollen und erstaunlich schreiben kann - aber ich würde es immer noch nur verwenden, wenn ich war sicher, dass die Grammatik ich es zu tun hatte mit war (und würde immer bleiben) ganz klein und einfach.

Es gibt flex und Bison . Lex & Yacc Vettern, die c ++ Existenz berücksichtigen tun.

Haben Sie sich Lex und Yacc ? Dazu ein Zitat aus dem Abschnitt 5 des verknüpften Dokuments:

  

Mein bevorzugter Weg, um ein C ++ Parser zu machen   zu haben, ist eine Ebene erzeugen Lex C   Datei und lassen YACC C ++ generieren   Code. Wenn Sie dann verknüpfen Sie Ihre   Anwendung können Sie in einige laufen   Probleme, weil die C ++ Code durch   Standard in der Lage, nicht C zu finden   Funktionen, es sei denn, Sie haben es gesagt, dass   diese Funktionen sind extern "C".

Ich habe verwendet Bison , die Beispiele gefunden genau das Richtige für mein Niveau. War in der Lage einen einfachen Rechner mit ihm natürlich zu schaffen, es viel mehr tun können.

Der Rechner hat 1 + 2 * 3 zum Beispiel und einen Syntaxbaum gebaut. Die Dokumentation nicht beschreiben, wie der Baum jedoch zu bauen und das hat mir eine wenig Zeit, um zu arbeiten.

Wenn ich noch einmal werde ich würde Blick in ‚antlr‘, wie es gut aussah und gut unterstützt.

Martin.

Der beste Weg, einen Parser zu erstellen, ist lex und yacc zu verwenden.

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