Noch von vorher…
<Programm> ::= 'PROGRAM' <Bezeichner> 'BEGIN' <Satzfolge> 'END' . <Bezeichner> ::= <Buchstabe> <Restbezeichner> <Restbezeichner> ::= | <Buchstabe oder Ziffer> <Restbezeichner> <Buchstabe oder Ziffer> ::= <Buchstabe> | <Ziffer> <Buchstabe> ::= A | B | C | D | ... | Z | a | b | ... | z *) <Ziffer> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 <Satzfolge> ::= ... ...
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 Σ*
Wege durch ein Syntaxdiagramm ergeben
Das Bild als PDF und als ODG zum Bearbeiten.
Nun kann man an Hand der Syntaxdiagramme die Korrektheit von E-Mail-Adressen oder Domainangaben prüfen.
Bestandteile von Syntaxdiagrammen:
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 |
(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
| 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) |
|---|
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.
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 |
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 ? ;