• Keine Ergebnisse gefunden

Syntaxanalyse mit Rekursivem Abstieg Satz:

N/A
N/A
Protected

Academic year: 2022

Aktie "Syntaxanalyse mit Rekursivem Abstieg Satz:"

Copied!
12
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

UE zu Übersetzerbau Syntaxanalyse 1

Syntaxanalyse mit Rekursivem Abstieg

Satz: a e g c f d b G(S): S = aAb | cAd.

A = eB | f.

B = gS.

next()-->a erkenne S

erkenne a oder c (a erkannt, wähle erste Alternative)

next()-->e erkenne A

erkenne e oder f (e erkannt, wähle 1. Alt.)

next()-->g erkenne B

erkenne g (g erkannt)

next()-->c erkenne S

erkenne a oder c (c erkannt, wähle 2. Alt.)

next()-->f erkenne A

erkenne e oder f (f erkannt, wähle 2. Alt.)

next()-->d (A erkannt)

erkenne d (d erkannt)

next()-->b (S erkannt)

(B erkannt) (A erkannt)

erkenne b (b erkannt) (S erkannt)

(2)

Parser: wichtige Felder & Methoden

private Token t; // last recognized token private Token la; // lookahead token

private Token.Kind sym; // kind of lookahead token public Scanner scanner; // reference to Scanner private void scan () {

t = la; la = scanner.next(); sym = la.kind;

}

private void check (Token.Kind expected) { if (sym == expected) {

scan();

} else {

error(TOKEN_EXPECTED, expected);

} }

public void error (Message msg, Object... msgParams) { scanner.errors.error(la.line, la.col, msg, msgParams);

// panic mode

throw new Errors.PanicMode();

}

(3)

UE zu Übersetzerbau Syntaxanalyse 3

Panic Mode

Beim ersten Fehler Analyse abbrechen

Abbruch mit throw new Errors.PanicMode();

Error wird von den Testfällen gefangen und ausgewertet

Nicht System.exit(0); , weil es VM beendet

JUnit Testlauf unterbricht

(4)

Bsp 1: S = a B c.

private void S () { check(a);

B();

check(c);

}

SEQUENZ

(5)

Bsp 2: S = a | B c | d.

private void S () { switch (sym) {

case a:

scan(); break;

case e: case f:

// Erkennung von e und f in B!

B(); check(c); break;

case d:

scan(); break;

default:

error(...);

}}

ALTERNATIVEN first(B) = { e, f }

(6)

Bsp 3: S = ( a | B ) c.

private void S () { ODER:

switch (sym) { if (sym == a) { case a:

scan(); break; scan();

case e: case f: } else if (sym == e ||

sym == f) { B(); break; B();

default: } else {

error(...); error(...);

} }

check(c); check(c);

}

SEQUENZ mit ALTERNATIVE first(B) = { e, f }

(7)

Bsp 4: S = [ a | B ] c.

private void S () { ODER:

switch (sym) { if (sym == a) { case a:

scan(); break; scan();

case e: case f: } else if (sym == e ||

sym == f) { B(); break; B();

} }

// kein error // kein error check(c); check(c);

}

SEQUENZ mit OPTIONALER ALTERNATIVE first(B) = { e, f }

(8)

Bsp 5: S = { a | B } c.

(1)

private void S () {

while (sym == a || sym == e || sym == f) { if (sym == a) {

scan();

} else { B();

} // kein error } check(c);

}

SEQUENZ mit ITERATION first(B) = { e, f }

(9)

Bsp 5: S = { a | B } c.

(2)

private void S () { while (true) {

if (sym == a) { scan();

} else if (sym == e || sym == f) { B();

} else {

break; // Schleife verlassen }

} check(c);

}

SEQUENZ mit ITERATION first(B) = { e, f }

(10)

Bsp 6: S = B { a B }.

(1)

private void S () { B();

while (sym == a) { scan();

B();

}}

SEQUENZ mit ITERATION first(B) = { e, f }

(11)

Bsp 6: S = B { a B }.

(2)

private void S () { while (true) {

B();

if (sym == a) { scan();

} else { break;

} }}

SEQUENZ mit ITERATION first(B) = { e, f }

(12)

Bsp 7: S = a { B } C.

private void S () { check(a);

while (sym == e || sym == f) { B();

} C();

}

first(B) = { e, f } first(C) = { g, h }

Referenzen

ÄHNLICHE DOKUMENTE

Die Tabelle enthält für jedes Nichtterminalsymbol der Grammatik eine Zeile (in der ersten Zeile steht das Startsymbol) und für jedes Terminalsymbol und für das.. Endezeichen $

1.  Wenn eine Folge Ab auf der rechten Seite einer Produktion erscheint und wenn aus A eine Folge α a ableitbar ist, dann muss gelten a..

Wie die Reaktionen auf die politischen Umbrü- che in Nordafrika und den Konflikt in Syrien zei- gen, ist die türkische Außenpolitik im Kontext der Arabischen Revolte 2011

Kindergärtnerinnen und Kindergärtner gehören daher zu den Lehrpersonen und sind Fachleute für das Lehren und Lernen auf ihrer Stufe, wie dies im LCH-Berufsleitbild umschrieben

Hinweis: Schreiben Sie sich (zum Testen) eine Methode ( void printAll() ) um den aufgebauten Syntaxbaum (vollständig geklammert) ausgeben zu können. So können Sie sehr einfach auf

Es soll eine Protokolldatei einer Autofahrt analysiert werden und die maximale Geschwindigkeit während der Fahrt berechnet werden.. Beispiel

• beim ersten gefundenen Fehler wird Analyse abgebrochen. • Abbruch (in den UEs) nicht mit System.exit(0); ,

Erstellen  Sie  auf  Basis  dieser  Zustände  eine  Analysetabelle,  die  für  jeden  Zustand  und  jedes  Eingabesymbol die durchzuführende Aktion angibt. . Simulation