C ++ erstellt einen Parser [geschlossen]

8

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

    
Szymon Lipiński 03.12.2009, 22:37
quelle

6 Antworten

17

Sie können sich auch diese Links ansehen:

KeatsPeeks 03.12.2009, 22:38
quelle
9

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.

  1. Kompilierzeiten damit können unerträglich werden - 10 Minuten sind üblich, und eine größere / komplexere Grammatik kann noch länger dauern (vorausgesetzt, dass der Compiler nicht abstürzt).
  2. Wenn Sie überhaupt einen Fehler machen, kann und wird es wahnsinnig lange Fehlermeldungen erzeugen, die praktisch nicht zu entziffern sind. Fehlermeldungen von Vorlagen-schwerem Code sind sowieso notorisch schlecht, und Spirit betont das System mehr als fast alles andere.
Glauben Sie mir: Die Tatsache, dass Sie überhaupt etwas wie "Spirit" schreiben können, liegt direkt an der Grenze zwischen beeindruckend und erstaunlich - aber ich würde es immer noch benutzen, wenn ich sicher wäre, dass die Grammatik, mit der ich es zu tun hatte, es war immer bleiben) ganz klein und einfach.

    
Jerry Coffin 03.12.2009 22:59
quelle
8

Es gibt flex und Bison . Lex & amp; Yacc Cousins, die C ++ Existenz berücksichtigen.

    
Michael Krelin - hacker 03.12.2009 22:42
quelle
3

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".

    
Brian Agnew 03.12.2009 22:42
quelle
2

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.

    
martsbradley 03.12.2009 22:44
quelle
2

Der beste Weg, um einen Parser zu erstellen, ist die Verwendung von lex und yacc.

    
Dima 03.12.2009 22:42
quelle

Tags und Links