Update / Warnung: Diese Antwort ist möglicherweise veraltet!
Ein Hauptunterschied besteht darin, dass ANTLR einen LL (*) -Parser generiert, während YACC und Bison beide Parser generieren, die LALR sind. Dies ist eine wichtige Unterscheidung für eine Reihe von Anwendungen, wobei die Betreiber am offensichtlichsten sind:
expr ::= expr '+' expr
| expr '-' expr
| '(' expr ')'
| NUM ;
ANTLR ist völlig unfähig, diese Grammatik so zu behandeln, wie sie ist. Um ANTLR (oder einen anderen LL-Parser-Generator) zu verwenden, müssen Sie diese Grammatik in etwas konvertieren, das nicht linksrekursiv ist. Bison hat jedoch kein Problem mit Grammatiken dieser Form. Sie müssten '+' und '-' als linksassoziative Operatoren deklarieren, dies ist jedoch für die Linksrekursion nicht unbedingt erforderlich. Ein besseres Beispiel könnte der Versand sein:
expr ::= expr '.' ID '(' actuals ')' ;
actuals ::= actuals ',' expr | expr ;
Beachten Sie, dass sowohl die expr
als auch die actuals
Regeln linksrekursiv sind. Dies führt zu einem viel effizienteren AST, wenn es um die Codegenerierung geht, da mehrere Register und unnötiges Verschütten nicht erforderlich sind (ein nach links geneigter Baum kann reduziert werden, ein nach rechts geneigter Baum nicht).
In Bezug auf den persönlichen Geschmack denke ich, dass LALR-Grammatiken viel einfacher zu konstruieren und zu debuggen sind. Der Nachteil ist, dass Sie sich mit etwas kryptischen Fehlern wie Shift-Reduce und (der gefürchteten) Reduce-Reduce auseinandersetzen müssen. Dies sind Fehler, die Bison beim Generieren des Parsers abfängt, sodass sie die Endbenutzererfahrung nicht beeinträchtigen, aber den Entwicklungsprozess etwas interessanter machen können. ANTLR wird aus genau diesem Grund allgemein als einfacher zu verwenden angesehen als YACC / Bison.
Der wichtigste Unterschied zwischen YACC / Bison und ANTLR ist die Art der Grammatiken, die diese Tools verarbeiten können. YACC / Bison behandeln LALR-Grammatiken, ANTLR behandelt LL-Grammatiken.
Menschen, die lange Zeit mit LALR-Grammatiken gearbeitet haben, werden es oft schwieriger finden, mit LL-Grammatiken zu arbeiten und umgekehrt. Das bedeutet nicht, dass die Grammatiken oder Werkzeuge von Natur aus schwieriger zu bearbeiten sind. Welches Tool für Sie einfacher zu verwenden ist, hängt hauptsächlich von der Art der Grammatik ab.
In Bezug auf die Vorteile gibt es Aspekte, bei denen LALR-Grammatiken Vorteile gegenüber LL-Grammatiken haben, und es gibt andere Aspekte, bei denen LL-Grammatiken Vorteile gegenüber LALR-Grammatiken haben.
YACC / Bison generieren tabellengesteuerte Parser, was bedeutet, dass die "Verarbeitungslogik" in den Daten des Parserprogramms enthalten ist, nicht so sehr im Code des Parsers. Die Auszahlung ist, dass selbst ein Parser für eine sehr komplexe Sprache einen relativ kleinen Code-Footprint hat. Dies war in den 1960er und 1970er Jahren wichtiger, als die Hardware sehr begrenzt war. Tabellengesteuerte Parser-Generatoren gehen auf diese Zeit zurück und ein geringer Code-Footprint war damals eine Hauptanforderung.
ANTLR generiert rekursive Abstiegsparser, was bedeutet, dass die "Verarbeitungslogik" im Parsercode enthalten ist, da jede Produktionsregel der Grammatik durch eine Funktion im Parsercode dargestellt wird. Die Auszahlung ist, dass es einfacher ist zu verstehen, was der Parser tut, indem er seinen Code liest. Rekursive Abstiegsparser sind normalerweise schneller als tabellengesteuerte. Bei sehr komplexen Sprachen ist der Code-Footprint jedoch größer. Dies war in den 1960er und 1970er Jahren ein Problem. Damals wurden aufgrund von Hardwareeinschränkungen nur relativ kleine Sprachen wie beispielsweise Pascal auf diese Weise implementiert.
Von ANTLR generierte Parser befinden sich normalerweise in der Nähe von 10.000 Codezeilen und mehr. Handgeschriebene Parser rekursiver Abstammung befinden sich häufig im selben Stadion. Wirths Oberon-Compiler ist mit etwa 4000 Codezeilen einschließlich Codegenerierung vielleicht der kompakteste, aber Oberon ist eine sehr kompakte Sprache mit nur etwa 40 Produktionsregeln.
Wie bereits erwähnt, ist das grafische IDE-Tool ANTLRworks ein großes Plus für ANTLR. Es ist ein komplettes Labor für Grammatik- und Sprachdesign. Es visualisiert Ihre Grammatikregeln, während Sie sie eingeben, und wenn es Konflikte findet, zeigt es Ihnen grafisch, was der Konflikt ist und was ihn verursacht. Es kann sogar Konflikte wie Linksrekursion automatisch umgestalten und lösen. Sobald Sie eine konfliktfreie Grammatik haben, können Sie ANTLRworks eine Eingabedatei Ihrer Sprache analysieren lassen, einen Analysebaum und AST für Sie erstellen und den Baum grafisch in der IDE anzeigen. Dies ist ein sehr großer Vorteil, da Sie dadurch viele Stunden Arbeit sparen können: Sie werden konzeptionelle Fehler in Ihrem Sprachdesign finden, bevor Sie mit dem Codieren beginnen! Ich habe kein solches Tool für LALR-Grammatiken gefunden, anscheinend gibt es kein solches Tool.
Selbst für Leute, die ihre Parser nicht generieren, sondern von Hand codieren möchten, ist ANTLRworks ein großartiges Werkzeug für das Design / Prototyping von Sprachen. Möglicherweise das beste verfügbare Tool. Leider hilft Ihnen das nicht, wenn Sie LALR-Parser erstellen möchten. Der Wechsel von LALR zu LL, um ANTLRworks zu nutzen, mag sich lohnen, aber für manche Menschen kann der Wechsel von Grammatiktypen eine sehr schmerzhafte Erfahrung sein. Mit anderen Worten: YMMV.
quelle
Ein paar Vorteile für ANTLR:
Meine .02 $
quelle
Ein weiterer Vorteil von ANTRL ist, dass Sie ANTLRWORKS verwenden können , obwohl ich nicht sagen kann, dass dies ein strikter Vorteil ist, da es möglicherweise ähnliche Tools auch für andere Generatoren gibt.
quelle
Die Bison / Flex-Speichernutzung beträgt normalerweise etwa ein MByte. Vergleichen Sie dies mit antlr - vorausgesetzt, es verwendet 512 Byte Speicher für jedes Token in der Datei, die Sie analysieren möchten. 4 Millionen Token und Sie haben auf einem 32-Bit-System nicht mehr genügend virtuellen Speicher.
Wenn die Datei, die Sie analysieren möchten, groß ist, hat antlr möglicherweise nicht genügend Arbeitsspeicher. Wenn Sie also nur eine Konfigurationsdatei analysieren möchten, ist dies eine praktikable Lösung. Andernfalls versuchen Sie Bison, wenn Sie eine Datei mit vielen Daten analysieren möchten.
quelle