LbP Parser

Aus ProgrammingWiki
Archivierte Version vom 2011-01-10T19:12:34+00:00. Aktuelle Version

Parser für kontextfreie Sprachen

Einfache Grammatik für englische Sätze

Nichtterminale: SATZ, NP, VP, NOM, VERB, ART, ADJ Die Symole stehen für Satz, Nominalphrase, Verbalphrase, Nomen, Verb, Artikel und Adjektiv.
Terminale: boy, girl, ball, kicked, loves, the, a, happy, sad
Produktionen:

SATZ 	-> 	NP VP;
NP 	-> 	ART NP | ART ADJ NP;
VP 	->	VERB NP;
NOM	->	boy | girl | ball;
VERB 	->	kicked | loves;
ART	->	the | a;
ADJ	->	happy | sad.

Spitzensymbol: SATZ

Repräsentation eines Parsers für diese Grammatik mit Prolog

Das Parsing ist äusserlich bekanntlich nicht sehr spektakulär: <eval id="4b8bd388a09e4"> satz([the,happy,boy,loves,a,sad,girl]). </eval>

Syntaktisch fehlerhafte Sätze werden zurückgewiesen: <eval id="4b8bd388a159c"> satz([the,happy,boy,loves,sad,girl]). </eval>

Der Parser kann auch als Satzgenerators eingesetzt werden: <eval id="4b8bd388a2152">satz(X).</eval>

Der Versuch, alle erzeugbaren Sätze in eine Liste zu generieren, scheitert aus Ressourcengrüden. Da sind wir (weiter unten) mit Differenzlisten wesentlich erfolgreicher. <eval id="4b8bd388a2d26">findall(X,satz(X),Xs).</eval>

Parser mit Anwendung der Differenzlistentechnik

Dies kann durchaus das Produkt einer automatischen Programmtransformation sein. Wir fügen ein parse-Prädikat hinzu, um den Aufruf komfortabler zu gestalten.

Wir überprüfen den Satz the happy boy loves a sad girl auf syntaktische Korrektheit: <eval id="4b8bd388a38ea">parse([the,happy,boy,loves,a,sad,girl]).</eval>

parse kann auch als Satzgenerator verwendet werden: <eval id="4b8bd388a4483">parse(X).</eval>

Man kann die Anzahl der erzeugbaren Sätze bestimmen: <eval id="4b8bd388a505a">findall(X,parse(X),Ys),length(Ys,Z),write(Z).</eval>

Parser für a^nb^mc^j, für n,m,j>0

SATZ	-> AS BS CS;
AS	-> a | a AS;
BS	-> b | b BS;
CS	-> c | c CS.

Dies ist eine sehr einfache Grammatik. {a,b,c} ist die Menge der Terminale. Die Anzahlen der a’s, b’s und c’s können also ganz unterschiedlich sein.

Aufrufbeispiel: <eval id="4b8bd388a5b5c">abcsatz1([a,a,a,a,a,a,b,b,b,b,b,c,c,c,c,c]).</eval>

Der Parser ist nicht in der Lage, syntaktisch fehlerhafte abc-Wörter als solche zu erkennen. Dies ist für den folgenden Lösungsvorschlag kein Problem: Sobald das erste b erscheint, werden alle Klauseln, die für a zuständig waren, aus der Datenbasis entfernt. Später verfährt das Programm mit c ganz analog.

Die folgende Frage wird nach sehr kürzer Rechenzeit mit No beantwortet. <eval id="4b8bd388a6715">abcsatz([a,a,a,a,a,a,a,a,b,b,b,b,b,b,c,c,b,c,c,c]). Der Nachteil dieses Vorschlags besteht darin, dass vor jedem Anfrage die Datenbasis auf’s Neue geladen werden muss.</eval>