Ausdrucksgrammatik analysieren

Im Informatik, a Ausdrucksgrammatik analysieren (ANBINDUNG) ist eine Art von Art von analytisch formelle Grammatik, d.h. es beschreibt a formelle Sprache In Bezug auf eine Reihe von Regeln für die Anerkennung Saiten in der Sprache. Der Formalismus wurde 2004 von Bryan Ford eingeführt[1] und ist eng mit der Familie von verwandt Top-Down-Parsensprachen in den frühen 1970er Jahren eingeführt. Syntaktisch sehen PEGs auch ähnlich aus wie Kontextfreie Grammatiken (CFGS), aber sie haben eine andere Interpretation: Der Choice -Operator wählt die erste Übereinstimmung in PEG aus, während er in CFG mehrdeutig ist. Dies liegt näher an der Art und Weise, wie die Zeichenfolgenerkennung in der Praxis tendenziell durchgeführt werden, z. durch eine rekursiver Abstammungsparser.

Im Gegensatz zu CFGs können PEGs nicht sein zweideutig; Wenn eine String analysiert, hat sie genau einen gültigen Baum analysieren. Es wird vermutet, dass es kontextfreie Sprachen gibt, die von einem Stift nicht erkannt werden können, dies ist jedoch noch nicht bewiesen.[1] PEGs sind gut geeignet, Computersprachen zu analysieren (und künstliche menschliche Sprachen, wie z. Lojban), aber nicht natürliche Sprachen wobei die Leistung von PEG -Algorithmen vergleichbar ist mit allgemeinen CFG -Algorithmen wie der Earley -Algorithmus.[2]

Definition

Syntax

Formal besteht eine Grammatik mit analysierender Ausdruck aus:

Jede Parsing -Regel in P hat die Form Ae, wo A ist ein nicht terminales Symbol und e ist ein Ausdruck analysieren. Ein Parsing -Ausdruck ist hierarchisch Ausdruck Ähnlich wie a regulären Ausdruck, was auf folgende Weise gebaut wird:

  1. Ein atomare Parsingausdruck besteht aus:
    • Jedes Terminalsymbol,
    • jedes nicht terminale Symbol oder
    • die leere Zeichenfolge ε.
  2. Angesichts der vorhandenen Parsing -Ausdrücke e, e1, und e2Ein neuer Parsing -Ausdruck kann mit den folgenden Operatoren konstruiert werden:
    • Reihenfolge: e1 e2
    • Auswahl bestellt: e1 / e2
    • Null-or-more: e*
    • Ein oder mehr: e+
    • Optional: e?
    • Und zu Pracht: & & &e
    • Nicht vorgeschrieben:!e

Semantik

Der grundlegende Unterschied zwischen Kontextfreie Grammatiken und analysieren Ausdrucksgrammatiken ist, dass der Auswahlbetreiber des Pegs ist bestellt. Wenn die erste Alternative erfolgreich ist, wird die zweite Alternative ignoriert. Somit ist die geordnete Wahl nicht kommutativIm Gegensatz zu ungeordneten Auswahl wie in kontextfreien Grammatiken. Bestellte Wahl ist analog zu weicher Schnitt Betreiber in einigen erhältlich Logikprogrammierung Sprachen.

Die Folge ist, dass, wenn ein CFG direkt in einen PEG übertragen wird, jede Unklarheit in der ersteren durch deterministische Auswahl eines Parse -Baumes aus den möglichen Parsen aufgelöst wird. Durch sorgfältige Auswahl der Reihenfolge, in der die Grammatikalternativen angegeben werden, hat ein Programmierer eine große Kontrolle darüber, welche Parse Tree ausgewählt wird.

Wie Boolesche kontextfreie Grammatiken, Parsing-Expression-Grammatiken auch die und- und nicht- und nicht- syntaktische Prädikate. Da sie eine willkürlich komplexe Unterexpression verwenden können, um in die Eingangszeichenfolge zu "schauen", ohne sie tatsächlich zu konsumieren, bieten sie eine leistungsstarke Syntaktik Schau voraus und Disambiguationseinrichtungen, insbesondere wenn das Neubestehen der Alternativen den genauen gewünschten Baumstamm angeben kann.

Betriebsinterpretation von Parsing -Ausdrücken

Jedes nicht terminale in einer Parsing -Expression -Grammatik repräsentiert im Wesentlichen eine Parsen Funktion in einem rekursiver Abstammungsparserund der entsprechende Parsing -Ausdruck repräsentiert den "Code", der die Funktion umfasst. Jede Parsingfunktion nimmt konzeptionell eine Eingabezeichenfolge als Argument und liefert eine der folgenden Ergebnisse:

  • Erfolg, in dem die Funktion optional vorwärts bewegen kann oder verbrauchen ein oder mehrere Zeichen der Eingangszeichenfolge, die ihm geliefert wird, oder
  • VersagenIn diesem Fall wird keine Eingabe konsumiert.

Eine atomare Parsing -Expression, die aus einem einzigen besteht Terminal (d.h. wörtlich) Erfolg, wenn der erste Zeichen der Eingangszeichenfolge mit diesem Terminal übereinstimmt, und in diesem Fall den Eingangszeichen konsumiert; Andernfalls liefert der Ausdruck ein Versagenergebnis. Ein atomarer Parsing -Expression, der aus dem besteht leer String ist immer trivial erfolgreich, ohne Input zu konsumieren.

Ein atomarer Parsing -Expression, der aus a besteht nicht terminal A repräsentiert a rekursiv Rufen Sie die nicht terminale Funktion an A. Ein nicht terminaler Erfolg kann erfolgreich sein, ohne tatsächlich Input zu konsumieren, und dies wird als Ergebnis von Misserfolg angesehen.

Das Reihenfolge Operator e1 e2 zuerst ruft e1, und wenn e1 erfolgreich, anschließend ruft er an e2 am Rest der Eingangszeichenfolge, die nicht unauffällig wurde von e1und gibt das Ergebnis zurück. Wenn entweder e1 oder e2 fällt fehl, dann die Sequenzexpression e1 e2 fällt (konsumieren Sie keine Eingabe).

Das Auswahl Operator e1 / e2 zuerst ruft e1, und wenn e1 erfolgreich ist das Ergebnis sofort zurück. Sonst wenn e1 fällt aus, dann der Choice -Operator Backtracks zu der ursprünglichen Eingangsposition, in der es aufgerufen wurde e1ruft aber an e2 Stattdessen zurückkehren e2Ergebnis.

Das Null-or-more, ein oder mehr, und Optional Die Betreiber verbrauchen null oder mehr, eine oder mehrere oder null oder eine aufeinanderfolgende Wiederholungen ihrer Unterexpression e, beziehungsweise. Anders als in Kontextfreie Grammatiken und Reguläre AusdrückeDiese Operatoren jedoch stets sich verhalten gierig, so viel Eingabe wie möglich konsumieren und nie zurückverfolgen. (Regelmäßige Expressions -Matcher können mit der gierig ständigen Übereinstimmung beginnen, aber dann kürzere Übereinstimmungen ausführen, wenn sie nicht übereinstimmen.) Zum Beispiel wird der Ausdruck A* immer so viele As verbrauchen, wie sie nacheinander in der Eingangszeichenfolge und im Ausdruck verfügbar sind, und der Ausdruck (a* a) wird immer scheitern, weil der erste Teil (a*) niemals A's für den zweiten Teil übertrifft.

Das und zu Pracht Ausdruck &e ruft die Unterexpression auf eund dann gelingt es, wenn e erfolgreich und fällt fehl, wenn e scheitert, aber in beiden Fällen Konsumiert niemals Input.

Das nicht vorgeschrieben Ausdruck !e Erfolg, wenn e fehlschlägt und fällt fehl, wenn e erfolgreich und in beiden Fällen wieder keine Eingaben konsumiert.

Beispiele

Dies ist ein PEG, der mathematische Formeln erkennt, die die fünf grundlegenden Operationen auf nicht negative Ganzzahlen anwenden.

Expr   Summe Summe   Produkt (('+' / '-' ') Produkt)* Produkt  Leistung (('*' / '/') Leistung)* Leistung   Wert ('^' ' Leistung)? Wert   [0-9]+ / '(' Expr ')' 

Im obigen Beispiel sind die Terminalymbole Zeichen von Text, die durch Zeichen in einzelnen Zitaten dargestellt werden, wie z. '(' und ')'. Die Reichweite [0-9] ist auch eine Abkürzung für zehn Zeichen, die eine der Ziffern 0 bis 9 angibt. (Diese Bereichsyntax ist die gleiche wie die von der von verwendete Syntax Reguläre Ausdrücke.) Die nicht terminalen Symbole sind diejenigen, die auf andere Regeln ausdehnen: Wert, Leistung, Produkt, Summe, und Expr. Beachten Sie, dass Regeln Summe und Produkt führen nicht zu gewünschten links-assoziativität dieser Operationen (sie befassen sich überhaupt nicht mit Assoziativität und müssen in der Nachbearbeitungsschritt nach der Parsen behandelt werden) und die Leistung Die Regel (durch die Verweise auf sich selbst auf der rechten Seite) führt zu einer gewünschten Exponent-Associativität des Rechtsantriebs. Beachten Sie auch, dass eine Regel mag wie Sum ← Sum (('+' / '-') Product)? (Mit der Absicht, die linke Assoziativität zu erreichen) würde eine unendliche Rekursion verursachen, sodass sie in der Praxis nicht verwendet werden kann, obwohl sie in der Grammatik ausgedrückt werden kann.

Die folgende rekursive Regel entspricht dem Standard-C-Stil, wenn/dann/sonst Anweisungen so, dass die optionale "sonst" -Klausel aufgrund der impliziten Priorisierung des '/' Operators immer an das innerste "if" bindet. (In einem Kontextfreie GrammatikDieses Konstrukt liefert den Klassiker anderer Mehrdeutigkeit baumeln.))

S  'wenn' C 'dann' S 'anders' S / 'wenn' C 'dann' S 

Die folgende rekursive Regel entspricht der verschachtelten Kommentarsyntax im Pascal-Stil. (* which can (* nest *) like this *). Die Kommentarsymbole erscheinen in einzelnen Zitaten, um sie von PEG -Operatoren zu unterscheiden.

Start  '(*' Ende   '*)' C   Start N* Ende N   C / (!Start !Ende Z) Z   irgendein Single Charakter 

Der Parsing -Ausdruck foo &(bar) Übereinstimmt und konsumiert den Text "Foo", aber nur, wenn der Text "Bar" folgt. Der Parsing -Ausdruck foo !(bar) entspricht dem Text "Foo", aber nur, wenn es so ist nicht gefolgt von der Text "Bar". Der Ausdruck !(a+ b) a entspricht einem einzigen "a", aber nur, wenn es nicht Teil einer willkürlich langen Abfolge von A ist, gefolgt von a b.

Der Parsing -Ausdruck ('a'/'b')* entspricht und verbraucht eine beliebige Längesequenz von A und Bs. Das Produktionsregel S ← 'a' ''S''? 'b' beschreibt das einfache kontextfrei "passende Sprache" . Die folgende Grammatik für Parsing-Expression beschreibt die klassische nicht kontextfreie Sprache :

S  &(A 'c') 'a'+ B !. A  'a' A? 'b' B  'b' B? 'c' 

Implementierung von Parsers durch Parsing -Expression -Grammatiken

Jede Parsing -Expression -Grammatik kann direkt in a umgewandelt werden rekursiver Abstammungsparser.[3] Aufgrund des Unbegrenzten Schau voraus Fähigkeit, die der Grammatikformalismus bietet, könnte der resultierende Parser jedoch auftreten Exponentialzeit Leistung im schlimmsten Fall.

Es ist möglich, eine bessere Leistung für jede Parsing -Expression -Grammatik zu erzielen, indem er seinen rekursiven Abstiegs -Parser in a umwandelt Packrat -Parser, was immer hereinläuft lineare Zeitauf Kosten des wesentlich größeren Speicherbedarfs. Ein Packrat -Parser[3] ist eine Form von Parser Ähnlich wie bei einem rekursiven Abstiegsparser im Bau, außer dem während des Parsingprozesses memoisiert die Zwischenergebnisse aller Aufrufe der gegenseitig rekursiv Parsingfunktionen, um sicherzustellen, dass jede Parsingfunktion nur in einer bestimmten Eingangsposition höchstens einmal aufgerufen wird. Aufgrund dieser Memoisierung kann ein Packrat -Parser viele analysieren Kontextfreie Grammatiken und irgendein Analyse der Expression-Grammatik (einschließlich einiger, die keine kontextfreien Sprachen darstellen) in der linearen Zeit. Beispiele für memoisierte rekursive Abstiegsparser sind mindestens 1993 bekannt.[4] Diese Analyse der Leistung eines Packrat -Parsers geht davon aus, dass genügend Speicher verfügbar ist, um alle memoisierten Ergebnisse zu erhalten. In der Praxis müssen bei der Praxis möglicherweise einige Parsingfunktionen mehr als einmal in derselben Eingabeposition aufgerufen werden, und folglich könnte der Parser mehr als lineare Zeit in Anspruch nehmen.

Es ist auch möglich zu bauen LL Parser und LR -Parser Aus der Analyse von Expression-Grammatiken, mit einer besseren Leistungsleistung als einem rekursiven Abstiegs-Parser, aber die unbegrenzte Lookahead-Fähigkeit des Grammatikformalismus geht dann verloren. Daher können nicht alle Sprachen, die mithilfe von Parsing -Expression -Grammatiken ausgedrückt werden können, durch LL- oder LR -Parser analysiert werden.

Vorteile

Im Vergleich zu rein Reguläre Ausdrücke (d. H. Ohne Rückenreferenzen) sind die Stifte streng leistungsstark, erfordern jedoch einen signifikant mehr Gedächtnis. Beispielsweise kann ein regulärer Ausdruck inhärent keine willkürliche Anzahl von übereinstimmenden Klammernpaaren finden, da er nicht rekursiv ist, sondern ein Stift kann. Ein PEG erfordert jedoch eine Menge Speicher, die proportional zur Länge des Eingangs proportional sind, während ein regulärer Expressions -Matcher nur eine konstante Menge an Speicher benötigt.

Jeder PEG kann wie oben beschrieben in linearer Zeit mit einem Packrat -Parser analysiert werden.

Viele CFGs enthalten Unklarheiten, auch wenn sie eindeutige Sprachen beschreiben sollen. Das "sonst baumeln"Das Problem in C, C ++ und Java ist ein Beispiel. Diese Probleme werden häufig gelöst, indem eine Regel außerhalb der Grammatik angewendet wird. In einem PEG entstehen diese Unklarheiten aufgrund der Priorisierung nie.

Nachteile

Speicherkonsum

PEG -Parsing wird normalerweise über durchgeführt Packrat -Parsen, was verwendet Memoisierung[5][6] Redundante Parsingschritte beseitigen. Packrat -Parsen erfordert eine Speicherung proportional zur Gesamteingangsgröße und nicht zur Tiefe des Parse -Baumes wie bei LR -Parsers. Dies ist ein signifikanter Unterschied in vielen Domänen: Zum Beispiel hat der handgeschriebene Quellcode eine effektiv konstante Expression, die von der Länge des Programms unabhängig ist-Expressionen, die über eine bestimmte Tiefe hinaus verschachtelt sind, tendiert tendenziell neu aus.

Bei einigen Grammatiken und einigen Eingängen kann die Tiefe des Parse -Baums proportional zur Eingangsgröße sein.[7]So werden sowohl ein LR-Parser als auch ein Packrat-Parser die gleiche asymptotische Leistung von Worst-Case-Leistung zu haben. Eine genauere Analyse würde die Tiefe des Parse -Baumes getrennt von der Eingangsgröße berücksichtigen. Dies ähnelt einer Situation, die in entsteht Graphalgorithmen: das Bellman -.ford -Algorithmus und Floyd -Warshall -Algorithmus scheinen die gleiche Laufzeit zu haben () Wenn nur die Anzahl der Scheitelpunkte berücksichtigt wird. Eine genauere Analyse, die die Anzahl der Kanten als separates Parameter berücksichtigt Bellman -.ford -Algorithmus eine Zeit von , was quadratisch für spärliche Graphen mit ist .

Indirekte linke Rekursion

Ein Stift heißt gut geformt[1] Wenn es nein enthält linksrekursiv Regeln, d. H. Regeln, die es einem Nichtterminus ermöglichen, sich auf einen Ausdruck auszudehnen, in dem derselbe Nicht -terminale als das links das Symbol des linken vorkommt. Für einen Parser von links nach rechts verursachen solche Regeln unendliche Regression: Die Parsen wird kontinuierlich denselben Nichtterminal erweitern, ohne sich in der Saite voranzutreiben.

Um Packrat -Parsen zuzulassen, muss die linke Rekursion eliminiert werden. Zum Beispiel wäre es in der obigen arithmetischen Grammatik verlockend, einige Regeln zu bewegen, damit die Vorrangreihenfolge von Produkten und Summen in einer Zeile ausgedrückt werden kann:

Wert   [0-9.]+ / '(' Expr ')' Produkt  Expr (('*' / '/') Expr)* Summe   Expr (('+' / '-' ') Expr)* Expr   Produkt / Summe / Wert 

In dieser neuen Grammatik, die an einen Abschluss ist Expr erfordert Tests, wenn a Produkt Übereinstimmung, während er a passt Produkt erfordert Tests, wenn eine Expr Streichhölzer. Da der Begriff in der Position links erscheint, machen diese Regeln a Kreisendefinition das kann nicht gelöst werden. (Zirkuläre Definitionen, die gelöst werden können, existieren-wie in der ursprünglichen Formulierung aus dem ersten Beispiel-, aber solche Definitionen sind erforderlich, um keine pathologische Rekursion zu zeigen.) Linksrekursive Regeln können jedoch immer neu geschrieben werden, um die linke Rezension zu beseitigen.[2][8] Zum Beispiel die folgende links-recursive CFG-Regel:

String-of-a  String-of-a 'a' | 'a' 

kann mit dem Plus -Operator in einem PEG umgeschrieben werden:

String-of-a  'a'+ 

Der Prozess des Umschreibens indirekt linksrekursiv Regeln sind in einigen Packrat -Parsers komplex, insbesondere wenn semantische Aktionen beteiligt sind.

Mit einiger Modifikation kann die traditionelle Packrat -Parsen direkte linke Rekursion unterstützen.[3][9][10] Dies führt jedoch zu einem Verlust der linearen Parsing-Eigenschaft[9] Dies ist im Allgemeinen die Rechtfertigung für die Verwendung von PEGs und Packrat -Parsen überhaupt. Nur der Ometa Parsing -Algorithmus[9] Unterstützt die vollständige direkte und indirekte linke Rekursion ohne zusätzliche damit verbundene Komplexität (aber auch bei Verlust der linearen Zeitkomplexität), während alle alle GLR -Parser Unterstützung der linken Rekursion.

Ausdruckskraft

PEG Packrat -Parser können einige eindeutige, nicht deterministische CFG -Regeln nicht erkennen, wie die folgenden:[2]

S  'x' S 'x' | 'x' 

Weder Ll (k) Noch LR (k) Parsingalgorithmen können dieses Beispiel erkennen. Diese Grammatik kann jedoch von einem allgemeinen CFG -Parser wie dem verwendet werden CYK -Algorithmus. Allerdings die Sprache In Frage kann all diese Arten von Parser erkannt werden, da es sich tatsächlich um eine reguläre Sprache handelt (die von Saiten einer ungeraden Anzahl von X).

Es ist ein offenes Problem, ein konkretes Beispiel für eine kontextfreie Sprache zu geben, die nicht durch eine Parsing-Expression-Grammatik erkannt werden kann.[1] Insbesondere ist es offen, ob eine Parsing -Expression -Grammatik die Sprache von Palindromen erkennen kann.[11]

Ambiguitätserkennung und Einfluss der Regelreihenfolge auf die Sprache, die übereinstimmt

LL (K) und LR (K) -Parser -Generatoren werden nicht abgeschlossen, wenn die Eingangsgrammatik nicht eindeutig ist. Dies ist ein Merkmal in dem gemeinsamen Fall, dass die Grammatik eindeutig sein soll, aber defekt ist. Ein PEG-Parser-Generator wird unbeabsichtigte Ambiguitäten frühestens an die erste Stelle gelöst, was willkürlich sein kann und zu überraschenden Parsen führen kann.

Die Reihenfolge von Produktionen in einer PEG -Grammatik betrifft nicht nur die Auflösung der Mehrdeutigkeit, sondern auch die Sprache angepasst. Betrachten Sie beispielsweise das erste PEG -Beispiel in Fords Papier[1] (Beispiel in pegjs.org/online notation und gekennzeichnet und gekennzeichnet und ):

  • :A = "a" "b" / "a"
  • :A = "a" / "a" "b"

Ford bemerkt das Die zweite Alternative in der letzteren PEG -Regel wird niemals erfolgreich sein, da die erste Wahl immer getroffen wird, wenn die Eingangszeichenfolge mit 'a' beginnt..[1] Speziell, (d. H. Die Sprache, die von übereinstimmt ) enthält die Eingabe "AB", aber aber nicht. Daher kann das Hinzufügen einer neuen Option zu einer PEG -Grammatik kann Löschen Saiten aus der Sprache, die entspricht, z. ist die Hinzufügung einer Regel zur Einzelproduktion GrammatikA = "a" "b", was eine Zeichenfolge enthält, die nicht übereinstimmt, von . Darüber hinaus konstruieren Sie eine Grammatik, die entspricht aus Peg -Grammatiken und ist nicht immer eine triviale Aufgabe. Dies steht in starkem Gegensatz zu CFGs, bei dem die Hinzufügung einer neuen Produktion keine Zeichenfolgen entfernen kann (obwohl sie Probleme in Form von Mehrdeutigkeiten verursachen kann) und eine (möglicherweise mehrdeutige) Grammatik für kann konstruiert werden

S  Anfang(G1) | Anfang(G2) 

Bottom-up-Peg-Parsen

Ein Pika -Parser[12] Verwendet die dynamische Programmierung, um PEG-Regeln Bottom-up und von rechts nach links anzuwenden. Dies ist die Umkehrung der normalen rekursiven Abstiegsreihenfolge von oben nach unten von links nach rechts. Das Parsen in umgekehrter Reihenfolge löst das Problem der linken Rekursion und ermöglicht es, direkt in der Grammatik zu verwenden, ohne in nicht linke revursive Form umgeschrieben zu werden, und vermittelt dem Parser auch optimale Fehlerfunktionen für die Erholung der Fehler für rekursive Abstammungsparsers.

Siehe auch

Verweise

  1. ^ a b c d e f Ford, Bryan (Januar 2004). "Grammatiken für Parsing -Expression: Eine zuerkennungsbasierte syntaktische Grundlage" (PDF). Verfahren des 31. ACM Sigplan-Sigact-Symposiums über Prinzipien der Programmiersprachen. ACM. S. 111–122. doi:10.1145/964001.964011. ISBN 1-58113-729-x.
  2. ^ a b c Ford, Bryan (September 2002). "Packrat -Parsing: Einfach, kraftvoll, faul, lineare Zeit, funktionale Perle" (PDF). ACM Sigplan nennt. 37 (9). doi:10.1145/583852.581483.
  3. ^ a b c Ford, Bryan (September 2002). Packrat-Parsing: Ein praktischer Linear-Zeit-Algorithmus mit Backtracking (These). Massachusetts Institute of Technology. Abgerufen 2007-07-27.
  4. ^ Merritt, Doug (November 1993). "Transparent rekursive Abstammung". Usenet Group Comp.comPiler. Abgerufen 2009-09-04.
  5. ^ Ford, Bryan. "Die Packrat -Parsing- und Parsing -Ausdrucks -Grammatik -Seite". Bford.info. Abgerufen 23. November 2010.
  6. ^ Jelliffe, Rick (10. März 2010). "Was ist ein Packrat -Parser? Was sind brzozowski -Derivate?". Archiviert von das Original am 28. Juli 2011.
  7. ^ Zum Beispiel der Lisp -Ausdruck (x (x (x (x ....))))
  8. ^ Aho, A.V.; Sethi, R.; Ullman, J. D. (1986). Compiler: Prinzipien, Techniken und Werkzeuge.Boston, MA, USA: Addison-Wesley Longman. ISBN 0-201-10088-6.
  9. ^ a b c Warth, Alessandro; Douglass, James R.; Millstein, Todd (Januar 2008). "Packrat -Parser können die linke Rekursion unterstützen" (PDF). Verfahren des ACM-Sigplan-Symposiums 2008 zur partiellen Bewertung und zum Semantik-basierten Programmmanipulation. Pepm '08. ACM. S. 103–110. doi:10.1145/1328408.1328424. ISBN 9781595939777. Abgerufen 2008-10-02.
  10. ^ Steinmann, Roedi (März 2009). "Handling links in Packrat -Parsers links" (PDF). N.ethz.ch. Archiviert von das Original (PDF) Am 2011-07-06.
  11. ^ Loff, Bruno; Moreira, Nelma; Reis, Rogério (2020-02-14). "Die Rechenleistung des Parsing -Expression -Grammatiken". Arxiv:1902.08272 [Cs.fl].
  12. ^ Hutchison, Luke A. D. (2020). "PIKA -Parsen: Das Parsen in umgekehrt löst die Probleme der linken Rekursion und Fehlerwiederherstellung". Arxiv:2005.06444 [cs.pl].

Externe Links