Entwickler-Ecke

Open Source Projekte - Beispiel für contextfreie Grammatik


Fiete - Do 15.05.08 09:52
Titel: Beispiel für contextfreie Grammatik
Das Programm ist entstanden, um die Grundzüge einer formalen Sprachen zu verdeutlichen.
Im Compilerbau wird im wesentlichen mit contextfreien Grammatiken gearbeitet.

In der doc-Datei sind die Definitionen der verschiedenen Grammatiktypen beschrieben, wer will kann die Aufgaben auch noch lösen :wink: .

In diesem Beispielprogramm sind die Nonterminals sind gross geschrieben.

Die Regel START -> AUSS, FRAGE, VORG, GESPR sähe in BNF so aus
<START> -> <AUSS>|<FRAGE>|<VORG>|<GESPR>, abstrahiert S -> A|F|V|G

Die Regelmenge:
START -> AUSS, FRAGE, VORG, GESPR // Aussage, Frage, Vorgang, Gespräch
AUSS -> der+WESEN+ZUST+ADJ, NAME+ZUST+ADJ // Zustand und Adjektiv
FRAGE -> " _ZUST+NAME+ADJ _?_"&+fragte+der+WESEN
VORG -> SUBJ+VERB1, SUBJ+VERB1_&+FOLGE+VERB2+SUBJ // Subjekt und Verb
GESPR -> " _AUSS_ ."&+sagte+NAME+zu+OBJ3 // Objekt
FOLGE -> danach, daraufhin, deshalb, jetzt, dann
ZUST -> ist, war
WESEN -> Hobbit, Zauberer, Ork, Balrog, Elb, Zwerg, Uruk-hai, Ent
NAME -> Frodo, Sam, Bilbo, Gandalf, Gollum, Sauron, Boromir, Baumbart, Aragorn, Eowen, Arwen // alles Terminals
SUBJ -> ein+ADJ_er+WESEN, ein+WESEN, der+WESEN, NAME
OBJ1 -> einen+ADJ_en+WESEN, einen+WESEN
OBJ2 -> einen+MSUB, eine+FSUB, ein+NSUB
OBJ3 -> einem+WESEN, einem+ADJ_en+WESEN
MSUB -> Knochen, Ring, Fisch, Schatz, Schlüssel
FSUB -> Frau, Axt, Mauer, Armbrust, Lanze
NSUB -> Schwert, Pferd, Buch
VERB1 -> erschreckte+OBJ1, verjagte+OBJ1, nahm+OBJ2, gab+NAME+OBJ2, entdeckte+OBJ1, tötet+NAME, liebt+NAME
VERB2 -> starb, verschwand, flüchtete, schrie, erwachte
ADJ -> klein, dick, stark, gefährlich, harmlos, mutig, verzweifelt, mutlos, listig, wütend, hungrig, uralt
Die Sonderzeichen +, _ und & werden am Schluss umgewandelt,+ in Lerrzeichen, _ wird gelöscht und & in ein Komma.

Je mehr die Regeln abstrahiert werden desto undurchsichtiger werden sie für Aussenstehende.

Die mitgelieferten Regeldateien sind Beispiele was alles möglich ist.
Die generierten Sätze sind syntaktisch korrekt, semantisch nicht immer :)

Viel Spaß beim Erfinden neuer Regeln!
Fiete

Edit: Habe das Regelformat geändert:
START -> AUSS | FRAGE | VORG | GESPR
AUSS -> der+WESEN+ZUST+ADJ | NAME+ZUST+ADJ
FRAGE -> "ZUST+NAME+ADJ?",+fragte+der+WESEN
VORG -> SUBJ+VERB1 | SUBJ+VERB1,+FOLGE+VERB2+SUBJ
GESPR -> "AUSS.",+sagte+NAME+zu+OBJ3
FOLGE -> danach | daraufhin | deshalb | jetzt | dann
ZUST -> ist | war
WESEN -> Hobbit | Zauberer | Ork | Balrog | Elb | Zwerg | Uruk-hai | Ent
NAME -> Frodo | Sam | Bilbo | Gandalf | Gollum | Sauron | Boromir | Baumbart | Aragorn | Eowen | Arwen
SUBJ -> ein+ADJer+WESEN | ein+WESEN | der+WESEN | NAME
OBJ1 -> einen+ADJen+WESEN | einen+WESEN
OBJ2 -> einen+MSUB | eine+FSUB | ein+NSUB
OBJ3 -> einem+WESEN | einem+ADJen+WESEN
MSUB -> Knochen | Ring | Fisch | Schatz | Schlüssel
FSUB -> Frau | Axt | Mauer | Armbrust | Lanze
NSUB -> Schwert | Pferd | Buch
VERB1 -> erschreckte+OBJ1 | verjagte+OBJ1 | nahm+OBJ2 | gab+NAME+OBJ2 | entdeckte+OBJ1 | tötet+NAME | liebt+NAME
VERB2 -> starb | verschwand | flüchtete | schrie | erwachte
ADJ -> klein | dick | stark | gefährlich | harmlos | mutig | verzweifelt | mutlos | listig | wütend | hungrig | uralt

als Sonderzeichen gibt es nur noch '+', ist mir zu spät eingefallen :oops:


Calculon - Do 15.05.08 10:22

Ähh, wie erstelle ich Texte? Ich lad die Regeln und dann tut sich bei mir gar nix...


Fiete - Do 15.05.08 12:47

Moin Calculon,
clicke mal auf das Label HERR DER RINGE :wink:
Gruß
Fiete


Calculon - Do 15.05.08 13:15

Ahh, danke, jetzt funzt's...
Ich glaub' ich werd' mal demnächst 'ne Regeldatei erstellen mit der man höchstversaute Sätze/Konversationen (nein liebe mods, die werde ich natürlich nicht hochladen ^^) hinkriegt und wahrscheinlich viel lachen. Schönes Ding, v.a. weil auch Open-Source und es ein Thema ist, das mich interessiert :zustimm:. Auch die mitgelieferte .doc-Datei ist sehr informativ, wobei man in ihr doch die Unterschiede zwischen LaTeX und Word deutlich erkennen kann...

Gruß

Calculon
--