2013-05-13 7 views
11

Ungefähr einmal pro Jahr muss ich eine Grammatik und einen Parser entwickeln oder zumindest entwerfen - das scheint eine Konstante meines Arbeitslebens zu sein.Gründe für die Verwendung von Lex/Yacc-Alternativen?

Jedes Mal, wenn ich mit dieser Aufgabe konfrontiert bin, also etwa ein Jahr, überlege ich, ziemlich lex/yacc (flex/bison), Alternativen für plain lex/yacc und nach einigen Nachdenkend und versuchend, komme ich zurück zu schlichtem lex/yacc.

Weil ich einen CORBA-Server an der Nabe der Anwendung, die ich in von von einem Parser in fast jeder Sprache geschrieben nennen kann, so dass in dieser Zeit hatte ich einen Blick auf

  • antlr4 (Java) und antlr3 (Java hat aber RT für andere Sprachen),
  • SableCC (Java),
  • Parse :: EBNF, Parse :: Yapp und Marpa (Perl),
  • und SimpleParse (Python),

Für mich war das Tandem antlr4 mit antlrworks der aussichtsreichste Kandidat, aber ich bin noch nicht davon überzeugt, dass die Zeit, die man damit verbringen wird, amortisiert wird.

Die Grammatik, die ich entwickeln muss, ist ähnlich zu SQL DDL (in Bezug auf die Struktur, nicht in Bezug auf das Thema).

Warum würde irgendeine der Alternativen meine Aufgabe einfacher machen als die Verwendung von einfachem Lex/Yacc?

+0

Ich denke, das ist eine Frage wie "welche Programmiersprache soll ich verwenden?", Die kaum die Art der sachlichen objektiven Antwort anzieht, die SO fördert. So abgestimmt, um als nicht konstruktiv zu schließen. Die Frage für Sie ist jedoch: Was ist mit Lex/Flex/Yacc/Bison, die Sie nicht zufriedenstellend finden? Das würde dir zumindest einen Hinweis geben, welche Features du suchst. Wenn es nur "Ich möchte etwas Neues ausprobieren", dann drehen Sie eine Münze :) – rici

+0

Es ist nicht vergleichbar. Wenn alle Generatoren den gleichen Parser erzeugen würden, würde ich zustimmen, aber das Ergebnis ist je nach Parser-Generator völlig anders. –

Antwort

9

Was Sie auch beachten sollten, ist, dass verschiedene Parser-Generatoren ganz andere Parser erzeugen. Yacc/bison generieren Bottom-up-Parser, die oft schwer zu verstehen sind, schwer zu debuggen sind und seltsame Fehlermeldungen enthalten. ANTLR erzeugt zum Beispiel einen rekursiven Sinkflug-Top-Down-Parser, der einfacher zu verstehen ist, Sie können ihn leicht debuggen (es sei denn, Sie haben einen 35MB-Lexer wie ich), Sie können nur Subregeln für eine Analyseoperation verwenden (zB nur Parsen von Ausdrücken anstelle der vollständigen Sprache).

Darüber hinaus ist seine Fehlerbeseitigung viel besser und verursacht viel sauberere Fehler. Es gibt ANTLRWorks, eine großartige plattformübergreifende Anwendung zum Entwickeln und Debuggen Ihrer Grammatik (nur debuggen, wenn Sie ein Java-Ziel verwenden). Apropos Ziele: Sie können Parser in verschiedenen Sprachen (C, C++, C#, Java und mehr) aus derselben Grammatik generieren, sofern Sie keine sprachspezifischen Aktionen in Ihrer Grammatik haben (Sie haben dies bereits in Ihrer Frage erwähnt). Und während wir von Aktionen sprechen: Aufgrund des Bewertungsprinzips im unteren Parser (Shift-Token, Shift-Token, reduziere sie zu einem neuen Token und verschiebe es etc.) können Aktionen dort leicht Probleme verursachen, z. mehr als einmal und so auszuführen. Nicht so bei Parsern, die von ANTLR generiert wurden.

Ich habe auch im Laufe der Jahre verschiedene Parser-Generatoren ausprobiert, sogar selbst geschrieben, aber ich würde jederzeit ANTLR als Werkzeug der Wahl empfehlen.

+0

Ausgezeichnete Antwort, vielen Dank. – Solkar

5

Die latest Marpa is Marpa::R2, die große Verbesserungen in "whipituptude" hat, einschließlich a very convenient new DSL interface, die selbst in Marpa geschrieben wird. Sie könnten in Betracht ziehen, mit Marpa zu beginnen, für "Prototyping". Marpa ist stark deklarativ und verwendet sauberes BNF. Wenn Sie migrieren, können Sie den größten Teil Ihrer Arbeit für den neuen Parser übernehmen. Marpa ist in seiner Fehlerbehandlung und -erkennung unübertroffen, auch in einer Prototyping-Phase sehr praktisch.

Marpa analysiert alle Grammatikklassen, die von den anderen in linearer Zeit aufgeführten Parsern analysiert wurden, und ist in seiner Flexibilität unübertroffen. Mit der neuesten Funktion können Sie von Marpa zu Ihrem eigenen Parsing-Code wechseln. Sie könnten also sogar bleiben. Es gibt a website, und mein Blog hat a series of tutorials, was der beste Weg sein könnte, um Marpa kennenzulernen.

+0

Danke für Ihre ausführliche Antwort, Jeffrey! Pls. Betrachten Sie SQL DDL als ein Beispiel. Warum genau sollte Marpa besser als lex & yacc damit? – Solkar

+0

Mit Marpa geben Sie einfach BNF (amy BNF) ein und es läuft. Da du mit Yacc erfahren bist, weißt du mit LALR, dass es nicht so einfach ist. Marpa weiß und kann jederzeit genau berichten, wo es sich befindet, was Fehlererkennung, Debugging und Wartung wesentlich erleichtert. –

+0

Aktuelle SQL (oder Subset) Implementierungen in Marpa sind proprietär (leider), aber ein Fragment von einem ist in der Testsuite. –

Verwandte Themen