Kann mir jemand bei dieser Informatik Aufgabe helfen?
5. Entwickeln Sie eine Grammatik für Postanschriften. Die Terminale, also welche konkrete Straße etc. es sein könnte, sind nicht definiert. Es können für diese Grammatik also nur die anderen drei Bestandteile angegeben werden und die Produktionen auch nur bis zum letzten Schritt der Nichterminale durchgeführt werden. Beachten Sie die folgenden Aspekte:
Eine Postanschrift besteht aus einem Personenteil, gefolgt von einer Straße, gefolgt von der Stadt.
Der Personenteil besteht aus einem Titelteil und einem Namensteil, gefolgt von einem Zeilenende (letzteres wird üblicherweise mit EOL bezeichnet, das steht für „end of line").
Der Titelteil besteht aus einem Titel oder ist leer.
Der Vornamenteil besteht aus einem Vornamen oder einem Initial, auf den ein Punkt folgt.
Der Namensteil besteht aus einem Vornamensteil, einem Nachnamen oder aus einem Vornamensteil und wiederum aus einem Namensteil.
Eine Straße besteht aus einem Straßenname, gefolgt von einer Hausnummer, gefolgt von einem
Zeilenende.
Eine Stadt besteht aus einer Postleitzahl, gefolgt von einem Stadtname, gefolgt von einem
Zeilenende.
1 Antwort
Das ist eine Fleißaufgabe, bei der es nur darum geht, den relevanten Teil des Aufgabentexts in BNF zu übertragen. Das Kann man Top-Down (von der Anschrift zu ihren Bestandteilen) oder Buttom-Up (von den kleinesten Bestantteilen der Anschrift bis zur vollständigen Anschrift) machen. Ich bevorzuge Top-Down.
Der erste Schritt ist dann:
<Postanschrift> ::=
<Personenteil><Strasse><Stadt>
Diese Regel führt rechts von dem Zeichen "::=" drei neue Begriffe ein, die nacheinader derfiniert werden müssen. Dabei hilft der Aufgabentext:
<Personenteil> ::=
<Titel><Namensteil> EOL
<Titel> := Prof. | Dr. | <empty>
<Namensteil> ::=
<Vorname><Nachname>
<Vorname > ::= <Name>
<Nachname> ::= <Name>
<Name> ::=
<Buchstabe> | <Name><Buchstabe>
<Buchstabe> ::= A | ... | Z | a | ... | z
Das ist viel klein-Klein - eben eine Fleißarbeit. Bei den Titeln ist ein bißchen Phantasie gefragt, da die Aufgabe keine Vorgabe macht. Zu beachten ist, dass die Aufgabe die Verwendung einer Anrede nicht vorsieht! Zu beachten ist, dass die Aufgabe vorschreibt, den Personenteil mit EOL abzuschließen! Bei den Namen können Großbuchstaben und Kleinbuchstaben durcheinander gehen; das passt für Namen wie "McGregor", aber nicht für "O'Neill" und auch nicht für "Edler von Eselsschrey". Es gibt eben einen Unterschied zwischen Theorie und Praxis. .
DerStraßenteil geht ganz ähnlich:
<Strasse> ::=
<Strassenname> <Hausnummer> EOL
<Strassenname> ::= <Name>
<Hausnummer> ::= <Zahl>
<Zahl> ::= <Ziffer> | <Ziffer><Zahl>
<Ziffer> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Diese Grammatik hat den Schönheitsfehler, dass die Hausnummer mit führenden Nullen beginnen kann. Wenn die führende Ziffer einer Hausnummer keine Null sein soll, muss man hier noch eine Unterscheidung treffen; die Definition wird dadurch etwas umfangreicher.
Die Stadt ist ganz ähnlich zu defnieren wie die Hausnummer:
<Stadt> ::= <PLZ><Stadtname> EOL
<PLZ> ::=
<Ziffer><Ziffer><Ziffer><Ziffer><Ziffer><Ziffer>
<Stadtname> ::= <Name>
Bei der Postleitzahl ist eine führende Null zulässig. Die Definition der Postleitzahl mag auf den ersten Blick überraschen; sie erzwingt sechsstellige Postleitzahlen. Beim Stadtnamen könnte man noch mehr leisten, um so schöne Ortsbezeichnungen wie "Bad Homburg vor der Höhe" oder "Frankfurt/Main" zuzulassen.
Nach dem Aufgabentext könnte man Personen- und Ortsnamen aber als Terminale ansehen, dann müsste <Name> garnicht definiert werden.
Bei der Definition von Programmiersprachen wird ein Begriff wie "Variablenname" aber selbstverständlich definiert, da ist dann oft die Regel zu definieren, dass das erste Zeichen eines Variablennamens keine ziffer sein darf oder das das Zeichen "Underscore" u.U. eine Sonderbehandlung verlangt.