• Keine Ergebnisse gefunden

– Synchronisation der restlichen Eingabe mit der Grammatik – Parser kennt an jeder Stelle alle gültigen Nachfolge-Symbole – Parser kennt an jeder Stelle alle gültigen Nachfolge-Symbole – Aufwendig

N/A
N/A
Protected

Academic year: 2022

Aktie "– Synchronisation der restlichen Eingabe mit der Grammatik – Parser kennt an jeder Stelle alle gültigen Nachfolge-Symbole – Parser kennt an jeder Stelle alle gültigen Nachfolge-Symbole – Aufwendig"

Copied!
13
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Fehlerbehandlung

• Panic Mode

– Abbruch beim ersten Fehler – Übung 3

• Allgemeine Fangsymbole

– Synchronisation der restlichen Eingabe mit der Grammatik – Parser kennt an jeder Stelle alle gültigen Nachfolge-Symbole – Parser kennt an jeder Stelle alle gültigen Nachfolge-Symbole – Aufwendig

• Spezielle Fangsymbole

(2)

Beispiel: Deklarationen

DeclPart = { ForwardDecl } "{" Body "}" . ForwardDecl = "void" ident "(" ")" ";" .

Body = ... .

void p1();

void p2();

Welche Deklarationen kann man damit erzeugen?

void p2();

void p3();

...

{

...

}

(3)

Beispiel: Deklarationen

DeclPart = { ForwardDecl } "{" Body "}" . ForwardDecl = "void" ident "(" ")" ";" .

Body = ... .

private privateprivate

private voidvoidvoidvoid DeclPart () { while

while while

while (sym == void_) { ForwardDecl();

}

check(lbrace); Body(); check(rbrace);

check(lbrace); Body(); check(rbrace);

}

(4)

Bsp: Fehler in ForwardDecl

Erkenne DeclPart

next() void_ Erkenne ForwardDecl void_ erkannt

next() ident ident erkannt

next() lbrack ERROR: "( expected"

void p [ [ [); [ { … }

next() lbrack ERROR: "( expected"

ERROR: ") expected"

ERROR: "; expected"

ERROR: "{ expected"

...

ERROR: "} expected"

(5)

Bsp: First/Follow-Sets

DeclPart = { ForwardDecl } "{" Body "}" . ForwardDecl = "void" ident "(" ")" ";" .

Body = ... .

First(ForwardDecl) = void_

Follow(ForwardDecl) = First(ForwardDecl) + lbrace = void_, lbrace

private EnumSet<Token.Kind> followFwdDecl =

EnumSet.of(void_, lbrace, eof eof eof eof);

(6)

Beispiel: Deklarationen

DeclPart = { ForwardDecl } "{" Body "}" . ForwardDecl = "void" ident "(" ")" ";" .

Body = ... .

private privateprivate

private voidvoidvoidvoid DeclPart () { while

while while

while (sym == void_) { ForwardDecl();

}

check(lbrace); Body(); check(rbrace);

private privateprivate

private voidvoidvoidvoid DeclPart () { for

for for

for (;;) { ififif

if (sym == void_) { ForwardDecl(); } else

elseelse

else { breakbreakbreakbreak; } }

private privateprivate

private voidvoidvoidvoid DeclPart () { for

for for

for (;;) { ififif

if (sym == void_) { ForwardDecl(); } else

elseelse

else ififif (followFwdDecl.contains(sym)) { breakif breakbreak; }break else

elseelse

else { error("invalid forward declaration"); breakbreakbreakbreak; } private

privateprivate

private voidvoidvoidvoid DeclPart () { for

for for

for (;;) { ififif

if (sym == void_) { ForwardDecl(); } else

elseelse

else ififif (followFwdDecl.contains(sym)) { breakif breakbreak; }break else

elseelse

else { recoverFwdDecl(); }

check(lbrace); Body(); check(rbrace);

} }

check(lbrace); Body(); check(rbrace);

}

private privateprivate

private voidvoidvoidvoid recoverFwdDecl() {

error("invalid forward declaration");

dodo dodo {

scan();

} whilewhilewhile (!followFwdDecl.contains(sym));while else

elseelse

else { error("invalid forward declaration"); breakbreakbreakbreak; } }

check(lbrace); Body(); check(rbrace);

}

else elseelse

else { recoverFwdDecl(); } }

check(lbrace); Body(); check(rbrace);

}

(7)

Bsp: Fehler in ForwardDecl (2)

Erkenne DeclPart

next() void_ Erkenne ForwardDecl void_ erkannt

next() ident ident erkannt

next() lbrack ERROR: "( expected"

void p [ [ [); [ { … }

ERROR: ") expected"

ERROR: "; expected"

ERROR: "invalid forward decl."

next() rpar

next() semicolon

(8)

LL(1)-Bedingung

• Alternativen haben verschiedene terminale Anfänge

• Linksrekursionen verboten!

Bei Top-Down-Analyse

mit einem Vorgriffssymbol entscheiden,

welche Alternative ausgewählt werden muss.

• Abhilfen:

• Abhilfen:

• gleiche Anfänge Faktorisieren

• Linksrekursionen Umwandlung in Iteration

(9)

Regel Statement

Statement

= Assignment

| ProcedureCall

| Increment | Decrement

| … .

gut lesbar, aber nicht LL(1), weil alle Alternativen mit

ident

beginnen

Statement

= Designator Designator Designator Designator

( AssignOp Expr // Assignment

Abhilfe: Faktorisieren

(10)

Beispiel: LL(1)

S = a B B B | b C.

B = b B | a C.

C = S S | c.

first(S1) ∩ first(S2) = {a} ∩ {b} = {}

( S = S1 | S2. , S1 = aBBB. , S2 = bC. ) ( B = B1 | B2. , B1 = bB. , B2 = aC. ) ( C = C1 | C2. , C1 = SS. , C2 = c. )

first(S1) ∩ first(S2) = {a} ∩ {b} = {}

first(B1) ∩ first(B2) = {b} ∩ {a} = {}

first(C1) ∩ first(C2) = first(S) ∩ {c} = {a, b} ∩ {c} = {}

(11)

Beispiel: LL(1)-Konflikt

S = a B B B | b C.

B = b B | a C d.

C = [ S S | c ].

FC1 = first(C1) = first(S) = {a, b}

FC2 = first(C ) = {c}

(S = S1 | S2. S1 = aBBB. S2 = bC.) (B = B1 | B2. B1 = bB. B2 = aCd.)

(C = C1 | C2 | C3. C1 = SS. C2 = c. C3= ε.)

FC2 = first(C2) = {c}

FC3 = first(C3) = follow(C) =

= {d} ∪ follow(S) =

= {d} ∪ first(S) ∪ follow(C) =

= {d} ∪ {a, b} =

= {a, b, d}

(12)

Beispiel: LL(1)-Konflikt

S = a B B B | b C.

B = b B | a C d.

C = [ S S | c ].

Beispielsatz: a a b b d a d a d

S = a B B B B = a C d

C = S SSSS S = b C

C = SSSS …

(13)

UE 3: Syntaxanalyse ( Parser )

• Abgabe

– elektronisch bis Mi, 11.11.2008, 18:00

• alle Java-Dateien des Compilers

– auf Papier

• nur Parser.java

Referenzen

ÄHNLICHE DOKUMENTE

159.. Bedürfnis getragen, hier im Werden ist, erst einmal mit den entsprechenden Mitteln auf eine reine For- mel gebracht sein w i r d , so wird der Eindruck zwar mit

• Alternativen haben verschiedene terminale Anfänge.. •

Vor allen Arbeiten am Elektrowerkzeug Hebel für Drehrichtungswahl (3) in Mittelstellung

3 Ventilation slots 4 Operating state display 5 Power cord with mains plug The CA 10.8/18.0 charger is designed to charge FLEX batteries of the following types – AP 10.8 (2.5 Ah),. –

Important: the error symbol should always be followed by a terminal synchronization symbol, SEMI in this

Element Node: price NodeList Text Node: 11.95 NodeList. Element

Wer hat Kontrolle über das Parsen: die Anwendung oder der

Wer hat Kontrolle über das Parsen: die Anwendung oder der