Schnelles Auffinden von Leerzeichen, die Nicht-Terminals in einem CFG produzieren


8

Für eine gegebene kontextfreie Sprache G nennen wir ein Nicht - End NULLABLE wenn A i * ε , dh wir den leeren String aus ableiten können A i nach einer endlichen Anzahl von Produktionen Anwendung.Ai AiϵAi

Es gibt einen einfachen Algorithmus zum Bestimmen, welche Nichtterminale einer Grammatik nullbar sind, wie hier zu finden ist :

Wir beginnen damit, dass wir alle Nicht-Terminals als nicht nullwertfähig betrachten. Wir markieren alle als nullbar, wenn es eine Produktion A iϵ gibt . Wir durchlaufen dann alle anderen Produktionen A iB 1 B 2B k mit Ausnahme von Produktionen mit einem Terminal darin und markieren A i als nullbar, wenn alle B i nullbar sind. Wir machen diese Schleife so lange, bis wir eine Schleife beendet haben, ohne Nichtterminale als nullbar zu markieren.AiAiϵAiB1B2BkAiBi

Mein Problem mit diesem Algorithmus ist, dass er eine Laufzeit von hat: Ein schlimmster Fall ist zum Beispiel A 1A 2 , A 2A 3 , A 3A 4 , ..., A n - 1A n , A nϵ .O(n2)A1A2A2A3A3A4An1AnAnϵ

Gibt es einen Algorithmus für dieses Problem mit einer besseren Laufzeit als ?O(n2)


2
Ist es nicht elementar, diesen Algorithmus in linearer Zeit zu implementieren? Könnte dies ein Hausaufgabenproblem sein?
Warren Schudy

Interessieren Sie sich für eine bestimmte Klasse von Grammatiken oder möchten Sie sich mit beliebigen Grammatiken befassen?
Raphael

1
Ich interessiere mich für die Behandlung beliebiger Grammatiken: Ich implementiere einen Earley-Parser, für den es hilfreich ist zu wissen, ob ein Nichtterminal die leere Zeichenfolge ableiten kann. Meine erste Reaktion war, dass dies in linearer Zeit trivial lösbar sein sollte, aber Grammatiken wie , B A erschweren die Sache. ABBA
Alex Ten Brink

Haben Sie einen Grund, solche Regeln in einer praktischen Situation beizubehalten?
Raphael

1
Ich implementiere einen Earley-Parser auf die hier beschriebene Weise: webhome.cs.uvic.ca/~nigelh/Publications/… . In dem in diesem Artikel verfolgten Ansatz muss man irgendwann die nullbaren Nichtterminale für eine Grammatik finden: Sobald diese bekannt sind, ist es sehr einfach, den Earley-Algorithmus an Epsilon-Produktionen anzupassen.
Alex Ten Brink

Antworten:


8

Kann man diesen Algorithmus nicht wie folgt in linearer Zeit implementieren? (Warnung, ich habe dies nicht zu sorgfältig Korrektur gelesen, daher sind Fehler wahrscheinlich.)

iciQciiZici=0ZQZ

QXQjXcjcjYYYQ


Sofern mir nichts fehlt, sollte Ihr Algorithmus funktionieren. Ich finde es nur sehr seltsam, dass ich, wenn ich im Internet nach einem Algorithmus für dieses Problem suche, auf der ersten Seite über ein halbes Dutzend Treffer erhalte, die eine Variation des Algorithmus beschreiben, den ich in meinem ersten Beitrag beschrieben habe - warum einen n-Quadrat-Algorithmus angeben? ob es einen einfachen linearen Algorithmus gibt?
Alex Ten Brink

Ein wahrscheinlicher Grund für die Angabe des quadratischen Algorithmus ist, dass er noch einfacher ist. Wenn Sie den Leuten nur ein Verständnis der Nullbarkeit vermitteln möchten, ist es sinnvoll, Implementierungsdetails auszublenden.
Warren Schudy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.