Regulärer Ausdruck < Formale Sprachen < Theoretische Inform. < Hochschule < Informatik < Vorhilfe
|
Aufgabe | Geben sie die entsprechende Sprache L(R) an und eine entsprechende Typ 3 Grammatik.
R := SZ(epsilon|(.Z))(epsilon|((E|e)SZ)), wobei
S := (epsilon|+|-)
Z := zz*
z := (0|1|2|3|4|5|6|7|8|9)
dabei gilt: Sigma :={e,E,+,-,.,0,1,2,3,4,5,6,7,8,9}
Beispiele für Fließkommazahlen: 0.815, +47e11, -42.42E+42, 7
|
Kann mir jemand helfen, bzw erklären wie ich da vorgehen muss???
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Hallo,
Um L(R) anzugeben, musst Du Dir zunächst überlegen, was die einzelnen Nichtterminalsymbole der linken Regelseiten (also z, Z, S, R) erzeugen.
Offensichtlich gilt:
z (= "Ziffer") erzeugt eine einzelne Ziffer von 0 bis 9
Z (= "Zahl") erzeugt dann also eine positive ganze Zahl
(d.h. nichtleere Folge von Ziffern)
S (dürfte für "Sign" stehen) liefert ein Vorzeichen:
-> entweder kein Vorzeichen (= "epsilon")
-> oder Plus ("+")
-> oder Minus ("-")
R setzt "alles zusammen", d.h. erzeugt folgende Zeichenreihe:
-> Zusammensetzen von S (Vorzeichen) und Z (Zahl)
-> optional eine weitere positive ganze Zahl
mit Komma getrennt anhängt
-> optional eine weitere verzeichenbehaftete Zahl
mit E oder e getrennt.
Also grob in Worten: L(R) enthält alle Fließkommazahlen in der Form, wie sie durch die Beispiele angegeben sind:
0.815
+47e11
-42.42E+42
7
usw. ...
Es gibt verschiedene Möglichkeiten, einen regulären Ausdruck dafür zu erstellen.
Die (wie ich finde) unfangreichere, aber sicherere Methode ist das Zeichnen eines deterministischen endlichen Automaten, aus dem Du dann die regulären Ausdrücke der Zustände in Form eines Gleichungssystems bestimmst und letzteres unter Verwendung des Resolutionslemmas auflöst.
Ich weiß aber nicht, ob Ihr das in der Vorlesung behandelt habt.
Die zweite Möglichkeit ist, den Ausdruck "per Hand" zu erstellen. Dabei fängst Du mit den "atomaren" Ausdrücken an (leider schreibst Du nicht, in welcher Form ("Syntax") reguläre Ausdrücke in Deiner Vorlesung / im Skript definiert wurden, darum verwende ich die, die ich kenne).
Ein Ausdruck für Z wäre z.B.:
$R(Z) = (0-9)^+$ (= nichtleere Folge von Ziffern aus 0 bis 9)
oder $R(Z) = [mm] (0-9)(0-9)^\*$ [/mm] , je nach Syntax
Für S erhälst Du:
$R(S) = (+|-)$
Nun hast Du reguläre Ausdrücke für Z und S. Damit erhälst Du für R:
$R(S) = (+|-)(0-9)^+[.(0-9)]$ ... usw. (der Ausdruck ist nicht ganz vollständig, weil etwas Arbeit bleiben soll )
Kommst Du damit weiter?
Viele Grüße,
neuling_hier
|
|
|
|