Lassen die Menge der Klemme und sein N die Menge der Nicht-Terminal - Symbole einiger kontextfreien Grammatik G .
Sagen , ich habe einen String , so dass x a y ∈ S ( G ) , wobei x , y ∈ ( & Sigma; ∪ N ) * und S ( G ) sind die Formen der sentential G .
Bei gegebenem möchte ich eine Menge C = { b ∣ w a b z ∈ S ( G ) , b ∈ Σ ∪ N } bestimmen .
Zur Verdeutlichung sind in diesem Fall Zeichenfolgen von Anschlüssen und Nichtanschlüssen und b hat die Länge eins.
Ich kann sehen, wie das geht, wenn auch die Länge eins hat; Jedes b ist ein Mitglied der folgenden Menge von a (einschließlich Nicht-Terminals).
Ich bin jedoch gespannt, ob es für eine Folge von Zeichen möglich ist. Für meine Anwendung, die Zeichenfolge nicht viel länger als die rechte Seite der Produktionen in G .
Die Unterscheidung zwischen Terminals und Nicht-Terminals ist in meiner Anwendung etwas stumm, da ich eine generative Grammatik verwende. und ich glaube, dass dies nicht zu viel Ärger führen wird, da Länge eins hat.
Antworten:
Ich werde einen Algorithmus beschreiben, der funktioniert. Die Laufzeit sollte nicht schlecht sein. Sie können auch einiges davon vorberechnen.
Wir verwenden eine Anpassung des Earley-Algorithmus . Sie sollten diesen Algorithmus zuerst verstehen. Unser Algorithmus funktioniert fast genauso, außer dass unsere Initialisierungs- und Abschlussschritte unterschiedlich sind.
Jetzt führen wir den Earley-Algorithmus für jedes mögliche derartige anfängliche Earley-Element separat durch. Wir können nicht einfach alle gleichzeitig ausführen, da sich die Parses gegenseitig stören können. Ich kann keine schnellere Methode als das Zurückverfolgen hier sehen.
Bearbeiten: Ich glaube, ich habe die Methode gefunden, mit der der größte Teil des durch das Backtracking verursachten Overheads entfernt wird. Wir verknüpfen mit jedem Earley-Element eine Reihe von Bezeichnern, die Zeichenfolgen sind, da wir Präfixe dieser Bezeichner verwenden müssen. Bei der Initialisierung fügen wir alle anfänglichen Elemente zum Earley-Set hinzu und ordnen jedem Set eine eindeutige Kennung zu.
In den Scanner- und Prädiktorschritten werden Kennungen auf neue Elemente übertragen. Earley-Elemente in demselben Earley-Set, die sich nur in ihren Kennungen unterscheiden, werden zusammengeführt, indem ihre Kennungen zusammengeführt werden. Beachten Sie, dass wir für diese neuen Elemente Scanner- und Prädiktorschritte mit Bezeichnern ausführen können, ohne diesen Schritt für jeden Bezeichner separat ausführen zu müssen.
Im Wesentlichen führen wir das Backtracking mit diesen Kennungen durch, damit wir nicht doppelt in den Scanner- und Prädiktorschritten arbeiten.
quelle