12.11.2014 Aufrufe

Kapitel 4

Kapitel 4

Kapitel 4

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!