formale sprachen teil 3 klaus becker 2006. 2 syntax und semantik
Post on 06-Apr-2015
112 Views
Preview:
TRANSCRIPT
Formale SprachenTeil 3
Klaus Becker
2006
2 Syntax und Semantik
3 Teil 1
Mini-Programmiersprache
4 Zielsetzung
Ziel ist es, für eine einfache Programmiersprache einen Interpreter und einen Compiler zu entwickeln. Die hier betrachtete Programmiersprache orientiert sich an der Sprache zur Steuerung des Roboters Karol.
hinlegenschrittwiederhole solange NichtIstZiegel wiederhole solange NichtIstWand schritt *wiederhole linksDrehen*wiederhole
1
5 Die Programmiersprache
Zur Vereinfachung der Darstellung verwenden wir abkürzende Bezeichner für die Anweisungen der Programmiersprache.
hinlegenschrittwiederhole solange NichtIstZiegel wiederhole solange NichtIstWand schritt *wiederhole linksDrehen*wiederhole
hswh nz wh nw s *wh l*wh
6 Die Programmiersprache MyKa
Elementare Anweisungen:h „Ziegel hinlegen“a „Ziegel aufheben“s „Schritt vorwärts“l „links drehen“r „rechts drehen“
hswh nz wh nw s *wh l*whElementare Bedingungen:
nz „nicht auf Ziegel“nw „nicht vor Wand“
Kontrollanweisung:wh ... ... „wiederhole solange ...“ *wh
Ein MyKa-Programm setzt sich – wie im Beispiel gezeigt – aus elementaren und Kontrollanweisungen zusammen. Bei der Darstellung von MyKa-Programmen dürfen mehrere Anweisungen in eine Zeile geschrieben werden, ...
7 Zweistufige Sprachbeschreibung
Zeichen:Zeichen:
{h, a, s, l, r, nz, nw, wh, *wh}
{h s wh nz wh nw s *wh l *wh , ...}
Sätze / Tokenfolgen:Sätze / Tokenfolgen:
Wörter / Token:Wörter / Token:
{ASCII: a, b, c, ..., ´*´, ´ ´, chr(13), chr(10), ...}
Festlegung der korrekten Token (Wörter)
Festlegung der korrekten Tokenfolgen (Sätze)
Oft ist es sinnvoll, eine formale Sprache zweistufig festzulegen:
Zeilenumbruch
Zeilenumbruch
Alphabet für Token
Alphabet für Programme
Sprache der Token
Sprache der Programme
8 Eine Grammatik für MyKa
! Terminalsymbole
S = sL = lR = rH = hA = aNW = n wNZ = n zWHA = w hWHE = '*' w h
...
...
"Start Symbol" = <Programm>
! Produktionen <Programm> ::= <Anweisungsfolge><Anweisungsfolge> ::= <Anweisung> <Anweisungsfolge> ::= <Anweisung> <Anweisungsfolge><Bedingung> ::= NW<Bedingung> ::= NZ<Anweisung> ::= S<Anweisung> ::= L<Anweisung> ::= R<Anweisung> ::= H<Anweisung> ::= A<Anweisung> ::= WHA <Bedingung> <Anweisungsfolge> WHE
MyKa1.grm
9 Aufgabe
Starten Sie das Werkzeug „GOLD Parser Builder“ und laden Sie die Datei „MyKa1.grm“. Testen Sie die hier vorgegebene Grammatik zur präzisen Festlegung der Programmiersprache MyKa.
10 Es fehlt die Semantik
Bisher wurde nur die Syntax der Sprache MyKa festgelegt. Die Bedeutung der einzelnen Sprachelemente scheint klar zu sein. Aber ist das wirklich so? Bereits bei der elementaren Anweisung „h“ ist nicht klar, wie viele Ziegel hingelegt werde, ob der / die Ziegel in die Zelle, in der sich der Roboter befindet, gelegt werden, oder in die vor dem Roboter usw. .
Ziel ist es im Folgenden, auch die Semantik der Programmiersprache exakt zu beschreiben. Zwei Ansätze sollen hierzu vorgestellt werden: Zum einen soll die Bedeutung der Konstrukte der Sprache MyKa durch das Verhalten eines Interpreters festgelegt werden (Interpreteransatz). Zum anderen soll die Bedeutung von Konstrukten der Sprache MyKa auf die Bedeutung der Konstrukte einer anderen (bereits bekannten) Sprache zurückgeführt werden (Übersetzeransatz).
Letztlich werden hier somit ein Interpreter und ein Übersetzer (Compiler) für die Programmiersprache MyKa entwickelt. Zur syntaktischen Vorbereitung werden zudem ein Scanner und ein Parser für diese Sprache benutzt.
11 Teil 2
Scanner und Parser
12 Syntaxanalyse
Zur Analyse der Syntax der Sprache MyKa sollen im Folgenden ein Scanner und ein Parser entwickelt werden. Nach der Syntaxanalyse soll feststehen, ob eine vorgegebene Zeichenfolge ein syntaktisch korrektes MyKa-Programm darstellt.
hswh nz wh nw s *wh l*wh
13 Scanner
Aufgabe eines Scanners ist es, aus einer Zeichenfolge lexikalische Einheiten zu bilden und diese als Tokenfolge aufzubereiten.
hswh nz wh nw s *wh l*wh
Scanner
h s wh nz wh nw s *wh l *wh
Scanner-Automat
14 Scanner-Automat
n
q0
q1
q20
q3
q30
´ ´; chr(13)
q2
q10
´ ´; chr(13); chr(10)
w
*
zw
h
s; l; r; h; a
Fehlerzustand
Der Scanner benutzt einen endlichen Automaten zur Erkennung der lexikalischen Einheiten.
Immer dann, wenn der Endzustand erreicht wird, ist ein Token erkannt. Danach beginnt der Scanner seine Arbeit wieder im Anfangszustand.
w
15 Parser
Aufgabe eines Parsers ist es, eine Tokenfolge auf syntaktische Korrektheit zu analysieren (und evtl. die Tokenfolge geeignet aufzubereiten).
Parser
Ok!
Parser-Automat
h s wh nz wh nw s *wh l *wh
16 Parser-Automat
q0
q1
q2
any / s : any / l :any / r : any / h :any / a :
wh / *wh : pop
any / wh : push wh
Der Parser benutzt einen Kellerautomaten zur syntaktischen Analyse der Tokenfolge.
any / nz : any / nw :
else / *wh : any / nz :any / nw :
any / s : any / l :any / r : any / h :any / a :
any / wh :any / *wh :
Fehlerzustand
Oberstes Kellerzeichen /
Eingabezeichen: Kelleroperation
Der Kellerautomaten akzeptiert eine Zeichenfolge, wenn der Automat nach Abarbeitung der Zeichenfolge im Enzustand ist und wenn zudem der Keller leer ist.
17 Aufgabe
Testen Sie den implementierten Scanner.
Schauen Sie sich die Implementierung an.
Berücksichtigen Sie beim Scanner-Automaten zusätzlich folgende Kontrollanweisung:
if <Bed.> th <Anw.> el <Anw.> *if
Ergänzen Sie die Implementierung des Scanner-Automaten entsprechend und testen Sie den erweiterten Scanner.
18 Aufgabe
Testen Sie den implementierten Parser.
Schauen Sie sich die Implementierung an.
Berücksichtigen Sie beim Parser-Automaten zusätzlich folgende Kontrollanweisung:
if <Bed.> th <Anw.> el <Anw.> *if
Ergänzen Sie die Implementierung des Parser-Automaten entsprechend und testen Sie den erweiterten Parser.
19 Teil 3
Ein Programm-Interpreter
20 Interpreter
Ein Interpreter führt die Anweisungen Schritt für Schritt aus. Er beschreibt damit das Verhalten der jeweiligen Anweisungen.
Eine präzise Interpreter-beschreibung kann somit zur Festlegung der Semantik der Elemente der Programmier-sprache benutzt werden (Interpreter-Semantik).
Zustand vorher: abzuarbeitendes Programm;
Roboterwelt
h s wh nz wh nw s *wh l *wh
Zustand nachher: abzuarbeitendes Programm;
Roboterwelt
21 Ausführungstransformationen
h s wh nz wh nw s *wh l *wh
s wh nz wh nw s *wh l *wh
wh nz wh nw s *wh l *wh
1
wahr
wh nw s *wh l wh nz wh nw s ...
1
...
22 Ausführungstransformationen
s wh nw s *wh l wh nz wh nw s ...
wh nw s *wh l wh nz wh nw s ...
1
wahr
s wh nw s *wh l wh nz wh nw s ...
1
wh nw s *wh l wh nz wh nw s ...
1
1
...
wahr
23 Ausführungstransformationen
l wh nz wh nw s *wh l *wh
wh nz wh nw s *wh l *wh
1
falsch
wh nw s *wh l wh nz wh nw s ...
1
wh nw s *wh l wh nz wh nw s ...
1
1
...
wahr
24 Transformationsregeln
...
s ...
...
s ...
Vor der Wand
25 Transformationsregeln
...
h ...
...
h ...
Anzahl: n
Anzahl: n+1
26 Transformationsregeln
<K> wh <B> <K> *wh ...
wahr
wh <B> <K> *wh ...
...
falsch
wh <B> <K> *wh ...
27 Semantikfestlegung mit Regeln
Solange d. Restprogramm-Stapel nicht leer ist
wende die zum obersten Stapelelement passende Transformationsregel an
...
s ...
Das Verhalten des Interpreters wird hier präzise mit Hilfe von Transformationsregeln festgelegt. Diese bilden somit die Grundlage für eine Implementierung des Interpreters.
28 Aufgabe
Testen Sie den implementierten Interpreter.
Schauen Sie sich die Implementierung an.
Entwerfen Sie Transformationsregeln, die die Ausführung der folgenden Kontrollanweisung beschreiben:
if <Bed.> th <Anw.> el <Anw.> *if
Ergänzen Sie die Implementierung des Interpreters entsprechend der Transformationsregeln.
29 Teil 4
Ein Programm-Übersetzer
30 Übersetzer
Ein Übersetzer transformiert Programme der Ausgangs-Programmiersprache (Quellsprache) in eine andere Sprache (Zielsprache).
Eine präzise Übersetzer-beschreibung kann zur Festlegung der Semantik der Elemente der Ausgangs-Programmiersprache benutzt werden, sofern die Semantik der Zielsprache klar ist (Übersetzer-Semantik).
Zustand vorher: abzuarbeitendes Programm;
Roboterwelt
Zustand nachher: abzuarbeitendes Programm;
Roboterwelt
h s wh nz wh nw s *wh l *wh
h s nz 10 nw 8 s 4 l 2
31 Von der Quell- zur Zielsprache
falsch
h
s
nz?wahr
falschnw?
wahr
s
l
0
1
2
4
10
8
6
9
4
3
5
h s nz 10 nw 8 s 4 l 2h s wh nz wh nw s *wh l *wh
h s wh nz wh nw
s *wh l *wh
Die Quellsprache MyKa verfügt über die Kontrollstruktur wh ... *wh zur Ausführung von Wiederholungen.
Die Zielsprache soll solche Wiederholungen durch GOTO-Sprünge ersetzen.
32 Von der Quell- zur Zielsprache
falsch
h
s
nz?wahr
falschnw?
wahr
s
l
0: h 1: s 2: nz? 3: f: goto 10 4: w: nw? 5: f: goto 8 6: w: s 7: goto 4 8: l 9: goto 210: stop
0
1
2
4
10
8
6
9
4
3
5
h s nz 10 nw 8 s 4 l 2
0: h 1: s 2: nz 3: 10 4: nw 5: 8 6: s 7: 4 8: l 9: 210:
h s wh nz wh nw s *wh l *wh
h s wh nz wh nw
s *wh l *wh
h s nz 10 nw 8 s 4 l 20 1 2 3 4 5 6 7 8 9
GOTO-Programme werden in verkürzter Form als Folge von Token (siehe oben) dargestellt.
33 Übersetzungsvorgang im Detail
h s wh nz wh nw s *wh l *wh
0
s wh nz wh nw s *wh l *wh
1
h
wh nz wh nw s *wh l *wh
2
h s
...
nz wh nw s *wh l *wh
2
h s
2
34 Übersetzungsvorgang im Detail
wh nw s *wh l *wh
4
h s nz *
2
...
nz wh nw s *wh l *wh
2
h s
2
s *wh l *wh
6
h s nz * nw *
4 2
nw s *wh l *wh
4
h s nz *
4 2
35 Übersetzungsvorgang im Detail
...
s *wh l *wh
6
h s nz * nw *
4 2
*wh l *wh
7
h s nz * nw * s
4 2
l *wh
8
h s nz * nw 8 s 4
2
*wh
9
h s nz * nw 8 s 4 l
2
36 Übersetzungsvorgang im Detail
*wh
9
h s nz * nw 8 s 4 l
2
10
h s nz 10 nw 8 s 4 l 2
37 Transformationsregeln
...
i+1
... s
...
s ...
i
...
...
Solange die Quellcode-Schlange nicht leer ist
wende die passende Transformationsregel an
Das Verhalten des Übersetzers kann präzise mit Hilfe von Transformationsregeln festgelegt werden.
Diese bilden dann die Grundlage für eine Implementierung des Übersetzers.
Markenzähler
Hilfsstapel für Rücksprungmar
ken
Quellcode
Zielcode
38
Regel für eine elementare Anweisung
Eine elementare Anweisung wird direkt in die Code-Schlange übernommen. Der Markenzähler wird um 1 erhöht.
...
i+1
... s
...
s ...
i
...
...
39
Regel für die Wiederhole-Anweisung
...
i
...
i ...
wh ...
i
...
...
Die aktuelle Markennummer wird zur späteren Festlegung der Rücksprungadresse in einem Hilfsstapel zwischengespeichert.
40
Regel für die Wiederhole-Anweisung
...
i+2
... <B> *
...
<B> ...
i
...
...
Die Bedingung wird in die Code-Schlange übernommen. Zusätzlich wird ein Platzhalter (hier *) übernommen, der später mit einer Marke für einen Vorwärtssprung ersetzt wird. Hiermit soll ein Sprung aus der Schleife ermöglicht werden, wenn die Bedingung nicht erfüllt ist. Des weiteren wird der Markenzähler um 2 erhöht. Hiermit soll ein Sprung zur ersten Anweisung innerhalb der Schleife ermöglicht werden, sofern die Bedingung erfüllt ist.
41
Regel für das Ende einer Wiederholung
...
i+1
... i+1 … k
...
*wh ...
i
... * …
k ...
Die auf einem Hilfsstapel abgelegte Rücksprungmarke wird in die Codeschlange übernommen. Zusätzlich wird das letzte * in der Codeschlange durch den neuen Markenzähler ersetzt. Hierdurch wird der Sprung „aus der Schleife“ realisiert.
42 Aufgabe
Testen Sie den implementierten Compiler.
Schauen Sie sich die Implementierung an.
Entwerfen Sie Transformationsregeln, die die Übersetzung der folgenden Kontrollanweisung beschreiben:
if <Bed.> th <Anw.> el <Anw.> *if
Ergänzen Sie die Implementierung des Compilers entsprechend der Transformationsregeln.
43 Teil 5
Aufgaben und Lösungsvorschläge
44 Aufgabe
Erweitern Sie die Programmiersprache um folgende Kontrollanweisung:
if <Bed.> t <Anw.> e <Anw.> *if
Ergänzen Sie entsprechend den Scanner, den Parser, den Interpreter und den Übersetzer (Codegenerator).
45 Die Programmiersprache
Zur Vereinfachung der Darstellung verwenden wir abkürzende Bezeichner für die Anweisungen der Programmiersprache.
hinlegenschrittwiederhole solange NichtIstZiegel wiederhole solange NichtIstWand schritt *wiederhole linksDrehen*wiederhole
wh nw if nz th h s el s *if*wh
46 Erweiterter Scanner-Automat
n
q0
q1
q20
q3
q30
´ ´; chr(13)
q2
q10
´ ´; chr(13); chr(10)
w
*
zw
h
s; l; r; h; a; t; e
Fehlerzustand
w
q4
i f
i
q5
q6
te h
l
47 Erweiterter Parser-Automat
q0
q1
q2
any / s : any / l :any / r : any / h :any / a :
wh / *wh : popif / *if : pop
any / th : push thth / el : pop
any / wh : push wh
any / if : push if
any / nz : any / nw :
Fehlerzustand
Oberstes Kellerzeichen /
Eingabezeichen: Kelleroperation
else / *wh : any / nz :any / nw :
48 Zusätzliche Regeln f. d. Interpreter
<A1> ...
wahr
if <B> th <A1> el <A2> *if ...
<A2> ...
falsch
if <B> th <A1> el <A2> *if ...
49 Aufgabe
Beschreiben Sie die Arbeitsweise des Code-Interpreters mit Hilfe geeigneter Transformationsregeln. Ergänzen Sie hierzu den folgenden Lösungsvorschlag.
50 Lösungsvorschlag
... >s ...i
... s >...i+1
51 Lösungsvorschlag
52 Literaturhinweise
A. Hermes, D. Stobbe: Informatik Zwei, Klett-Verlag 1990.
E. Modrow: Automaten, Schaltwerke, Sprachen. Dümmlers-Verlag 1988.
E. Modrow: Theoretische Informatik mit Delphi. Emu-online 2005.
top related