Parsing
Parsing, Syntaxanalyse, oder Syntaktische Analyse ist der Prozess der Analyse a Saite von Symboleentweder in Natürliche Sprache, Computersprachen oder Datenstrukturen, entsprechen den Regeln von a formelle Grammatik. Der Begriff Parsing kommt aus lateinisch Pars (orationis), Bedeutung Teil der Rede).[1]
Der Begriff hat leicht unterschiedliche Bedeutungen in verschiedenen Zweigen von Linguistik und Informatik. Traditionell Satz Das Parsen wird häufig als Methode zum Verständnis der genauen Bedeutung eines Satzes oder Wortes durchgeführt, manchmal mit Hilfe von Geräten wie Satzdiagramme. Es betont normalerweise die Bedeutung grammatikalischer Spaltungen wie z. Thema und Prädikat.
Innerhalb Computerlinguistik Der Begriff wird verwendet, um auf die formale Analyse durch einen Computer eines Satzes oder eine andere Wörterzeichenfolge in seine Bestandteile zu verweisen, was zu a führt Baum analysieren zeigen ihre syntaktische Beziehung zueinander, die auch enthalten kann semantisch und andere Informationen (P-Werte). Einige Parsing -Algorithmen können a erzeugen Wald analysieren oder Liste der Bäume für a syntaktisch mehrdeutig Eingang.[2]
Der Begriff wird auch in verwendet Psycholinguistik Bei der Beschreibung des Sprachverständnisses. In diesem Zusammenhang bezieht sich die Parsen auf die Art und Weise, wie Menschen einen Satz oder eine Phrase (in gesprochener Sprache oder Text) analysieren, "in Bezug auf grammatikalische Bestandteile, die Teile der Sprache, syntaktische Beziehungen usw." identifizieren ".[1] Dieser Begriff ist besonders häufig, wenn er diskutiert, welche sprachlichen Hinweise den Rednern helfen, zu interpretieren Gartenpfad-Sätze.
Innerhalb der Informatik wird der Begriff bei der Analyse von verwendet ComputersprachenBeziehen Sie sich auf die syntaktische Analyse des Eingabescode in seine Komponententeile, um das Schreiben von zu erleichtern Compiler und Dolmetscher. Der Begriff kann auch verwendet werden, um eine Spaltung oder Trennung zu beschreiben.
Menschliche Sprachen
Traditionelle Methoden
Die traditionelle grammatikalische Übung des Parsens, manchmal bekannt als Klauselanalyse, beinhaltet die Aufschlüsselung eines Textes in seine Komponente Teile der Rede mit einer Erklärung der Form, Funktion und syntaktischen Beziehung jedes Teils.[3] Dies wird zum großen Teil aus dem Untersuchung der Sprache bestimmt Konjugationen und Erklärungen, was für stark kompliziert sein kann gebeugt Sprachen. Um einen Satz wie "Man Bites Dog" zu analysieren Singular Substantiv 'Mann' ist das Thema des Satzes ist das Verb 'Bisse' das dritte Person Singular des Gegenwart des Verb 'zu beißen', und das singuläre Substantiv 'Hund' ist das Objekt des Satzes. Techniken wie Satzdiagramme werden manchmal verwendet, um die Beziehung zwischen Elementen im Satz anzuzeigen.
Parsing war früher zentral für die Lehre von Grammatik in der englischsprachigen Welt und wurde allgemein als grundlegend für die Verwendung und das Verständnis der schriftlichen Sprache angesehen. Das allgemeine Lehren solcher Techniken ist jedoch nicht mehr aktuell.
Rechenmethoden
In einigen Maschinenübersetzung und Verarbeitung natürlicher Sprache Systeme, geschriebene Texte in menschlichen Sprachen werden von Computerprogrammen analysiert.[4] Menschliche Sätze können nicht leicht durch Programme analysiert werden, da es erheblich gibt Mehrdeutigkeit in der Struktur der menschlichen Sprache, deren Verwendung es ist, Bedeutung zu vermitteln (oder Semantik) unter einem potenziell unbegrenzten Bereich von Möglichkeiten, von denen nur einige für den speziellen Fall von Germane sind.[5] Eine Äußerung "Mann Bittes Dog" gegen "Hundebisse Mann" ist auf ein Detail eindeutig, aber in einer anderen Sprache kann es als "Mannhundbissen" erscheinen, mit einem Abhängigkeit von dem größeren Kontext, um zwischen diesen beiden Möglichkeiten zu unterscheiden, wenn dieser Unterschied tatsächlich war von Sorge. Es ist schwierig, formale Regeln vorzubereiten, um informelles Verhalten zu beschreiben, obwohl klar ist, dass einige Regeln eingehalten werden.
Um natürliche Sprachdaten zu analysieren, müssen sich die Forscher zunächst darauf einigen Grammatik verwendet werden. Die Wahl der Syntax wird von beiden beeinflusst sprachlich und rechnerische Bedenken; Zum Beispiel verwenden einige Parsingsysteme lexikalische funktionelle GrammatikAber im Allgemeinen ist es bekannt, für Grammatiken dieses Typs zu analysieren NP-Complete. Kopfgetriebene Phrasenstruktur Grammatik ist ein weiterer sprachlicher Formalismus, der in der Parsing -Community beliebt war, aber andere Forschungsbemühungen haben sich auf weniger komplexe Formalismen wie die im Penn verwendeten Forschungsarbeiten konzentriert Baumbank. Flache Parsen Ziel ist es, nur die Grenzen wichtiger Bestandteile wie Substantivphrasen zu finden. Eine weitere beliebte Strategie zur Vermeidung sprachlicher Kontroverse ist Abhängigkeitsgrammatik Parsing.
Die meisten modernen Parser sind zumindest teilweise statistisch; Das heißt, sie verlassen sich auf a Korpus von Trainingsdaten, die bereits kommentiert wurden (von Hand analysiert). Dieser Ansatz ermöglicht es dem System, Informationen über die Häufigkeit zu sammeln, mit der verschiedene Konstruktionen in bestimmten Kontexten auftreten. (Sehen maschinelles Lernen.)) Ansätze, die verwendet wurden PCFGs (probabilistische kontextfreie Grammatiken),[6] Maximale Entropie,[7] und neuronale Netze.[8] Die meisten erfolgreicheren Systeme verwenden lexikalisch Statistiken (dh sie berücksichtigen die Identität der beteiligten Wörter sowie ihre Teil der Rede). Solche Systeme sind jedoch anfällig für Überanpassung und erfordern eine Art von Glättung effektiv sein.
Das Analysieren von Algorithmen für die natürliche Sprache kann sich nicht auf die Grammatik verlassen, die "nette" Eigenschaften wie bei manuell gestalteten Grammatiken für Programmiersprachen haben. Wie bereits erwähnt, sind einige Grammatikformalismen sehr schwer rechnerisch zu analysieren. Im Allgemeinen, auch wenn die gewünschte Struktur nicht ist kontextfreiEine kontextfreie Annäherung an die Grammatik wird verwendet, um einen ersten Pass durchzuführen. Algorithmen, die kontextfreie Grammatiken verwenden CYK -Algorithmusnormalerweise mit einigen Heuristik Unwahrscheinliche Analysen wegzuschneiden, um Zeit zu sparen. (Sehen Chart -Parsen.)) Einige Systemhandelsgeschwindigkeit für Genauigkeit unter Verwendung, z. B. lineare Zeitversionen der Schichtreden Algorithmus. Eine etwas jüngste Entwicklung wurde analysiert, bei dem der Parser eine große Anzahl von Analysen vorschlägt, und ein komplexeres System wählt die beste Option aus. Im natürliches Sprachverständnis Anwendungen, Semantische Parser Konvertieren Sie den Text in eine Darstellung seiner Bedeutung.[9]
Psycholinguistik
Im PsycholinguistikDas Parsen beinhaltet nicht nur die Zuordnung von Wörtern zu Kategorien (Bildung ontologischer Erkenntnisse), sondern die Bewertung der Bedeutung eines Satzes gemäß den Regeln der Syntax, die durch Schlussfolgerungen aus jedem Wort im Satz (bekannt als bekannt als bekannt Konnotation). Dies tritt normalerweise auf, wenn Worte gehört oder gelesen werden. Folglich sind psycholinguistische Modelle der Parsen notwendigerweise inkrementellDies bedeutet, dass sie eine Interpretation aufbauen, während der Satz verarbeitet wird, der normalerweise in Bezug auf eine partielle syntaktische Struktur ausgedrückt wird. Die Schaffung von anfänglich falschen Strukturen tritt bei der Interpretation auf Gartenpfad-Sätze.
Diskursanalyse
Diskursanalyse Untersucht Möglichkeiten zur Analyse der Sprachgebrauch und semiotischen Ereignisse. Überzeugende Sprache kann genannt werden Rhetorik.
Computersprachen
Parser
A Parser ist eine Softwarekomponente, die Eingabedaten (häufig Text) nimmt und a erstellt a Datenstruktur - Oft eine Art von Baum analysieren, Zusammenfassung Syntaxbaum oder eine andere hierarchische Struktur, die eine strukturelle Darstellung der Eingabe beim Überprüfen der korrekten Syntax ergibt. Das Parsen kann oder gefolgt von anderen Schritten vorausgegangen sein oder diese zu einem einzigen Schritt kombiniert werden. Dem Parser geht ein getrennter Teil häufig vor Lexikalanalysator, was Token aus der Reihenfolge der Eingabebereich erzeugt; Alternativ können diese in kombiniert werden Scannerloser Parsen. Parser können von Hand programmiert werden oder automatisch oder halbautomatisch durch a generiert werden Parser -Generator. Parsen ergänzt sich zu Vorlagen, was formatiert wird Ausgang. Diese können auf verschiedene Bereiche angewendet werden, erscheinen jedoch häufig zusammen, wie die Scanf/printf Paar oder die Stufen eines Compilers (Back -End -Codeerzeugung) und die Eingabe (Frontend -Parsen) und Ausgabe (Back End -Code -Erzeugung).
Die Eingabe in einen Parser ist oft Text in einigen Computer Sprache, aber es können auch Text in einer natürlichen Sprache oder weniger strukturierte Textdaten sein. In diesem Fall werden im Allgemeinen nur bestimmte Teile des Textes extrahiert und nicht ein analysierter Baum, der konstruiert wird. Parser reichen von sehr einfachen Funktionen wie z. Scanf, zu komplexen Programmen wie dem Frontend von a C ++ - Compiler oder der Html Parser von a Webbrowser. Eine wichtige Klasse einfacher Parsen erfolgt mit Verwendung Reguläre Ausdrücke, in der eine Gruppe regulärer Ausdrücke a definiert a Regelmäßige Sprache und eine regelmäßige Ausdrucksmotor, die automatisch einen Parser für diese Sprache erzeugt, zulässt Musteranpassung und Extraktion des Textes. In anderen Kontexten werden stattdessen regelmäßige Ausdrücke vor der Parsen verwendet, da der Lexing -Schritt, dessen Ausgabe dann vom Parser verwendet wird.
Die Verwendung von Parsers variiert je nach Eingabe. Im Falle von Datensprachen wird ein Parser häufig als Datei -Lesefunktion eines Programms gefunden, z. B. Lesen in HTML oder Xml Text; Diese Beispiele sind Markup -Sprachen. Im Falle des Programmiersprachen, ein Parser ist eine Komponente von a Compiler oder Dolmetscher, was analysiert Quellcode von a Computerprogrammiersprache eine Form der internen Repräsentation zu erstellen; Der Parser ist ein wichtiger Schritt in der Compiler Frontend. Programmiersprachen werden in der Regel in Bezug auf a spezifiziert deterministische kontextfreie Grammatik Weil schnelle und effiziente Parser für sie geschrieben werden können. Für Compiler kann das Parsen selbst in einem Pass oder mehreren Pässen erfolgen - siehe Ein-Pass-Compiler und Multi-Pass-Compiler.
Die impliziten Nachteile eines Ein-Pass-Compilers können weitgehend durch Hinzufügen überwunden werden Einstellungen, wo die Bereitstellung für den Code-Umzug während der Vorwärtspass durchgeführt wird und die Einrichtungen rückwärts angewendet werden, wenn das aktuelle Programmsegment als Fertigstellung erfasst wurde. Ein Beispiel, bei dem ein solcher Fixmechanismus nützlich wäre, wäre eine Vorwärts-GOTO-Anweisung, bei der das Ziel des GOTO nicht bekannt ist, bis das Programmsegment abgeschlossen ist. In diesem Fall würde sich die Anwendung der Einrichtung verzögern, bis das Ziel des GOTO erkannt wurde. Umgekehrt erfordert ein Rückwärts-GOTO keine Einrichtung, da der Standort bereits bekannt ist.
Kontextfreie Grammatiken sind begrenzt in dem Ausmaß, in dem sie alle Anforderungen einer Sprache ausdrücken können. Der Grund dafür ist, dass die Erinnerung an eine solche Sprache begrenzt ist. Die Grammatik kann sich nicht an das Vorhandensein eines Konstrukts über einen willkürlich langen Eingang erinnern. Dies ist für eine Sprache erforderlich, in der beispielsweise ein Name deklariert werden muss, bevor er verwiesen werden kann. Stärkere Grammatiken, die diese Einschränkung ausdrücken können, können jedoch nicht effizient analysiert werden. Daher ist es eine häufige Strategie, einen entspannten Parser für eine kontextfreie Grammatik zu erstellen, die ein Supersatz der gewünschten Sprachkonstrukte akzeptiert (dh einige ungültige Konstrukte). Später können die unerwünschten Konstrukte an der herausgefiltert werden Semantische Analyse (Kontextanalyse) Schritt.
Zum Beispiel in Python Das Folgende ist syntaktisch gültiger Code:
x = 1 drucken(x)
Der folgende Code ist jedoch in Bezug auf die kontextfreie Grammatik syntaktisch gültig und ergibt einen Syntaxbaum mit der gleichen Struktur wie die vorherige, verletzt jedoch die semantische Regel, wodurch Variablen vor der Verwendung initialisiert werden müssen:
x = 1 drucken(y)
Überblick über den Prozess

Das folgende Beispiel demonstriert den üblichen Fall, dass eine Computersprache mit zwei Grammatikebenen analysiert wird: lexikalisch und syntaktisch.
Die erste Stufe ist die Token -Generation oder lexikalische Analyse, durch den der Eingangszeichenstrom in sinnvolle Symbole aufgeteilt wird, die durch eine Grammatik von definiert sind Reguläre Ausdrücke. Beispielsweise würde ein Taschenrechnerprogramm eine Eingabe wie "untersuchen" untersuchen "12 * (3 + 4)^2
"Und teilen Sie es in die Token auf 12
, *
, (
, 3
, +
, 4
, )
, ^
, 2
jedes davon ist ein bedeutungsvolles Symbol im Kontext eines arithmetischen Ausdrucks. Der Lexer würde Regeln enthalten, um ihm zu sagen, dass die Charaktere *
, +
, ^
, (
und )
Markieren Sie den Beginn eines neuen Tokens, so bedeutungslose Token mögen "12*
" oder "(3
"wird nicht generiert.
Die nächste Stufe ist die Parsen oder eine syntaktische Analyse, bei der prüft, ob die Token einen zulässigen Ausdruck bilden. Dies geschieht normalerweise unter Bezugnahme auf a Kontextfreie Grammatik das rekursiv Komponenten definiert, die einen Ausdruck und die Reihenfolge ausmachen können, in der sie erscheinen müssen. Allerdings können nicht alle Regeln, die Programmiersprachen definieren, allein durch kontextfreie Grammatiken ausgedrückt werden, beispielsweise Typ Validität und ordnungsgemäße Erklärung von Identifikatoren. Diese Regeln können offiziell mit ausgedrückt werden Grammatiken zuschreiben.
Die letzte Phase ist Semantische Parsen oder Analyse, bei der die Auswirkungen des Ausdrucks gerade validiert und die entsprechenden Maßnahmen ergriffen werden.[10] Bei einem Taschenrechner oder Interpreter wird die Aktion den Ausdruck oder das Programm bewerten. Ein Compiler hingegen würde eine Art Code generieren. Attributgrammatiken können auch verwendet werden, um diese Aktionen zu definieren.
Arten von Parser
Das Aufgabe des Parsers ist im Wesentlichen zu bestimmen, ob und wie die Eingabe vom Startsymbol der Grammatik abgeleitet werden kann. Dies kann im Wesentlichen auf zwei Arten erfolgen:
- Top-Down-Parsen -Die Top-Down-Analyse kann als Versuch angesehen werden, links am meisten ein Eingangsstrom zu finden, indem Sie nach suchen Bäume analysieren Verwenden einer Top-Down-Erweiterung der gegebenen formelle Grammatik Regeln. Token werden von links nach rechts konsumiert. Inklusive Wahl wird verwendet, um Platz zu erhalten Mehrdeutigkeit Durch Erweiterung aller alternativen Rechtseiten der Grammatikregeln.[11] Dies ist als Primordial -Suppenansatz bekannt. Sehr ähnlich wie die Satzdiagrammung, bricht die ursprüngliche Suppe die Wahlkreise von Sätzen ab.[12]
- Bottom-up-Parsen - Ein Parser kann mit der Eingabe beginnen und versuchen, ihn in das Startsymbol umzuschreiben. Intuitiv versucht der Parser, die grundlegendsten Elemente zu lokalisieren, dann die Elemente, die diese enthalten, und so weiter. LR -Parser sind Beispiele für Bottom-up-Parser. Ein weiterer Begriff, der für diese Art von Parser verwendet wird, ist Schichtreden Parsing.
LL Parser und rekursiver Parser sind Beispiele für Top-Down-Parser, die nicht aufnehmen können links rekursiv Produktionsregeln. Obwohl angenommen wurde, dass einfache Implementierungen von Top-Down-Parsen keine direkten und indirekten linken Rezensionen berücksichtigen können und bei der Parsen möglicherweise exponentielle Zeit und Raumkomplexität erfordern mehrdeutige kontextfreie GrammatikenFrost, Hafiz und Callaghan wurden anspruchsvollere Algorithmen für die Analyse von Top-Down-Parsen erstellt[13][14] die aufnehmen Mehrdeutigkeit und Linksrekursion in der Polynomzeit und die polynomiale Darstellungen der potenziell exponentiellen Anzahl an Parsebäumen erzeugen. Ihr Algorithmus kann sowohl links- als auch rechts am meisten in Bezug auf eine gegebene Eingabe abgeben Kontextfreie Grammatik.
Eine wichtige Unterscheidung in Bezug auf Parser ist, ob ein Parser a generiert wird Ableitungen links oder ein rechts abgeleitet (sehen Kontextfreie Grammatik). LL -Parser erzeugen eine links in der linken Seite Ableitung und LR -Parser erzeugen eine Ableitung rechts (wenn auch normalerweise in umgekehrt).[11]
Etwas Grafische Parsen Algorithmen wurden für die Auseinandersetzung für visuelle Programmiersprachen.[15][16] Parser für visuelle Sprachen basieren manchmal auf Grammatiken für Graphen.[17]
Adaptive Parsen Algorithmen wurden verwendet, um "Selbstverlängerung" zu konstruieren Benutzeroberflächen für natürliche Sprache.[18]
Implementierung
Die einfachste Parser -APIs lesen die gesamte Eingabedatei, führen eine Zwischenberechnung durch und schreiben dann die gesamte Ausgabedatei. (Wie in Memory Multi-Pass-Compiler).
Diese einfachen Parsers funktionieren nicht, wenn nicht genügend Speicher ist, um die gesamte Eingabedatei oder die gesamte Ausgabedatei zu speichern. Sie werden auch nicht für unendliche Datenströme aus der realen Welt arbeiten.
Einige alternative API -Ansätze zum Parsen solcher Daten:
- Push -Parser Dadurch rufen Sie die registrierten Handler (Rückrufe) an Expat)
- Parser ziehen
- inkrementelle Parsers (z. B. inkrementell PARTER -PARSER) Dass der Text der Datei von einem Benutzer bearbeitet wird, muss die gesamte Datei nicht vollständig wieder festigen.
- Aktive gegen passive Parser[19][20]
Parser Development Software
Einige der bekannten Tools zur Entwicklung von Parsers umfassen Folgendes:
Schau voraus

int v;main(){
"Und es geht darum, eine Regel auszuwählen, um abzuleiten Stmt. Ich schaue nur auf das erste Lookahead -Token "v
"Es kann nicht entscheiden, für welche von beiden Alternativen Stmt wählen; Letzteres erfordert einen Blick auf die zweite Token.Lookahead legt die maximalen eingehenden Token fest, mit denen ein Parser entscheiden kann, welche Regel es verwenden soll. Lookahead ist besonders relevant für LL, Lr, und Lalr -Parser, wo es oft explizit angezeigt wird, indem der Lookahead auf den Algorithmus -Namen in Klammern wie Lalr (1) angehoben wird.
Die meisten ProgrammiersprachenDas Hauptziel von Parsers wird sorgfältig definiert, so dass ein Parser mit begrenztem Lookahead sie typischerweise analysieren kann, da Parser mit begrenztem Lookahead oft effizienter ist. Eine wichtige Änderung dieses Trends kam 1990, als Terence Parr erstellt Antlr für seine Doktorarbeit. These, a Parser -Generator für effiziente LL (k) Parser, wo k ist ein fester Wert.
LR -Parser haben normalerweise nur wenige Aktionen, nachdem sie jedes Token gesehen haben. Sie sind Verschiebung (fügen Sie dieses Token für die spätere Reduzierung zum Stapel hinzu), reduzieren (Pop -Token aus dem Stapel und bilden ein syntaktisches Konstrukt), Ende, Fehler (keine bekannte Regel gilt) oder Konflikt (weiß nicht, ob sie verschoben oder reduziert werden sollen) .
Lookahead hat zwei Vorteile.[Klarstellung erforderlich]
- Es hilft dem Parser, im Falle von Konflikten die richtige Maßnahmen zu ergreifen. Zum Beispiel die IF -Anweisung im Fall einer anderen Klausel analysieren.
- Es beseitigt viele doppelte Staaten und erleichtert die Belastung eines zusätzlichen Stapels. Ein C-Sprache, der nicht-Lookahead-Parser ist, wird rund 10.000 Staaten haben. Ein Lookahead -Parser wird rund 300 Bundesstaaten haben.
Beispiel: Analyse des Ausdrucks 1 + 2 * 3[zweifelhaft ]
Die Reihe von Ausdrucksspitzenregeln (als Grammatik bezeichnet) lautet wie folgt. | ||
Regel 1: | E → e + e | Ausdruck ist die Summe von zwei Ausdrücken. |
Regel2: | E → e * e | Ausdruck ist das Produkt zweier Ausdrücke. |
Regel3: | E → Zahl | Ausdruck ist eine einfache Zahl |
Regel4: | + hat weniger Vorrang als * |
Die meisten Programmiersprachen (mit Ausnahme einiger weniger wie APL und SmallTalk) und algebraische Formeln bieten eine höhere Multiplikation als Addition. In diesem Fall ist die korrekte Interpretation des obigen Beispiels 1 + (2 * 3). Beachten Sie, dass Regel4 oben eine semantische Regel ist. Es ist möglich, die Grammatik umzuschreiben, um diese in die Syntax aufzunehmen. Allerdings können nicht alle dieser Regeln in Syntax übersetzt werden.
- Einfache Nicht-Lookahead-Parseraktionen
Anfangs eingeben = [1, +, 2, *, 3]
- Schalten Sie "1" von Input auf Stapel (in Erwartung von Regel3) auf Stapel. Eingabe = [+, 2, *, 3] Stack = [1]
- Reduziert "1" auf die Ausdruck "e" basierend auf Regel3. Stack = [e]
- Verschieben Sie "+" von Input auf Stapel (in Erwartung von Regel1). Eingabe = [2, *, 3] Stack = [e, +]
- Schalten Sie "2" von Input auf Stapel (in Erwartung von Regel3) auf Stack. Input = [*, 3] stack = [e, +, 2]
- Reduzieren Sie das Stapelelement "2" auf Ausdruck "e" basierend auf Regel3. Stack = [e, +, e]
- Reduzieren Sie Stackelemente [E, +, E] und neue Eingaben "E" auf "e" basierend auf Regel1. Stack = [e]
- Schalten Sie "*" von Input auf Stapel (in Erwartung von Regel2) auf Stack. Input = [3] stack = [e,*]
- Schalten Sie "3" von Input auf Stapel (in Erwartung von Regel3) auf Stapel. Input = [] (leer) Stack = [e, *, 3]
- Reduzieren Sie das Stapelelement "3" auf Ausdruck "e" basierend auf Regel3. Stack = [e, *, e]
- Reduzieren Sie Stackelemente [e, *, e] und neue Eingaben "E" auf "e" basierend auf Regel2. Stack = [e]
Der Parse Tree und der resultierende Code daraus sind entsprechend der Sprachsemantik nicht korrekt.
Um ohne Lookahead richtig zu analysieren, gibt es drei Lösungen:
- Der Benutzer muss Ausdrücke in Klammern einschließen. Dies ist oft keine praktikable Lösung.
- Der Parser muss über mehr Logik verfügen, um zurückzukehren und wiederzuholen, wenn eine Regel verletzt oder nicht vollständig ist. Die ähnliche Methode wird bei LL -Parsers befolgt.
- Alternativ muss der Parser oder die Grammatik eine zusätzliche Logik haben, um die Reduzierung zu verzögern und nur zu reduzieren, wenn es absolut sicher ist, welche Regel zuerst reduziert werden soll. Diese Methode wird in LR -Parsers verwendet. Dies analysiert den Ausdruck korrekt, aber mit vielen weiteren Zuständen und einer erhöhten Stapel -Tiefe.
- Lookahead Parser -Aktionen[Klarstellung erforderlich]
- Schalten Sie 1 auf Eingabe 1 in Vorwegnahme von Regel3 auf Stapel. Es reduziert sich nicht sofort.
- Reduzieren Sie den Stapel Element 1 auf einfache Ausdruck auf Eingabe + basierend auf Regel3. Die LookaHead ist +, also sind wir auf dem Weg zu E +, sodass wir den Stapel auf E reduzieren können.
- Schalten Sie in der Vorwegnahme von Regel1 auf Stapel auf Eingabe +.
- Schalten Sie 2 auf Eingabe 2 auf Stack 2 in Erwartung von Regel3.
- Reduzieren Sie Stack Item 2 auf Ausdruck auf Eingabe * basierend auf Regel3. Der LookaHead * erwartet nur e vorher.
- Jetzt hat Stack E + E und immer noch ist der Eingang *. Es enthält jetzt zwei Möglichkeiten, entweder auf der Grundlage von Regel2 oder einer Reduzierung auf der Grundlage von Regel1 zu verschieben. Da * aufgrund von Regel4 eine höhere Vorrang vorrangt als +, verschieben wir * in Erwartung von Regel2 auf Stapel.
- Schalten Sie 3 in die Eingabe 3 in Vorwegnahme von Regel3 auf Stapel.
- Reduzieren Sie den Stack Element 3 auf den Ausdruck, nachdem Sie das Ende der Eingabe anhand von Regel3 angesehen haben.
- Reduzieren Sie Stackelemente E * E auf E basierend auf Regel2.
- Reduzieren Sie Stackelemente E + E auf E basierend auf Regel1.
Der erzeugte Parse -Baum ist korrekt und einfach effizienter[klären] als Nicht-Lookahead-Parser. Dies ist die folgende Strategie in Lalr -Parser.
Siehe auch
Verweise
- ^ a b "Analysieren". Dictionary.Reference.com. Abgerufen 27. November 2010.
- ^ Masaru Tomita (6. Dezember 2012). Verallgemeinerte LR -Parsen. Springer Science & Business Media. ISBN 978-1-4615-4034-2.
- ^ "Grammatik und Komposition".
- ^ Christopher d .. Manning; Christopher D. Manning; Hinrich Schütze (1999). Grundlagen der statistischen Verarbeitung natürlicher Sprache. MIT Press. ISBN 978-0-262-13360-9.
- ^ Jurafsky, Daniel (1996). "Ein probabilistisches Modell für lexikalische und syntaktische Zugriff und Disambiguierung". Kognitionswissenschaft. 20 (2): 137–194. Citeseerx 10.1.1.150.5711. doi:10.1207/s15516709COG2002_1.
- ^ Klein, Dan und Christopher D. Manning. "Genaue unlexikalisierte Parsen.
- ^ Charniak, Eugene. "Ein maximaler Entropie-inspiriertes Parser.
- ^ Chen, Danqi und Christopher Manning. "Ein schneller und genauer Abhängigkeitsparser mit neuronalen Netzwerken.
- ^ Jia, Robin; Liang, Percy (2016-06-11). "Datenrekombination für neuronale semantische Parsen". Arxiv:1606.03622 [cs.cl].
- ^ Berant, Jonathan und Percy Liang. "Semantisches Paraprasing durch Paraphrasieren.
- ^ a b A. V. A. V., Sethi, R. und Ullman, J. D. (1986) "Compiler: Prinzipien, Techniken und Werkzeuge." Addison-Wesley Longman Publishing Co., Inc. Boston, MA, USA.
- ^ Sikkel, Klaas, 1954- (1997). Parsing -Schemata: Ein Rahmen für die Spezifikation und Analyse von Parsing -Algorithmen. Berlin: Springer. ISBN 9783642605413. OCLC 606012644.
{{}}
: Cs1 montiert: Mehrfachnamen: Autorenliste (Link) - ^ Frost, R., Hafiz, R. und Callaghan, P. (2007) " Modulare und effiziente Top-Down-Parsen für mehrdeutige linksrezisive Grammatiken . " 10. Internationaler Workshop für Parsing Technologies (IWPT), ACL-sigparse , Seiten: 109 - 120, Juni 2007, Prag.
- ^ Frost, R., Hafiz, R. und Callaghan, P. (2008) " Parser-Kombinatoren für mehrdeutige linksrezisive Grammatiken. " 10. Internationales Symposium zu praktischen Aspekten von Deklarativsprachen (PAMS), ACM-Sigplan , Band 4902/2008, Seiten: 167 - 181, Januar 2008, San Francisco.
- ^ Rekers, Jan und Andy Schürr. "Definieren und Parsen visueller Sprachen mit geschichteten Graphengrammatiken. "Journal of Visual Languages & Computing 8.1 (1997): 27-55.
- ^ Rekers, Jan und A. Schurr. "Ein Grammatik -Ansatz für grafische Parsen. "Visuelle Sprachen, Proceedings., 11. IEEE International Symposium on. IEEE, 1995.
- ^ Zhang, Da-Qian, Kang Zhang und Jiannong Cao. "Ein kontextempfindlicher Grammatikformalismus für die Spezifikation visueller Sprachen. "The Computer Journal 44.3 (2001): 186-200.
- ^ Jill Fain Lehman (6. Dezember 2012). Adaptive Parsing: Selbstverlängerende natürliche Sprachschnittstellen. Springer Science & Business Media. ISBN 978-1-4615-3622-2.
- ^ Patrick Blackburn und Kristina Striegzz."Natürliche Sprachverarbeitungstechniken im Prolog".
- ^ Song-Chun Zhu."Klassische Parsing -Algorithmen".
- ^ genommen von Brian W. Kernighan und Dennis M. Ritchie (April 1988). Die C -Programmiersprache. Prentice Hall Software -Serie (2. Aufl.). Englewood Cliffs/NJ: Prentice Hall. ISBN 0131103628. (Anhang A.13 "Grammatik", S.193 FF)
Weitere Lektüre
- Chapman, Nigel P., LR -Parsen: Theorie und Praxis, Cambridge University Press, 1987. ISBN0-521-30413-x
- Grune, Schwanz; Jacobs, Ceriel J. H., Parsing -Techniken - ein praktischer Leitfaden, Vrije Universitet Amsterdam, Amsterdam, Niederlande. Ursprünglich veröffentlicht von Ellis Horwood, Chichester, England, 1990; ISBN0-13-651431-6
Externe Links
- Der Zitronen -Lalr -Parser -Generator
- Stanford Parser Der Stanford Parser
- Parser der Turin University Parser für natürliche Sprache für die italienische Open Source, entwickelt von Leonardo Lesmo, Universität Turin, Italien, gemeinsam.
- Kurze Geschichte des Parserbaues