Was ist der beste Weg, einen Parser in C ++ aus einer Datei mit Grammatik zu erstellen?
Sie können sich auch diese Links ansehen:
Es hängt stark von der Grammatik ab. Ich mag rekursive Descent-Parser, die normalerweise von Hand geschrieben werden (obwohl es möglich ist, einen aus einer Beschreibung der Grammatik zu generieren).
Wenn Sie einen Parser-Generator verwenden, gibt es wirklich zwei gute Möglichkeiten: Byacc und Antlr. Wenn Sie etwas haben wollen, das mit yacc (einigermaßen) kompatibel ist, ist Byacc (bei weitem) Ihre beste Wahl. Wenn du von Anfang an beginnst, weder mit existierendem Code noch mit Erfahrung, die etwas mit yacc kompatibel macht, dann ist Antlr mit ziemlicher Sicherheit deine beste Wahl.
Da es erwähnt wurde, werde ich auch ein bisschen über Bison sprechen. Ich würde Bison wie die Pest vermeiden, die es ist. Brooks Ratschlag "Plan, einen wegzuwerfen" gilt hier. Robert Corbett (der Autor von Byacc) schrieb Bison als seinen ersten Versuch eines Parser-Generators. Leider hat er es GNU gegeben, anstatt es wegzuwerfen. In einem klassischen Fall von Marketing, der technische Spitzenleistungen schlägt, ist Bison weit verbreitet (und sogar empfohlen von denen, die es nicht besser wissen), während Byacc relativ unbekannt bleibt.
Edit: Ich hasse es zu tun, aber da es auch erwähnt wurde, werde ich auch auf Boost.spirit kommentieren. Während dies das coolste Beispiel für Template-Metaprogrammierung sein kann, hat es ein paar Probleme, die mich dazu bringen, zu empfehlen, es nicht ernst zu nehmen.
Haben Sie sich Lex und Yacc angesehen? Um aus Abschnitt 5 des verknüpften Dokuments zu zitieren:
Meine bevorzugte Methode, einen C ++ Parser zu erstellen Lex soll ein einfaches C erzeugen Datei, und YACC C ++ generieren lassen Code. Wenn Sie dann Ihren Link verknüpfen Anwendung, können Sie auf einige stoßen Probleme, weil der C ++ Code von Standard wird nicht in der Lage sein, C zu finden Funktionen, es sei denn, Sie haben es gesagt diese Funktionen sind extern "C".
Ich habe Bison verwendet, finde die Beispiele genau richtig für mein Level. Konnte damit einen einfachen Rechner erstellen, natürlich kann es noch viel mehr.
Der Rechner hat zB 1 + 2 * 3 genommen und einen Syntaxbaum erstellt. In der Dokumentation wurde jedoch nicht beschrieben, wie man den Baum erstellt, und das hat ein wenig Zeit gekostet, um zu trainieren.
Wenn ich wieder hingehen würde, würde ich mir 'antlr' ansehen, da es gut und gut unterstützt aussieht.
Martin.