Kapitel 4
Kapitel 4
Kapitel 4
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Folie: 1<br />
<strong>Kapitel</strong><br />
4<br />
Syntaktische Analyse<br />
Autor:<br />
Aho et al.
Übersicht<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Autor:<br />
Aho et al.
Übersicht<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Autor:<br />
Aho et al.
Syntax: Definition<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
4<br />
syn-tax: the way in which words are put<br />
together to form phrases, clauses, or<br />
sentences.<br />
– Webster's Dictionary<br />
Autor:<br />
Aho et al.<br />
Die Syntax (griechisch !"#$%&'( ['sʏntaksɪs] - die<br />
Zusammenstellung) behandelt die Muster und<br />
Regeln, nach denen Wörter zu größeren<br />
funktionellen Einheiten wie Phrasen (Teilsätze)<br />
und Sätzen zusammengestellt und Beziehungen<br />
wie Teil-Ganzes, Abhängigkeit etc. zwischen<br />
diesen formuliert werden (Satzbau)."<br />
– Wikipedia
Natürliche Sprache<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Folie: 5<br />
thisissometextwithoutspacesandpunctuationmarkswhichist!<br />
hereforequitedifficulttoreadbyhumanslexicalanalysiswillbre!<br />
akthistextupintowordswhiletheparsingphasewillextractthegr!<br />
ammaticalstructureofthetext!<br />
this is some text without spaces and punctuation marks which!<br />
is therefore quite difficult to read by humans lexical analysis!<br />
will break this text up into words while the parsing phase will!<br />
extract the grammatical structure of the text!<br />
Autor:<br />
Aho et al.<br />
This is some text without spaces and punctuation-marks<br />
which is therefore quite difficult to read by humans.!<br />
Lexical-analysis will break this text up into words!<br />
while the parsing-phase will extract the grammatical<br />
structure of the text.!
Wie soll die Syntax einer Programmier<br />
sprache beschrieben werden?<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
• Beispiel:<br />
– If – Then – Else Anweisung<br />
Folie: 6<br />
Autor:<br />
Aho et al.
Deutsche Grammatik<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Folie: 7<br />
1. Satzbauplan – Hauptsatz Der 1. Satzbauplan<br />
hat die Reihenfolge:<br />
Subjekt – finitives Prädikat – indirektes Objekt<br />
– direktes Objekt – Adverbien – Prädikatrest<br />
Die Satzverneinung steht vor dem Prädikatrest.<br />
Beispiel:<br />
„der Verkäufer – hatte – seinem Kunden – das<br />
Buch – gestern – in seinem Laden – (nicht)<br />
– gegeben.“<br />
Autor:<br />
Aho et al.<br />
Quelle: Wikipedia.de
Syntax Analyse: Übersicht<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
10<br />
• Beschreibung der syntaktischen<br />
Struktur von Programmen<br />
– kontext freie Grammatiken (kfG)<br />
– beschreiben: Zuweisungen, Tests, !,<br />
Programme<br />
• Erkennen der syntaktischen Struktur<br />
(“parsing”)<br />
– Top-Down parsing (LL(1))<br />
– Bottom-Up Shift/reduce parsing (LR(1))<br />
• yacc/sablecc/... Werkzeuge<br />
Autor:<br />
Aho et al.
Warum studieren wir Parsing?<br />
Compiler<br />
• Essenziell für die semantische Analyse<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
11<br />
• Viele andere Anwendungen:<br />
– Natural Language Understanding<br />
– theoretische Informatik<br />
– ...<br />
Autor:<br />
Aho et al.
Wiederholung: Formale Sprachen<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Folie: 12<br />
• Alphabet !: endliche Menge von<br />
Symbolen<br />
– {0,1}, {a,b,c,!,z}, Ascii, ...<br />
• String (Wort): endliche Folge von<br />
Symbolen " !<br />
– 101, helloworld, if a=0 then a:= b<br />
• Sprache = abzählbare Menge von Strings<br />
– Primzahlen im Binärformat, English, Java<br />
Programme<br />
– Lexeme für ein Token !!<br />
Identifier : {a,b,!,foo,!,x_3,...}<br />
Autor:<br />
Aho et al.
Anwendung der formalen Sprachen<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
13<br />
Autor:<br />
Aho et al.<br />
• Beim Lexing:<br />
– Zuordnung zu Token Klassen<br />
• L(num) = {“0”, “1”, “2”, “3”,!, “10”, “11”,!}<br />
• L(id) = {“a”,“b”,!, “a1”,“a2”,!, “aa”,“ab”,!}<br />
• ! = Ascii oder Unicode<br />
• Beim Parsing:<br />
– Zuordnung zu grammatischen<br />
Konstrukten<br />
• L(assignment) = { “id = id”, “id = num”, “id = id<br />
+id”, “id = id+num”, “id = num+id”,!}<br />
• ! = Token (oder Ascii/Unicode wenn kein<br />
Lexing)
Alphabete<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Autor:<br />
Aho et al.<br />
14
Beschreibung der Sprachen I<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
15<br />
Aufzählung<br />
if n == ((x+2)*3) then<br />
return 0<br />
else<br />
!….!<br />
– Beispiel: Arithmetische Ausdrücke über<br />
natürliche Zahlen mit +,*, (, ):<br />
{0,1,2,3,!,0+0,0+1,0+2,!,1+0,1+1,1+2,!,<br />
0*0, 0*1, 0*2,!, 0+0+0, 0+0+1,!<br />
0+0*0, 0+0*1, 0+0*2,!.<br />
0*0+0, 0*0+1,!, 1*0+0, 1*0+1,!<br />
(0+0),(0+1),(0+2),!,(1+0),(1+1),(1+2),!,<br />
(0*0), (0*1), (0*2),!, (0+0)+0, (0+0)+1,!}<br />
Autor:<br />
Aho et al.<br />
Können wir reguläre Ausdrücke verwenden ?
Beschreibung der Sprachen II<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
16<br />
Reguläre Ausdrücke: a, #, M|N, MN, M *<br />
– Beispiel: Arithmetische Ausdrücke über<br />
natürliche Zahlen mit +,*, (, ):<br />
– Nat = 0 | [1-9][0-9] *<br />
– Ex = Nat ((“+”| “ *”) Nat) *<br />
{0,1,2,3,…}!<br />
– Mit Klammern ?<br />
{0,…,0+0,…,0*0,...}!<br />
Autor:<br />
Aho et al.
Quiz: Ein einfacheres Problem<br />
(or Who wants to be a millionaire?)<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
• Beschreiben Sie die Sprache<br />
{“ab”, “aabb”, “aaabbb”, !} mit einem<br />
regulären Ausdrück<br />
• Unmöglich!<br />
• Das Gleiche gilt für:<br />
– Korrekt geklammerte Ausdrücke ( (!) !)<br />
– Korrekt geschachtelte Schleifen,!<br />
$ Reguläre Ausdrücke reichen zum<br />
Parsen nicht aus<br />
Autor:<br />
Aho et al.
Erklärung<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
18<br />
Beschreibung von {“()”, “(())”, “((()))”, !}<br />
mit einem regulären Ausdruck:<br />
unmöglich!<br />
Warum:<br />
– Regulärer Ausdruck % endlicher DFA<br />
– DFA: Zustände haben keinen Speicher<br />
Autor:<br />
Aho et al.<br />
!! (! (!<br />
"! $!<br />
#! )! )!<br />
%!<br />
)!<br />
&!<br />
(!<br />
'!<br />
)!<br />
(!<br />
)!<br />
...!<br />
...!<br />
Wir brauchen!<br />
- Speicher oder!<br />
- unendlich viele Zustände!
Klammern Problem<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
• x := (a+b)*2;<br />
• x := (a+b*2;<br />
"!<br />
!!<br />
• if x>2 then return x*x else<br />
return 0; !#<br />
• if x>2 then return x*x if<br />
"!<br />
y>2;<br />
• else return 0 then return<br />
x*x;<br />
"!<br />
Autor:<br />
Aho et al.<br />
$ kontextfreie Grammatiken (Rekursion)!
Bausteine von<br />
kontextfreien Grammatiken<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
20<br />
N = Menge von Nichtterminalen<br />
T = Menge von Terminalen<br />
Startsymbol S " N<br />
Menge P von Produktionen der Form:<br />
– s 0 % s 1 ! s k mit<br />
s 0 " N, s i " T & N, k"0<br />
Notation:<br />
– s 0 % ' 1 | !| ' k bezeichnet {s 0 % ' i | 1#i#k}<br />
Autor:<br />
Aho et al.
Beschreibung der Sprachen IV<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Beispiel: Arithmetische Ausdrücke über<br />
Bezeichner id mit +,*, (, ):<br />
21<br />
Version1: N={E}, S=E, T = {id,+,*, (, )}<br />
Version 2: N={E,T,F}, S=E, T = {id,+,*, (, )}<br />
Autor:<br />
Aho et al.
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Folie: 25<br />
Wo ist die kfG?<br />
Deutsche Grammatik<br />
1. Satzbauplan – Hauptsatz Der 1. Satzbauplan<br />
hat die Reihenfolge:<br />
Subjekt – finitives Prädikat – indirektes Objekt<br />
– direktes Objekt – Adverbien – Prädikatrest<br />
Die Satzverneinung steht vor dem Prädikatrest.<br />
Beispiel:<br />
„der Verkäufer – hatte – seinem Kunden – das<br />
Buch – gestern – in seinem Laden – (nicht)<br />
– gegeben.“<br />
Autor:<br />
Aho et al.<br />
Quelle: Wikipedia.de
Ableitungsschritt<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
26<br />
1. Sei A % $ eine Produktion<br />
2. Sei %A& ein String über N T<br />
3. Dann schreiben wir:<br />
%A& %$&<br />
Beispiel:<br />
E (E) (id)<br />
Autor:<br />
Aho et al.
Ableitungen und Sprache<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
27<br />
1. Von Grammatik G erzeugte Sprache:<br />
L(G) = {w T* | S* w}<br />
2. Zwei Grammatiken mit derselben<br />
Sprache: werden äquivalent genannt<br />
Autor:<br />
Aho et al.
Die Chomsky Hierarchie<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
28<br />
Type 3: Reguläre Sprachen<br />
– reguläre Ausdrücke, endliche Automaten<br />
Type 2: kontextfreie Sprachen<br />
– kfG’s, Kellerautomaten<br />
Type 1: kontextsensitive Sprachen<br />
– CSG’s ( AB % AC, CB % CD), LBA’s<br />
Type 0: rekursive aufzählbare Sprachen<br />
– Turingmaschine<br />
Autor:<br />
Aho et al.<br />
{a n b n c n |n>1}: Typ 1 nicht Typ 2,<br />
{a n b n |n>1}: Typ 2 nicht Typ 3
Reguläre Ausdrücke% kfG<br />
Compiler<br />
• (a|b)*abb<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Folie: 29<br />
Autor:<br />
Aho et al.
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Quiz<br />
Ex % id| (Ex) | Ex + Ex | Ex * Ex<br />
T = {id,(,),+,*}, N = {Ex}, S = Ex<br />
Finden Sie (falls möglich) von Ex<br />
aus Ableitungen für:<br />
– id+id*id<br />
– (id+ (+id)<br />
Autor:<br />
Aho et al.<br />
30
Ex % id| (Ex) | Ex + Ex | Ex * Ex<br />
Lösung<br />
Compiler<br />
Ex<br />
<strong>Kapitel</strong> 4<br />
Ex + Ex<br />
Syntaktische Analyse<br />
id+ Ex<br />
id+ Ex * Ex<br />
id+ id* Ex<br />
id+ id* id<br />
Ex<br />
Ex + Ex<br />
Ex + Ex * Ex<br />
Ex + Ex * id<br />
Ex + id* id<br />
id+ id* id<br />
! Ex<br />
! Ex * Ex<br />
! Ex + Ex * Ex<br />
! id+ Ex * Ex<br />
! id+ id* Ex<br />
! id+ id* id<br />
Links-<br />
Ableitung<br />
Autor:<br />
Aho et al.<br />
alle Strings:<br />
Satzformen<br />
der<br />
Grammatik<br />
Rechts-<br />
Ableitung<br />
andere<br />
Links-<br />
Ableitung<br />
31
Parsebäume<br />
S % aSbSc | #!<br />
S!<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
32<br />
Blätter:<br />
a! S S c!<br />
– Terminale oder<br />
b!<br />
Nichtterminale<br />
#! #!<br />
– Grenze: erzeugte Satzform<br />
Innere Knoten:<br />
– Nichtterminale<br />
– Kinder: ordered, obtained by using a<br />
production rule<br />
Wurzel: Startsymbol S<br />
Autor:<br />
Aho et al.
Parsebäume<br />
Ex % Nat | (Ex) | Ex + Ex | Ex * Ex<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Ex<br />
Ex ! Ex + Ex<br />
Nat ! Ex + + Ex Ex<br />
Nat ! Ex + + Ex Ex * Ex * Ex<br />
Nat ! Ex + + Nat Ex * Ex Nat<br />
Nat ! Ex + + Nat Nat * Nat * Nat<br />
! Nat + Nat * Nat<br />
Syntaktische Analyse<br />
Ex<br />
Ex<br />
+<br />
Ex<br />
Nat Ex *<br />
Nat<br />
Ex<br />
Nat<br />
Autor:<br />
Aho et al.<br />
Rechtsableitun<br />
g:<br />
gleicher<br />
Blätter: erzeugter String<br />
Nat + Nat * Nat<br />
33
Folge von Parse-Bäume<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Folie: 34<br />
Autor:<br />
Aho et al.
Was ist Parsing<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
35<br />
E % num!<br />
E % CFG E+E! G!<br />
E % (E)!<br />
Token!<br />
String s!<br />
Parser!<br />
s " L(G)!<br />
Autor:<br />
Aho et al.<br />
Error" No!<br />
Message!<br />
Yes!<br />
Parsebaum!<br />
für S in G!
Was ist Parsing II<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
36<br />
E % num!<br />
E % CFG E+E! G!<br />
E % (E)!<br />
Token!<br />
String s!<br />
num + num + num!<br />
Parser!<br />
s " L(G)!<br />
E!<br />
Autor:<br />
Aho et al.<br />
Error" No!<br />
Message!<br />
Yes!<br />
Parsebaum! +! num!<br />
für S in G!<br />
num!<br />
E!<br />
+! E!<br />
num!
Was ist Parsing III<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
37<br />
E % num!<br />
E % CFG E+E! G!<br />
E % (E)!<br />
Token!<br />
String s!<br />
(num + num!<br />
Parser!<br />
s " L(G)!<br />
Autor:<br />
Aho et al.<br />
Missing Error" No! ‘)’!<br />
Message! on line 1!<br />
Parsebaum!<br />
Yes!<br />
für S in G!
Ex % Nat | (Ex) | Ex + Ex | Ex * Ex<br />
Mehrdeutige Grammatiken<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
mehrdeutig: falls es für einen String "2<br />
verschiedene Parsebäume gibt:<br />
38<br />
Ex<br />
Nat + Nat * Nat<br />
Ex<br />
Ex<br />
+<br />
Ex<br />
Ex<br />
*<br />
Ex<br />
Nat Ex *<br />
Ex<br />
Ex<br />
+<br />
Ex<br />
Nat<br />
Nat<br />
Nat<br />
Nat<br />
Nat<br />
Autor:<br />
Aho et al.<br />
Nat + (Nat * Nat)<br />
(Nat + Nat) * Nat
Eliminieren von Mehrdeutigkeiten<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
• S ' ab | aT<br />
• T ' b | bTc<br />
Folie: 39<br />
Autor:<br />
Aho et al.
Eliminieren von Mehrdeutigkeiten<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Folie: 40<br />
if E 1 then if E 2 then S 1 else S 2<br />
Autor:<br />
Aho et al.
Eliminieren von Mehrdeutigkeiten II<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Folie: 41<br />
Autor:<br />
Aho et al.
Eliminieren von Mehrdeutigkeiten<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Folie: 42<br />
• Sprache verbessern:<br />
– S ' if E then S endif<br />
– S ' if E then S else S endif<br />
if E 1 then if E 2 then S 1 else S 2<br />
if E 1 then if E 2 then S 1 endif else S 2 endif<br />
Autor:<br />
Aho et al.
Eliminieren von Mehrdeutigkeiten III<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
Folie: 43<br />
Autor:<br />
Aho et al.<br />
if E 1 then if E 2 then S 1 else S 2
Zusammenfassung<br />
Compiler<br />
<strong>Kapitel</strong> 4<br />
Syntaktische Analyse<br />
44<br />
Parsing: Warum, Wann, Was<br />
Kontext-freie Grammatiken<br />
Jetzt:<br />
– Bestandteile, Ableitungen,, Parse Bäume,<br />
Mehrdeutigkeit<br />
– Mächtigkeit (im Vergleich zu regulären<br />
Ausdrücken)<br />
– Wie macht man Parsing<br />
Autor:<br />
Aho et al.