C++ erstellen Sie eine parser
Was ist der beste Weg, um erstellen Sie einen parser in C++ aus einer Datei mit der Grammatik?
- In welchem format ist die 'Datei mit der Grammatik' in?
- stackoverflow.com/questions/1669/learning-to-write-a-compiler wird die kanonische Frage für wie zu auf-Compiler und-Interpreter hier in der Nähe. Viele gute verbindungen gibt. Für eine hand gebaut rekursive anständige Ansatz, Blick auf die Crenshaw tutorial.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielleicht möchten Sie auch, um einen Blick auf diese links:
boost::spirit
wenn Sie planen, einen compiler von jeder anständige Größe - compile-Zeiten für den Parser gebaut mitboost::spirit
tendenziell sehr groß, so dass selbst sehr kleine Veränderungen einer PITA (denn das ganze geschieht mit Vorlagen)Es hängt stark von der Grammatik. Ich Neige dazu, wie die recursive-descent-Parser, die normalerweise von hand geschrieben (wenn es möglich ist, zur Erzeugung einer aus einer Beschreibung der Grammatik).
Wenn Sie ein parser-generator, es gibt eigentlich zwei gute Möglichkeiten: Byacc und Antlr. Wenn Sie wollen etwas, das ist (halbwegs) kompatibel mit yacc, Byacc ist (mit Abstand) die beste Wahl. Wenn Sie beginnen, von Anfang an, mit keiner der vorhandenen code noch Erfahrungen, die er bevorzugt mit etwas kompatibel ist mit yacc, dann Antlr ist fast sicher Ihre beste Wette.
Da es schon erwähnt, ich werde auch reden ein bisschen über die Bisons. Ich möchte vermeiden, Bison wie die Pest, dass es ist. Brooks-Beratung "Plan to throw one away" gilt auch hier. Robert Corbett (Autor Byacc) schrieb Bison als sein Erster Versuch, ein parser-generator. Leider gab er es auf GNU, anstatt Sie wegzuwerfen. In einem klassischen Fall von marketing schlagen technische Exzellenz, Bison, ist weit verbreitet (und sogar empfohlen, durch diejenigen, die es nicht besser wissen), während Byacc bleibt relativ unklar.
Edit: ich hasse es zu tun, aber da ist es auch erwähnt worden, ich werde auch kommentieren, zu Steigern.Geist. Dies mag zwar der coolste Beispiel der template-meta-Programmierung herum, es hat ein paar Probleme, die mich führen, zu raten versuchen, um es für einen ernsthaften Gebrauch.
Glauben Sie mir: die Tatsache, dass Sie schreiben können, so etwas wie Geist überhaupt ist direkt an der Grenze zwischen beeindruckend und faszinierend-aber ich würde immer noch nur verwenden, wenn ich sicher war, die Grammatik, die ich zu tun hatte, war (und würde es immer bleiben) ganz klein und einfach.
Gibt es flex und bison. Lex&Yacc Vettern zu sich nehmen c++ - Existenz berücksichtigt.
Haben Sie sich Lex und Yacc ? Zitat aus Abschnitt 5 des verlinkten Dokuments:
Ich verwendet habe,bison, fand die Beispiele, die genau das richtige für mein Niveau. War in der Lage, erstellen Sie einen einfachen Rechner, mit dem es, natürlich, es kann noch viel mehr.
Den Rechner nahm 1+2*3 zum Beispiel und baute einen syntax-Baum. In der Dokumentation nicht beschrieben, wie bauen der Baum aber und das nahm mir ein wenig Zeit zu trainieren.
Wenn ich im Begriff war, wieder schaute ich mich in 'antlr', wie es gut aussah und gut unterstützt.
Martin.
Der beste Weg, um erstellen Sie einen parser ist die Verwendung von lex und yacc.