2012-08-29 16 views
12

Ich habe lex/yacc verwendet und jetzt versuche ich auf ANTLR zu wechseln. Das Hauptproblem ist, dass ANTLR ein LL (*) Parser ist, anders als yacc, was LALR ist. Ich bin es gewohnt, von unten nach oben zu denken, und ich weiß nicht genau, was der Vorteil von LL-Grammatiken ist. Die Leute sagen, dass LL-Grammatiken heutzutage leichter zu verstehen und populärer sind. Aber es scheint, dass LR-Parser stärker sind, z.B. LL-Parser sind nicht in der Lage, mit Linksrekursionen umzugehen, obwohl es einige Problemumgehungen zu geben scheint.LALR vs LL Parser

Die Frage ist also, was ist der Vorteil von LL-Grammatiken gegenüber LALR? Ich würde es begrüßen, wenn mir jemand ein paar Beispiele geben könnte. Links zu nützlichen Artikeln wären auch toll.

Vielen Dank für Ihre Hilfe im Voraus!

(sehe ich eine große Ressource ist. What advantages do LL parsers have over LR parsers?, aber es wäre mit einigen Beispielen besser gewesen ist)

Antwort

9

Der größte Vorteil sehe ich Parser LL ist, dass sie so einfach zu verstehen und zu implementieren! Sie können recursive descent Parser mit Code schreiben, der eng mit der Grammatik übereinstimmt.

LR sind in der Regel stärker und auch viel schneller, aber es gibt ein paar Kompromisse in Betracht gezogen, die ich kenne:

  • LR-Parser nur synthetisierte Attribute verwenden können; Sie können geerbte Attribute nicht übergeben.
  • Aktionen in einer LR-Grammatik können zu einem Grammatik-Nichtdeterminismus führen, jedoch nicht in LL.

Allerdings werden Sie feststellen, dass LL (*) auch sehr mächtig sind.

+1

Wenn jemand Ihnen den Parser-Generator übergibt, ist per Definition "einfach zu implementieren". In diesem Fall wählen Sie den Parser-Generator, der problemlos die größte Klasse von Sprachen verarbeiten kann, um Ihren Aufwand zu minimieren. Aus der Perspektive, IMHO, LR gewinnt LL ziemlich handlich. GLR gewinnt LR ziemlich gut. –

+0

Ich stimme zu, aber dennoch LL sind immer noch einfach zu implementieren. Ich habe darauf hingewiesen, dass LR normalerweise ein Werkzeug benötigt. Ich finde es sehr faszinierend, dass du rekursive Abstammung schreiben kannst und der Code und die Grammatik Hand in Hand gehen. –

+3

Ja, seine faszinierenden Parser für People Building sollten über sie Bescheid wissen. Wenn Ihre Grammatiken groß werden, ist es unpraktisch, sie in LL-Form zu zwingen, und bei einer (ziemlich kleinen) Punkt-Annehmlichkeit gewinnt LR die konzeptuelle Einfachheit in Ihrem Kopf. LR ist ziemlich einfach zu verstehen, wenn Sie nicht den Parser-Generator erstellen, und es ist nicht so, dass es nicht viele von ihnen gibt. –

9

LR-Parser sind strikt leistungsfähiger als LL-Parser, und zusätzlich können LALR-Parser in O (n) wie LL-Parser laufen. Sie werden also keine funktionellen Vorteile von LL gegenüber LR finden. Der einzige Vorteil von LL besteht darin, dass LR-Zustandsautomaten ein wenig komplexer und schwer zu verstehen sind und LR-Parser selbst nicht besonders intuitiv sind. Auf der anderen Seite kann LL-Parser-Code, der automatisch generiert wird, sehr leicht zu verstehen und zu debuggen sein.

+0

Danke für die Meinung, DeadMG. –