2009-03-30 12 views
7

Welcher Lexer/Parser-Generator ist der beste (am einfachsten zu verwenden, am schnellsten) für C oder C++? Ich benutze jetzt Flex und Bison, aber Bison behandelt nur LALR (1) Grammatiken. Die Sprache, die ich analysiere, ist nicht wirklich brauchen unbegrenzte Lookahead, aber unbegrenzte Lookahead würde das Parsen erleichtern viel einfacher. Soll ich Antlr ausprobieren? Coco/R? Elkhound? Etwas anderes?Lexer/Parser-Tools

+1

Was meinst du mit "am besten"? Sie müssen Ihre Frage präzisieren. –

+1

Was sind Ihre Anforderungen? Ist LALR (1) nicht ausreichend für Sie, und wenn ja, auf welche Weise? –

+0

Ich zweite Brians Frage. Was müssen Sie tun können? Wie ist LALR (1) unzureichend? –

Antwort

5

Aktualisiert 2015.01.05:

Meine ursprüngliche Antwort auf eine nun gelöscht Frage zeigt:

Es gibt ein paar gute Antworten auf diese Frage bereits in What parser generator do you recommend

Also habe ich die Liste der Artikel aus der deleted answer on archive.org mit mindestens 1 Stimme hier genommen:

Ich habe selbst mehrere Flex/Bison-Systeme gemacht, aber jetzt würde ich beide mit Lemon von sqlite ersetzen, da es ein Tool ist, eingängig und threadsicher sowie mit einem Streaming/Pull-basierten Modell.

+0

Lemon sieht wirklich gut aus, und ich konnte die Grammatik auf LALR (1) reduzieren, also könnte ich sie benutzen. – Zifre

+1

Die Programmierer bei stackoverflow benötigen eine Überprüfung in ihrem System, bevor sie Fragen löschen, um sicherzustellen, dass niemand darauf referenziert. Erinnerst du dich, was einige der Vorschläge waren? –

+0

Ich stimme zu, diese Antwort ist jetzt völlig nutzlos – paulm

0

Ich weiß nicht, was Sie genau suchen, aber ich denke, dass Boost-Xpressive bei ...

nicht gerade ein Parser-Generator, sondern ein großartiges Werkzeug, es Grammatiken zu handhaben und ich fühle mich suchen wert ist kann mit seltsamen umgehen.

0

Ich habe das GOLD-Analysesystem (http://www.devincook.com/goldparser) mit sehr guten Ergebnissen verwendet. Mein Projekt ist klein, ein Parsing-System für NC-Dateien in C. Aber ich denke, das Tool kann auch komplexere Projekte behandeln.

+1

GOLD scheint unter Linux nicht zu funktionieren. – Zifre

+0

Goldparser ist nett, aber es ist extrem langsam. Selbst in geschwindigkeitsoptimiertem C++ - Code dauert es 10 Sekunden, um 15000 Zeilen Code zu analysieren. Wenn Sie dies mit der Geschwindigkeit des PHP-Parsers vergleichen, ist das extrem langsam. – Elmue

3

Die schlechte Nachricht ist, dass die meisten echten Computersprachen nicht "LALR (1)" sind, was bedeutet, dass Sie auf beträchtliche Hacker zurückgreifen müssen, damit YACC echte Sprachen übersetzt.

Wenn Sie ein DSL entwerfen, können Sie alle LALR-Parser-Generatoren ohne große Probleme verwenden, gerade weil Sie die Grammatik Ihres DSL ändern können, wenn der Parser-Generator quäkelt. LL-Parser-Generatoren arbeiten meist auch hier aus dem gleichen Grund, aber der Mangel an linker Rekursion kann ein echter Schmerz sein.

Wenn Sie in der Art, wie Sie Ihre Syntax mögen, nicht kompromittieren, sind GLR-Parser hands-down Gewinner. Wir verwenden sie in der DMS Software Reengineering Toolkit und haben Parser für die Produktionsqualität für mehr als 30 Sprachen einschließlich C++ gebaut, die einen Volkssatz haben, der sagt, dass es fast unmöglich ist, ihn zu parsen. Das Volkstheorem wurde von Leuten gestartet, die LL- und LALR-Parser benutzten, um C++ zu benutzen. GLR macht es leicht.

0

Der neueste Bison behauptet, unbegrenzte Lookahead zu machen, indem er mehrere Paresen gleichzeitig macht. Wenn Sie bereits eine Investition in Bison haben, kann es sich lohnen, dies auszuprobieren, anstatt zu einem anderen Paket zu wechseln.

http://www.gnu.org/software/bison/manual/bison.html#GLR-Parsers

Ich habe diese Funktion selbst nicht verwendet, though.

Soweit andere Systeme gehen, habe ich ANTLR verwendet. Ich mochte es nicht besonders (die Dokumentation war nicht sehr gut, und man muss seine Grammatik manuell einteilen, um die Vorrangstellung des Operators zu gewährleisten), aber es hat funktioniert, und so viele schwören darauf, dass es sich lohnt, es anzuschauen.

+0

Ich habe versucht Bison GLR Parsing, aber es scheint einige Probleme mit Operator Vorrang zu verursachen und ist spürbar langsamer. ANTLR ist schwer zu verwenden mit C++ und ich bevorzuge LR über LL-Stil Grammatiken. – Zifre

1

ANTLR macht unbegrenzten Lookahead sehr einfach mit der Option 'Zurückverfolgen'. Es könnte auch Ihre "am einfachsten zu verwendenden, schnellsten" Kriterien qualifizieren, da es ANTLRWORKS enthält, mit denen Sie Ihre Grammatik visualisieren und debuggen können.

Ein weiterer Vorteil ist, dass das AST-Bauen mit seiner eingebauten Unterstützung für den Aufbau von ASTs, die im Bison fehlen, trivial ist.

Mit zwei Bücher veröffentlicht - "ANTLR: Definitive Guide" und "Language Design Patterns", ist es eines der sehr gut dokumentierten Tools zur Verfügung. Sie haben auch eine sehr aktive Mailing-Liste.

0

LRSTAR 6.4 kann LR (k) Parsing tun. Es ist ein C++ basiertes System, freundlich zu Windows und Visual Studio. Es erstellt tabellengesteuerte Parser ähnlich wie Bison. Es erzeugt auch tabellengesteuerte Lexer ähnlich wie "flex" und direkte Code-Lexer ähnlich wie "re2c". Die Geschwindigkeit des generierten Codes ist etwa doppelt so hoch wie die von "Bison" und "Flex".

Sie können die Skelett-Parser-Datei ändern und LRSTAR wird den Code wie Sie möchten generieren oder Sie können die Skelettdatei in einer anderen Sprache wie C# neu schreiben.

LRSTAR-Parser können automatisch einen AST erstellen. Es ist eine Open-Source-BSD-Lizenz. Benutzer verwenden es auf UNIX/Linux und MAC OS-Systemen nach dem Neukompilieren mit GCC.