Formale Sprachen und Grammatiken Jede Sprache besitzt die Aspekte Semantik (Bedeutung) und Syntax (formaler Aufbau). Die zulässige und korrekte Form der Wörter und Sätze einer Sprache wird durch die Syntax der Sprache festgelegt. Die Methode, wie eine Syntax einer Sprache festgelegt wird ist eine Grammatik. Die Grammatik von natürlichen Sprachen und Programmiersprachen Bei natürlichen Sprachen beschreibt die Grammatik (unter anderem), wie Sätze gebildet werden können. Es gibt verschiedene Ansätze, aber ein gängiger ist, den Satzbau durch Regeln zu beschreiben. Bei Programmiersprachen beschreibt die Grammatik, wie Programmtexte gebildet werden können. Es gibt verschiedene Ansätze, aber ein gängiger ist, Programmtexte durch Regeln zu beschreiben. Beispiel (Typische Grammatikregeln) Subjekt Artikel Adjektivliste Substantiv Artikel Adjektivliste Informatik Die Adjektivliste Informatik Die Adjektiv Informatik Die zuckersüße Informatik Der gebildete Student Der Adjektiv Student Der Adjektiv Substantiv Der Adjektivliste Substantiv Artikel Adjektivliste Substantiv Subjekt Anwenden von Regeln (Ableiten) Klasse class Bezeichner { Methodenliste } class Atom { Methodenliste } class Atom { Methode } class Atom { Atom () {}} Herausfinden der Regelanwendungen (Parsen) class Molecule { int strange () {return 0; }} class Molecule { Methode } class Molecule { Methodenliste } class Bezeichner { Methodenliste } Klasse Ersetzungsregeln reichen nicht aus, um die gesamte Komplexität natürlicher Sprachen oder die gesamte Komplexität von Programmiersprachen zu beschreiben. Grammatikregeln sind Ersetzungsregeln. Es gibt Teile, die noch ersetzt werden, und Teile, die nicht mehr ersetzt werden. Die Teile, die nicht weiter ersetzt werden, nennt man wieder Terminale. Die Teile, die noch weiter ersetzt werden, nennt man wieder Nonterminale. Wieso sind Grammatiken wichtig? Mit Hilfe von Grammatikregeln kann man eindeutig beschreiben, welche Programmtexte»korrekt«sind. Dies ist wichtig, damit klar ist, worüber man überhaupt redet. Man kann auch die Struktur von Programmen beschreiben. Dies ist wichtig, damit man Programme übersetzen kann. Man kann anhand der Grammatik die Struktur von Programmen herausfinden. Diesen Vorgang nennt man parsen. Dies ist eine der ersten und wichtigsten Aufgaben von Übersetzern. Das Problem dabei ist, dass es so nicht klar ist, wie parsen für eine Grammatik funktioniert. Man kann nämlich oft sehr viele Regeln rückwärts anwenden.
Die Theorie der Zeichenketten erlaubt es, Grammatiken automatisch in effiziente Parser zu verwandeln. Was ist eine Sprache? Was ist eine formale Sprache? Natürlichen Sprachen sind komplexe Dinge, bestehend aus Wörtern, ihrer Aussprache, einer Grammatik, Ausnahmen, Dialekten, und vielen mehr. Bei formalen Sprachen vereinfacht man radikal. Definition (Alphabet). Ein Alphabet ist eine nicht-leere, endliche Menge von Symbolen (auch Buchstaben genannt). Definition (Wort). Ein Wort ist eine (endliche) Folge von Symbolen. Definition (Formale Sprache). Eine formale Sprache ist eine (oft unendliche!) Menge von Worten für ein festes Alphabet. Wortproblem: Nehmen wir an, wir haben eine (eventuell sehr komplexe) Sprache L Σ * (Menge aller Worte über dem Alphabet Σ, einschließlich dem leeren Wort) festgelegt. Das Wortproblem für L ist folgendes Problem: Eingabe: Ein Wort w Σ *. Ausgabe»w L«oder»w L«. Beispiel Betrachte die Sprache aller Java-Programmtexte. Das Wortproblem ist die Frage, ob ein Text ein Java-Programm ist. Dieses Wortproblem muss der Übersetzer lösen. Was ist eine formale Grammatik? Definition Eine formale Grammatik besteht aus vier Dingen (nach Chomsky): Einer Menge N von Nonterminalen (Nonterminalalphabet). Einer Menge T von Terminalen (Σ = Terminalalphabet). Einem Startsymbol S N. Einer Menge von Ersetzungsregeln (Produktionssystem) der Form»linke Seite (oder:=)rechte Seite«. Terminalsymbole: T deutsch = {a,..., z, A,..., Z,... Abgeordneter,.der, Professor, Student,...} T programm = {..., =, <, &,..., if, while, do,...} Nonterminalsymbole: N deutsch = {< Satz >,< Subjekt >,< Praedikat >,< Objekt >,< Artikel >,...} N programm = {...< Programm >,< Anweisung >,< Ausdruck >,< Alternative >...} Ersetzungsregeln: <Satz> <Hauptsatz> <Nebensatz>,... <while-anweisung> while (<Ausdruck> )<Anweisung>,... Grammatik: 1) Nonterminale N = {S, X, Y} Terminale T = {a, c, g, t} Startsymbol = S Die Regeln lauten: S as cs gs ts X X atgy Y ay cy gy ty ε
2) Nonterminale N = {A, B} Terminale T = {a, b} Startsymbol = S Die Regeln lauten: S B A a aa B aab abb Häufig wird die Form von Syntaxdiagrammen verwendet.
Reguläre Grammatiken Definition Bei einer regulären Grammatik wird immer ein Nonterminal durch eine Folge von Terminalen gefolgt von einem oder keinem Nonterminal ersetzt. Bemerkungen In jeder Ableitung mittels einer regulären Grammatik haben alle Satzformen genau ein Nonterminal am Ende, bis auf das abgeleitete Wort. Mit regulären Grammatiken kann man Sprachen beschreiben wie»enthält acc, aber nicht atg«. Mit regulären Grammatiken kann z.b. Java-Bezeichner beschreiben. Komplexe Sprachen wie Java lassen sich nicht mit regulären Grammatiken beschreiben. Reguläre Grammatiken sind die einfachsten Grammatiken. 1) 2) Kontextfreie Grammatiken Definition Bei einer kontextfreien Grammatik wird immer ein Nonterminal durch eine beliebige Folge von Terminalen und Nonterminalen ersetzt. Bemerkungen Kontextfreie Grammatiken können verschachtelte Strukturen beschreiben wie Klammerausdrücke oder HTML. Komplexe Sprachen wie Java lassen weitgehend, aber nicht vollständig mit kontextfreien Grammatiken beschreiben. Kontextfreie Grammatiken können mehr als reguläre Grammatiken. 1) 2) Formale Grammatiken kann man benutzen, um formale Sprachen zu erzeugen und zu beschreiben.
Übungen 1. <Satz> <Nominalphrase> <Verbalphrase> <Nominalphrase> <Artikel> <Substantiv> <Verbalphrase> <Verb> <Nominalphrase> <Artikel> der <Artikel> das <Substantiv> Hund <Substantiv> Kind <Verb> beißt Erzeuge einen Satz m. H. der obigen Grammatik. 2. G = (Σ, N, P, S) Σ = {a, b, c}, N = {S, B} P: S ε asbc ; cb Bc; ab ab; bb bb. Welche Sprache wird durch diese Grammatik beschrieben? 3. Entwickle eine Grammatik G, die folgende Sprache beschreibt: L (G) = {a n b n / n N} 4. G = (Σ, N, P, S) Σ = {a, b}, N = {S, B} P: S ab, B bb a Welche Sprache wird durch diese Grammatik beschrieben? 5. Welche Sprache wird durch folgende Grammatiken erzeugt? a) b)