====== Sprachbeschreibung ======
Noch von vorher...
----
* [[Kellerautomat]]: Automat um Kellerspeicher erweitert; kann Kontextfreie Sprachen erkennen
* kontextfreie Sprachen: Sprachen, die durch eine kontextfreie Grammatik erzeugt werden
* kontextfreie Grammatik: kontextsensitive Grammatik, bei der genau ein Nichtterminal durch Nichtterminale und/oder Terminale ersetzt wird; Bsp: BNF
* BNF: Backus-Naur-Form; Metasprache zur Definition kontextfreier Grammatiken; Bsp. aus Wikipedia:
::= 'PROGRAM' 'BEGIN' 'END' .
::=
::= |
::= |
::= A | B | C | D | ... | Z | a | b | ... | z *)
::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
::= ...
...
* EBNF: Erweiterte BNF; alles aus EBNF lässt sich auch mit BNF darstellen; EBNF ist nur besser lesbar und kürzer
----
Grammatiken, Syntaxdiagramme, reguläre Ausdrücke
endliche Automaten
Beispiel: Eingabe einer E-Mail-Adresse; Überprüfung auf Korrektheit; Was heießt korrekt?; Aufbau nach RFC 2822 (Requests for Comments - seit 7. April 1969);
Die Menge der korrekt gebildeten E-Mail-Adressen ist eine formale Sprache bestehend aus: Alphabet -> Wort -> Sprache (Alle gültigen Worte)
Alphabet (stark vereinfacht):
Σ={a, b, c, ., @}
Wort: Hintereinanderreihung endlicher vieler Zeichen aus dem Alphabet.
Σ* ist die Menge aller möglichen Wörter über Σ
(formale) Sprache über Alphabet Σ ist eine Teilmenge von Σ*
==== Syntaxdiagramme ====
Wege durch ein Syntaxdiagramm ergeben
* einen Buchstaben
* ein Wort
* einen korrekten Namen: Name -> Buchstabe [->b->] -> Buchstabe [->c->] ->
* eine Domainangabe
* eine korrekte E-Mail-Adresse
* ...
{{:informatik-buch:theoretische_informatik:syntaxdiagramme.png?600|}}
Das Bild {{:informatik-buch:theoretische_informatik:syntaxdiagramme.pdf|als PDF}}
und
{{:informatik-buch:theoretische_informatik:syntaxdiagramme.odg|als ODG}} zum Bearbeiten.
Nun kann man an Hand der Syntaxdiagramme die Korrektheit von E-Mail-Adressen oder Domainangaben prüfen.
Bestandteile von Syntaxdiagrammen:
* Terminalsymbole : Bestandteile des Alphabets zum Aufbau des jeweiligen Konstrukts (z.B. @ und .)
* Nichtterminalsymbole: Mit Hilfe weiterer Syntaxdiagramme schon beschriebene Einheiten, die ebenfalls dem Aufbau des Konstruktes dienen. (z.B Name oder Domainangabe)
==== Übersetzung der Syntaxdiagramme in Produktionsregeln ====
Die Produktionen (Regeln) zu E-Mail-Adressen mit vereinfachtem Alphabet
| Buchstabe | B -> a \\ B -> b \\ B -> c |
| Name | N -> B \\ N -> NB |
| Domainangabe | V -> N \\ V -> V.N \\ H -> BB \\ D -> V.H |
| E-Mail-Adresse | A -> N \\ A -> A.N \\ E -> A@D |
==== Die Ableitung ====
(auch Worterzeugung) eines Worts durch die Produktionsregeln entspricht einem Weg durch die Syntaxdiagramme.
Z.B.:
E -> A@D -> A.N@D -> A.N@V.H -> A.N.N@V.H -> A.N.N@V.N.H -> N.N.N@V.N.H -> N.N.N@N.N.H -> ... -> a.cba.ac@adda.a.ca
==== Grammatikbegriff ====
^ Eine Grammatik besteht aus ^ Beispiel ^
| einer endlichen nichtleeren Menge T von Terminalsymbolen, | T = {a, b, c, ., @} |
| einer endlichen nichtleeren Menge N von Nichtterminalsymbolen, | N = {E, D, N, B, A, H, V} |
| einer endlichen Menge P vpn Produktionen (Regeln) und | P = {B -> a, B -> b, ..., E -> A@D} |
| einem Startsymbol S∈N. | E |
Kurz:
^ G = ( T, N, P, S) ^
==== Sprache zur Grammatik ====
Eine Grammatik G = {T, N, P, S} erzeugt eine Sprache
^ L(G) ^
über dem Alphabet T. L(G) ist dabei die Menge der Wörter über T, die vom Startsymbol S mit Hilfe der Produktionen aus P abgeleitet werden können.
==== Die Backus-Naur-Schreibweise ====
ist eine Kurzschreibweise für Produktionen. Gibt man eine Grammatik in Backus-Naur-Form an, nutzt man meist die Abkürzung BNF.
Beispiel:
^ Normalform ^ BNF ^
| B-> a \\ B -> b \\ B -> c \\ N -> B \\ N -> BN \\ H -> .N \\ H -> .NH \\ D -> NH \\ E -> N@D | B -> ''a|b|c'' \\ \\ \\ N -> ''B | BN'' \\ \\ H -> ''.N | .NH'' \\ \\ D -> ''NH'' \\ E -> ''N@D'' |
==== Die EBNF ====
ist eine Erweiterung der BNF. Sie erlaubt einfachere optionale Elemente und Wiederholung von Elementen. Sie kann nicht mehr sondern lediglich einfacher dasselbe darstellen. Beispiel aus Wikipedia:
(* ein einfaches Beispiel in EBNF − Wikipedia *)
Programm = 'PROGRAM' Bezeichner
'BEGIN'
{ Zuweisung [";"] }
'END' "." ;
Bezeichner = Buchstabe { ( Buchstabe | Ziffer ) } ;
Zahl = [ "-" ] Ziffer { Ziffer } ;
String = '"' { AlleZeichen − '"'} '"' ;
Zuweisung = Bezeichner ":=" ( Zahl |
Bezeichner |
String ) ;
Buchstabe = "A" | "B" | "C" | "D" | "E" | "F" | "G"
| "H" | "I" | "J" | "K" | "L" | "M" | "N"
| "O" | "P" | "Q" | "R" | "S" | "T" | "U"
| "V" | "W" | "X" | "Y" | "Z" ;
Ziffer = "0" | "1" | "2" | "3" | "4" | "5" | "6"
| "7" | "8" | "9" ;
AlleZeichen = ? alle sichtbaren Zeichen ? ;