5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer...

88
________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-1 5. Bottom up-Parser 5. Bottom up-Parser syntaktische Analyse

Transcript of 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer...

Page 1: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-1

5. Bottom up-Parser

5. Bottom up-Parser 5. Bottom up-Parser

syntaktische Analyse

Page 2: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-2

5. Bottom up-Parser

Beispiel einer Bottom up-Analyse

{ }{ }, , ( , )

=

= + ∗

→ +

= →

13

13

13

N

T

P

E,T, F

v,

E T | E T,T F | T * F,F v | (E)

( ) ( ) ( ( )( ) ( ) ( )( ) ( ) ( )

+ + ← + + ← + + ← + +← + + ← + + ← + +← + + ← + + ← +

← + ← ←

v v v F v v T v v) E v vE F v E T v E E vE E F E E T E E

E F E+T E

Vorgegebene Grammatik: Reduktionsfolge:

Page 3: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-3

5. Bottom up-Parser

Das Handle

Ein Teilstring β einer Satzform α β γ heißt Handle, falls

β die rechte Seite einer Produktion β→N ist und

der Reduktionsschritt α β γ α γ← N zu einer linkskanonischen Reduktion fortsetzbar ist.

Page 4: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_____________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-4

5. Bottom up-Parser

Bottom up-Analyse noch einmal:

Schritt: Stackinhalt: Eingaberest: 1. v + ( v + v ) 2. v + ( v + v ) 3. F + ( v + v ) 4. T + ( v + v ) 5. E + ( v + v ) 6. E + ( v + v ) 7. E + ( v + v ) 8. E + ( v + v ) 9. E + ( F + v ) 10. E + ( T + v ) 11. E + ( E + v ) 12. E + ( E + v ) 13. E + ( E + v ) 14. E + ( E + F ) 15. E + ( E + T ) 16. E + ( E ) 17. E + ( E ) 18. E + ( E ) 19. E + F 20. E + T 21. E

Page 5: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-5

5. Bottom up-Parser

LR(k)-Analyseverfahren

Kriterien für den Fortgang der Analyse

Informationen über den gesamten Stackinhalt und die nächsten k Zeichen der Eingabe für ein festes k ≥ 0

Vorteile der LR(k)-Methoden

die Sprachklasse LR(k) ist umfangreicher als die Klasse LL(k) alle üblichen syntaktischen Konstruktionen mit LR(k) anlysierbar tabellengesteuert d.h. effizient implementierbar; k=1 genügt. correct prefix property.

Page 6: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-6

5. Bottom up-Parser

a β τ γ

N τ γ

k

a

LR(k)-Grammatiken

in jeder Satzform ist das Handle β eindeutig bestimmt durch den aktuellen Stackinhalt und die nächsten k Zeichen der Eingabe.

Page 7: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-7

5. Bottom up-Parser

I4

I7

I2

I0

I8

(

T

$

E

LR(k)-Analysator

v ∗ ( v + v ) $

Schaltwerk

Eingabeband

Zustands- Stack

Symbol- Stack

Page 8: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-8

5. Bottom up-Parser

Die Aktionstabelle

Damit entscheidet der Analysator über den nächsten Analyseschritt.

t0 t1 t2 ........... $

I0 ACCEPT

I1 Ik I 2 β→N : :

Mögliche Einträge auf Position ( Ii, tj ) :

Ein Zustand Ik (Aktion = kellern) Eine Produktion β→N (Aktion = reduzieren) ACCEPT (Eingabe als syntaktisch korrekt akzeptieren)

Page 9: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-9

5. Bottom up-Parser

I2

I

I

I

N

N

N

$

N1

Die Goto-Tabelle

Damit bestimmt der Analysator den nächsten Stackzustand bei Reduktionen.

N0 N1 N2 ...........

I0 I1 I2 Ik : :

Page 10: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-10

5. Bottom up-Parser

Die Aktionstabelle von 13Γ

v + * ( ) $

I0 I5 I4 I1 I6 ACCEPT

I2 →E T I7 →E T →E T I3 →T F →T F →T F →T F I4 I5 I4 I5 →F v →F v →F v →F v I6 I5 I4 I7 I5 I4 I8 I6 I11 I9 → +E E T I7 → +E E T → +E E T I10 *→T T F *→T T F *→T T F *→T T F I11 →F (E) →F (E) →F (E) →F (E)

Page 11: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-11

5. Bottom up-Parser

Die Goto-Tabelle von 13Γ

E T F

I0 I1 I2 I3 I1 I2 I3 I4 I8 I2 I3 I5 I6 I9 I3 I7 I10 I8 I9 I10 I11

Page 12: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

____________________________________________________________________________________

_____________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-12

5. Bottom up-Parser

Ablauf einer SLR(1)-Analyse (I)

Schritt Stackinhalt Eingabe Reduktion1. $ v ∗ ( v + v ) + v $

I0

2. $ v ∗ ( v + v ) + v $ ←v F I0 I 5

3. $ F ∗ ( v + v ) + v $ ←F T I0 I 3

4. $ T ∗ ( v + v ) + v $ I0 I 2

5. $ T ∗ ( v + v ) + v $ I0 I 2 I 7

6. $ T ∗ ( v + v ) + v $ I0 I 2 I 7 I 4

7. $ T ∗ ( v + v ) + v $ ←v F I0 I 2 I 7 I 4 I 5

8. $ T ∗ ( F + v ) + v $ ←F T I0 I 2 I 7 I 4 I 3

9. $ T ∗ ( T + v ) + v $ ←T E I0 I 2 I 7 I 4 I 2

10. $ T ∗ ( E + v ) + v $ I0 I 2 I 7 I 4 I 8

11. $ T ∗ ( E + v )+ v $ I 0 I 2 I 7 I 4 I 8 I 6

12. $ T ∗ ( E + v ) + v $ ←v F I 0 I 2 I 7 I 4 I 8 I 6 I 5

13. $ T ∗ ( E + F ) + v $ ←F T I 0 I 2 I 7 I 4 I 8 I 6 I 3

Page 13: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

____________________________________________________________________________________

_____________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-13

5. Bottom up-Parser

Ablauf einer SLR(1)-Analyse (II)

Schritt Stackinhalt Eingabe Reduktion14. $ T ∗ ( E + T ) + v $ + ←E T E

I 0 I 2 I 7 I 4 I 8 I 6 I 9

15. $ T ∗ ( E ) + v $ I 0 I 2 I 7 I 4 I 8

16. $ T ∗ ( E ) + v $ ←(E) F I 0 I 2 I 7 I 4 I 8 I11

17. $ T ∗ F + v $ * ←T F T I 0 I 2 I 7 I 10

18. $ T + v $ ←T E I 0 I 2

19. $ E + v $ I 0 I 1

20. $ E + v $ I 0 I 1 I 6

21. $ E + v $ ←v F I 0 I 1 I 6 I 5

22. $ E + F $ ←F T I 0 I 1 I 6 I 3

23. $ E + T $ + ←E T E I 0 I 1 I 6 I 9

24. $ E $ ACCEPT I 0 I 1

Page 14: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-14

5. Bottom up-Parser

LR(0)-Items N ϕ ψ→

a β γ

ψ ϕ

N

N ϕ ψ→ bedeutet:

Es ist ein Anfang ϕ für das Handle ϕψ gefunden.

Eine Reduktion mit ϕψ ← N ist möglich, wenn noch ψ erreicht werden kann.

Page 15: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-15

5. Bottom up-Parser

LR(0)-Informationen

Eine LR(0)-Information ist eine Menge von LR(0)-Items.

Ziel: LR(0)-Informationensollen alle mögliche Interpretationen der selben Analysesituation darstellen.

Page 16: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-16

5. Bottom up-Parser

Der Operator HUELLE

Er liefert zu einem LR(0)-Item ϕ ψ→N die Menge aller LR(0)-Items, die sich der selben Analysesituation zuordnen lassen wie ϕ ψ→N .

Der Operator wird auf eine LR(0)-Information I angewandt, indem man ihn auf ihre Elemente anwendet.

Verfahren zur Bestimmung der Hülle:

{ nimm I in die Menge HUELLE [ I ] auf } wiederhole für alle LR(0)-Items der Form ϕ ψ→N M in der LR(0)-Information I für alle Produktionen der Form π→M der Grammatik { nimm π→M in die Menge HUELLE [ I ] auf } solange bis HUELLE[ I ] stabil bleibt.

Page 17: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-17

5. Bottom up-Parser

Beispiel zum Operator HUELLE

HUELLE [ → +E E T ] = *

→ + → → → →

E E TT FT T FF vF (E)

Page 18: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-18

5. Bottom up-Parser

Der Operator GOTO

Er beschreibt das Schaltverhalten des Endlichen Automaten, der die Stackzustände ermittelt.

Er liefert zu einer LR(0)-Information I und zu V∈x eine neue LR(0)-Information:

GOTO [ I, x ] = HUELLE [ α β→N x | α β→ ∈ IN x ]

GOTO [ I , ( ] = HUELLE [ ( )→F E ] =

( )

*

→ → → + → →

→ →

F EE TE E TT FT T FF vF (E)

Beispiel:

Page 19: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-19

5. Bottom up-Parser

Die kanonische Kollektion der LR(0)-Informationen (I)

sie stellt die Zustandsmenge des LR(0)-Automaten dar

Verfahren zur Berechnung der kanonschen Kollektion der LR(0)-Informationen

{ nimm die Menge HUELLE [ →X X ] in die Kollektion C auf } wiederhole

für { alle LR(0)-Information I ∈ C und alle Zeichen ∈x V } { nimm GOTO [I, x ] in die Kollektion C auf } solange bis C stabil bleibt.

Page 20: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-20

5. Bottom up-Parser

Die kanonische Kollektion der LR(0)-Informationen (II)

I0 = HUELLE [ →E E ] = *

→ → +

→ →

→ →

E EE TE E TT FT T FF vF (E)

→ +=

13P

E EE T |E TT F | T *FF v | (E)

Grammatik:

erste LR(0)-Information:

Page 21: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-21

5. Bottom up-Parser

Die kanonische Kollektion der LR(0)-Informationen (III)

I 1 = GOTO [ I0, E ] = HUELLE →

→ +

E EE E T

= →

→ +

E EE E T

I 2 = GOTO [ I0, T ] = HUELLE *→

E TT T F = *

→ →

E TT T F

I 3 = GOTO [ I0, F ] = HUELLE [ ]→T F = [ ]→T F

I 4 = GOTO [ I0, ( ] = HUELLE [ ]( )→F E =

( )

*

→ → → + → →

→ →

F EE TE E TT FT T FF vF (E)

Page 22: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-22

5. Bottom up-Parser

Die kanonische Kollektion der LR(0)-Informationen (IV)

I 5 = GOTO [ I0, v ] = HUELLE [ ]→F v = [ ]→F v

I 6 = GOTO [ I1, + ] = HUELLE [ ]→ +E E T = *

→ + → → → →

E E TT FT T FF vF (E)

I 7 = GOTO [ I2, ∗ ] = HUELLE [ ]*→T T F =

*→ → →

T T FF vF (E)

I 8 = GOTO [ I4, E ] = HUELLE ( )→

→ +

F EE E T =

( )→ → +

F EE E T

Page 23: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-23

5. Bottom up-Parser

Die kanonische Kollektion der LR(0)-Informationen (V)

I 9 = GOTO [ I6, T ] = HUELLE *→ +

E E TT T F = *

→ + →

E E TT T F

I 10 = GOTO [ I7, F ] = HUELLE [ ]*→T T F = [ ]*→T T F

I 11 = GOTO [ I8, ) ] = HUELLE [ ]( )→F E = [ ]( )→F E

Page 24: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-24

5. Bottom up-Parser

Der LR(0)-Automat

I4

I3 I2 I1

I0

I9 I8

I7 I6

I5

I11 I10

F

T

F

E

E F

F

)

v

T

v

v v

(

(

∗ (

(

T +

+

Page 25: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-25

5. Bottom up-Parser

Verfahren zur Konstruktion Aktionstabelle

für { alle LR(0)-Informationen Ii ( 0 i n≤ ≤ ) } für { alle Terminalzeichen t ∈ T } falls es ein LR(0)-Item tα β→N in Ii gibt mit GOTO [Ii, t ] = Ij { Trage Ij auf der Position ( Ii, t) in die Aktionstabelle ein. }

für { alle LR(0)-Informationen Ii ( 0 i n≤ ≤ ) } falls es ein LR(0)-Item α→N in Ii gibt

iα→

ITrage N auf allen Positionen ( , t) in die Aktionstabelle ein,

für die t FOLLOW(N) ist

für { alle LR(0)-Informationen Ii ( 0 i n≤ ≤ ) }

falls es ein LR(0)-Item →X X in Ii gibt

{ }IiTrage ACCEPT auf der Position ( , $) in die Aktionstabelle ein

Page 26: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 5-26

5. Bottom up-Parser

Verfahren zur Konstruktion GOTO-Tabelle

für { alle LR(0)-Informationen Ii ( 0 i n≤ ≤ ) } für { alle N ∈ N } falls GOTO [Ii , N ] = Ij { trage Ij auf der Position ( i, N ) in die GOTO-Tabelle ein }

Page 27: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 6-1

6. Fehlerbehandlung

6. Die Fehlerbehandlung 6. Die Fehlerbehandlung

Lexikalische Analyse

Code- generierung

Speicher- verwaltung

syntaktische Analyse

OptimierungInterpretation

Fehler- Behandlung

Page 28: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 6-2

6. Fehlerbehandlung

Fehler bei der Software-Entwicklung

Aus der Sicht des Entwicklers unterscheiden wir: Spezifikationsfehler Algorithmische Fehler Codierungsfehler Mißachtung von Sprach- und Compilereigenschaften Compilerfehler

Page 29: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 6-3

6. Fehlerbehandlung

Fehlerreaktionen des Übersetzers

Mögliche Reaktionen des Compilers im Fehlerfall: keine Reaktion Abbruch der Compilierung Fehlerbehandlung

Angemessene, benutzerfreundliche Fehlerbehandlung:

quellsprachenbezogene Identifikation der Fehlerstelle, aussagekräftige, selbsterklärende Fehlermeldungen, die Vermeidung unnötiger Redundanz

Page 30: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 6-4

6. Fehlerbehandlung

Klassifikation von Fehlern

Aus der Sicht des Compiler-Entwicklers unterscheiden wir:

Lexikalische Fehler Syntaktische Fehler Semantische Fehler Laufzeitfehler

Page 31: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 6-5

6. Fehlerbehandlung

Modell der Fehlerbehandlung

Lexikalische Analyse

Code- generierung

Speicher- verwaltung

syntaktische Analyse

OptimierungInterpretation

Fehler- Behandlung

Page 32: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 6-6

6. Fehlerbehandlung

Behandlung lexikalischer Fehler

Typische lexikalische Fehler sind:

Verwendung von Zeichen, die nicht zum Alphabet gehören Zahlbereichsüberschreitung bei Zahlkonstanten Nichteinhalten von Namenskonventionen Falsche Schreibweise von Wortsymbolen

Page 33: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 6-7

6. Fehlerbehandlung

Beispiel zur Fehlerbehandlung im Scanner:

Fehler in Wortsymbolen

Bei 80% der Fehler in Wortsymbolen sind: ein Zeichen zu viel oder zu wenig vorhanden, ein Zeichen falsch geschrieben, zwei Zeichen vertauscht.

Prüfen, ob das erwartete Wortsymbol falsch geschrieben wurde durch:

Hinzufügen oder Weglassen eines Zeichens, Vertauschen zweier Zeichen, Abändern eines Zeichens.

Page 34: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 6-8

6. Fehlerbehandlung

Beispiel zur Fehlerbehandlung im Scanner:

Verwechslung von „;“ und „,“ legalisieren Konventionelle Analyse:

if (sym == varSym) { getSym(); varDeclaration(); while (sym == comma) { getSym(); varDeclaration(); } if (sym == semicolon) getSym(); else error(5); }

var ident

, ident

;

Page 35: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 6-9

6. Fehlerbehandlung

Beispiel zur Fehlerbehandlung im Scanner:

Verwechslung von „;“ und „,“ legalisieren Fehlertolerante Analyse: Was ist der Preis für diese Modifikation ?

if (sym == varSym) { getSym(); do { varDeclaration(ppos); while (sym == comma) { getSym(); varDeclaration(ppos); } if (sym == semicolon) getSym(); else error(5); } while (sym == ident); }

var ident

, ident

;

Page 36: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 6-10

6. Fehlerbehandlung

S

Z X Y

t

Beispiel zur Fehlerbehandlung im Scanner:

Überlesen von Quelltext

• X muß im Fehlerfall garantieren, daß Y einen brauchbaren Anfang vorfindet.

• Generelle Methode: Überlesen von Quelltext bis zu einem legalen FOLLOW-Zeichen oder einem Stop-Zeichen

Page 37: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 6-11

6. Fehlerbehandlung

Beispiel zur Fehlerbehandlung im Parser:

Hypothesen über den wahrscheinlichen Fehler Legalisieren von fehlendem then

if (sym == ifSym) { getSym(); condition( STAT_START | IDENT | DO_THEN_OF ); if (sym == thenSym) getSym(); else error(16); statement(followSymSet | UNTIL_ELSE); if (sym == elseSym) { getSym(); statement(followSymSet); } }

then if condition statement

Page 38: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 6-12

6. Fehlerbehandlung

Weitere Themen der Fehlerbehandlung

Syntaktische Fehler bei der LR- Analyse Fehlersituation: die Aktionstabelle besitzt keinen Eintrag LR-Analysatoren besitzen die correct prefix-Eigenschaft

Semantische Fehler: werden durch kontextfreie Analyse nicht erkannt

fehlende oder falsche Vereinbarungen typfremde Verwendung von Namen

Page 39: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-1

7. Speicherverwaltung

7. Die Speicherverwaltung 7. Die Speicherverwaltung

Speicher- Verwaltung

Page 40: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-2

7. Speicherverwaltung

Begriffe des Speichermanagement

Lebensdauer von Objekten Gültigkeitsbereich von Objekten Statische Speicherverwaltung (COBOL, FORTRAN, PASCAL, C, C++) Dynamische Speicherverwaltung (Pascal, C, C++ ) Programmeinheit Datenraum (DSA = Data Storage Area)

Page 41: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-3

7. Speicherverwaltung

Statische Speicherverwaltung

Merkmale: Inhalt und Größe der Datenräume sind zur Compile-Zeit bekannt der Compiler kann Objekten feste Adressen zuordnen Lebensdauer von Objekten = gesamte Programmlaufzeit

Beispiele statischer Speicherverwaltung:

FORTRAN, COBOL static-Variablen in C-Sprachen globale Variablen in C-Sprachen

Page 42: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-4

7. Speicherverwaltung

Datenraum einer Programmeinheit

void Polar (float x1, float y1, double& radius, double& winkel) { // Umrechnung kartesischer Koordinaten in Polarkoordinaten radius = sqrt ( x1*x1 + y1*y1 ); winkel = atan ( y1 / x1 ); return; }

Wert des Parameter x1 Wert des Parameter y1 Adresse des Parameter radius Adresse des Parameter winkel Länge der Parameterliste

Rückkehradresse Datenraumverkettung Register Save Area

Hilfsvariablen zur Auswertung der Ausdrücke

Page 43: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-5

7. Speicherverwaltung

Datenraum einer Block-Hierarchie (I)

void main() { int x, y; x=1; y=2; cout << "\n\nWerte auf dem Hauptprogramm-Niveau:\n"; cout << "x = " << x << " y = " << y; { int y, z; x=11; y=22; z=33; cout << "\n\nWerte im 1. untergeordneten Block:\n"; cout << "x = " << x << " y = " << y << " z = " << z; } { int a; a = 44; cout << "\n\nWerte im 2. untergeordneten Block:\n"; cout << "x = " << x << " y = " << y << " a = " << a; } getch(); return; }

Run

Page 44: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-6

7. Speicherverwaltung

Datenraum einer Block-Hierarchie (II)

Ablage der Variablen im Arbeitsspeicher für dieses Programm: Objekte des 1. und 2. Unterblocks belegen den selben Platz !

Objekte des 1. Unterblocks: y, z

Objekte des 2. Unterblocks: a

Objekte des Hauptprogramms: x, y

Page 45: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-7

7. Speicherverwaltung

Blockvektoren (I) int main() { int x, y; x=1; y=2; cout << "\n\nWerte auf dem Hauptprogramm-Niveau:\n"; cout << "x = " << x << " y = " << y; { int y, z; x=11; y=22; z=33; cout << "\nWerte im 1. untergeordn. Block:\n"; cout << "x =" << x << " y =" << y << " z =" << z; { int a; a = 44; cout << "\nWerte im 2. untergeordn. Block:\n"; cout << "x =" << x << " y =" << y << " " << "z =" << z << " a =" << a; } } getch(); return 0; } Run

Page 46: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-8

7. Speicherverwaltung

Blockvektoren (II)

Objekte des 2. Unterblocks: a

Objekte des 1. Unterblocks: y, z

Objekte des Hauptprogramms: x, y

Page 47: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

________________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-9

7. Speicherverwaltung

Dynamische Speicherverwaltung Jedem Funktionsaufruf wird ein eigener Datenraum bereitgestellt; er enthält:

Eine Datenobjekte Rückkehr-Information Verwaltungsinformation für das Environment

Environment Zum Environment der aktiven Programmeinheit gehören:

ihr eigener Datenraum, die Datenräume der statisch übergeordneten Prozeduren, ist eine Programmeinheit mehrfach gleichzeitig aktiv, so gehört

der Datenraum der jüngsten Aktivierung zum Environment.

Page 48: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

____________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-10

7. Speicherverwaltung

Datenstack-Verwaltung (I)

// Wahl und Aufruf der naechsten Funktion #define gotoNext .............. // Ausgabe des aktuellen Environment void Environment (char fnct, int e, int f) { .......... } // globale Variablen int a=1, b=2; void A() { int r=random(1000); int s=random(1000); Environment ('A', r, s); gotoNext; Environment ('A', r, s); gotoNext; } void B() { int x=random(1000); int y=random(1000); Environment ('B', x, y); gotoNext; Environment ('B', x, y); gotoNext; } void main() { int p=111, q=222; cout << "Protokoll des akt. Environment:\n\n"; Environment ('M', p, q); A(); Environment ('M', p, q); getch(); return; } Run

Page 49: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

____________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-11

7. Speicherverwaltung

Datenstack-Verwaltung (II)

Objekte des Hauptprogramms: p, q

Globale Objekte: a, b

Objekte der Funktion A: r, s

Objekte des Hauptprogramms: p, q

Globale Objekte: a, b

Objekte der Funktion B: x, y

Objekte der Funktion A: r, s

Objekte des Hauptprogramms: p, q

Globale Objekte: a, b

1.

3.

2.

Page 50: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

____________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-12

7. Speicherverwaltung

Objekte der Funktion B: x, y

Objekte der Funktion B: x, y

Objekte der Funktion A: r, s

Objekte des Hauptprogramms: p, q

Globale Objekte: a, b

Objekte der Funktion B: x, y

Objekte der Funktion A: r, s

Objekte des Hauptprogramms: p, q

Globale Objekte: a, b

Objekte der Funktion A: r, s

Objekte der Funktion B: x, y

Objekte der Funktion A: r, s

Objekte des Hauptprogramms: p, q

Globale Objekte: a, b

4.

5.

6.

Page 51: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

____________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-13

7. Speicherverwaltung

Datenstack-Verwaltung (IV)

program main var p, q: integer; procedure A; var r, s: integer; begin {A} ......... ......... end; {A} procedure B; var u, v: integer; procedure C; var x, y: integer; begin {C} ......... ......... end; {C} begin {B} ......... ......... end; {B} begin {main} ......... ......... end; {main}

main

A

B

C

Objekte von C: x, y

Objekte von C: x, y

Objekte von B: u, v

Objekte von A: r, s

Objekte von main: p, q Aufrufreihenfolge: main → A → B → C → C

Page 52: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-13

7. Speicherverwaltung

Rückkehrverwaltung mit Dynamic Links

Objekte der Funktion A: r, s

Objekte der Funktion B: x, y

Objekte der Funktion A: r, s

Objekte von main: p, q

Globale Objekte: a, b Aufrufreihenfolge: main → A → B → C

Page 53: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-14

7. Speicherverwaltung

Environment-Verwaltung mit Static Links

Merkmale: Static Link-Zeiger verketten alle Datenräume, die zum Environment

einer Programmeinheit gehören

Objekte werden adressiert über:

die Niveau-Differenz zwischen dem Niveau ihrer Verwendung und dem Niveau ihrer Vereinbarung und

ihre Distanz zur Basis des Datenraums, dem sie angehören.

Page 54: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-15

7. Speicherverwaltung

Beispiel 1 zu Static Links

(Bezug: C-Programm aus Beispiel 7.4)

Objekte der Funktion A: r, s

Objekte der Funktion B: x, y

Objekte der Funktion A: r, s

Objekte von main: p, q

Globale Objekte: a, b

A

B

main

globals

Page 55: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-16

7. Speicherverwaltung

Beispiel 2 zu Static Links

(Bezug: Pascal-Programm aus Beispiel 7.5)

Objekte von C: x, y

Objekte von C: x, y

Objekte von B: u, v

Objekte von A: r, s

Objekte von main: p, q

A

B

C

main

Page 56: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-17

7. Speicherverwaltung

Initialisierung der Static Links

Gehe vom Datenraum der aufrufenden Prozedur in der Static Link-Kette um (n-m+1) Schritte zurück. Dabei gilt:

n = Deklarationsniveau der aufrufenden Funktion m = Deklarationsniveau der gerufenen Funktion

Setze den Static Link-Zeiger der neu aktivierten Prozedur auf den so erreichten Datenraum.

Page 57: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-18

7. Speicherverwaltung

Beispiele zur Initialisierung der zu Static Links

Aufruf erfolgt im Aufgerufene

Funktion Dekl.-Level

des Aufrufs (n)

Dekl.-Level d. gerufenen Funktion (m)

(n-m+1) Schritte zurück

Ziel des Link

Rumpf von main A 1 2 0 main Rumpf von A B 2 2 1 main Rumpf von B A 2 2 1 main

Rumpf von B C 2 3 0 B Rumpf von C A 3 2 2 main Rumpf von C B 3 2 2 main

(Bezug: Pascal-Programm aus Beispiel 7.5)

A

B

C

main

Page 58: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-19

7. Speicherverwaltung

Environment-Verwaltung mit Displays

Objekte werden adressiert über:

das statische Niveau ihrer Deklaration die Distanz zur Basis des

Datenraumes, dem sie angehören

Objekte von C: x, y

Objekte von C: x, y

Objekte von B: u, v

Objekte von A: r, s

Objekte von main: p, q

Page 59: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-20

7. Speicherverwaltung

Initialisierung der Display-Vektoren

Der Display-Vektor wird beim Anlegen eines Datenraumes initialisiert: (m = Niveau des Aufrufs, n = Niveau der gerufenen Funktion):

Übernimm den Display-Vektor aus dem Datenraum der rufenden Prozedur für die Indexpositionen 0, 1, ... , m-1.

Trage auf der Position m die Adresse des neu angelegten Datenraumes ein.

Page 60: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-21

7. Speicherverwaltung

Felder mit dynamischen Grenzen

In Pascal: arrayA: array[u..n, v..m] of ... ;

In C++: int i, n; long *arrayA; cin >> n; arrayA = new long [n]; for (i=0; i<n; i++) { cout << "arrayA[" << i << "] = "; cin >> arrayA[i]; }

Page 61: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-22

7. Speicherverwaltung

Deskriptoren für Felder mit dynamischen Grenzen

DSA -Top pointer

Deskriptor von arrayA

Daten von arrayA

DSA -Top pointer

Deskriptor von arrayA

Page 62: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-23

7. Speicherverwaltung

Allgemeiner Aufbau von Feld-Deskriptoren

FeldA : array [u1..o1, u2..o2 , ... , un..on] of …

u1 o1 s1 u2 o2 s2 . . . . . . . . . un on sn

α0

Page 63: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-24

7. Speicherverwaltung

Beispiel: Feld-Deskriptor und Anordnung der Feld-Daten

A : array [1..4, 2..3] of integer;

u1 = 1 o1 = 4 s1 = 8 u2 = 2 o2 = 3 s2 = 4 α0 = ......

Deskriptor

logische Anordnung

physikalische Anordnung:

A[1,2] A[1,3] A[2,2] A[2,3] A[3,2] A[3,3] A[4,2] A[4,3]

A[1,2] A[1,3] A[2,2] A[2,3] A[3,2] A[3,3] A[4,2] A[4,3]

Page 64: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-25

7. Speicherverwaltung

Beispiel zur Adreßrechnung A : array [1..4, 2..3] of integer;

( )( [ , ] ) 1 *

( 2) *

A i j i

j

α= + − +

+ −

Adresse Länge einer Zeile

Länge einer Komponente

0

( [ , ] ) ( 1)*8 ( 2)*4(1*8 2*4) ( *8 *4)( *8 *4)

A i j i ji j

i j

ααα

= − − + −= − + + += + +

Adresse

0 (1*8 2*4)α α= − +

Page 65: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H. Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 7-26

7. Speicherverwaltung

Allgemeine Adreßrechnung

( )( )

( )

1

0 1 1 2 2

1 0 1 1 2 2

1 * , 1, ..... , 2

* * ..... *

( [ ,..., ] ) * * ..... *

n

k k k k

n n

n n n

s

s o u s n n

u s u s u s

A i i i s i s i s

α α

α

=

= − + −

= − + + +

= + + + +

Länge einer Feldkomponente

für

Adresse

Page 66: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-1

8. Syntaxorientierte Übersetzung

8. Syntaxorientierte Übersetzung 8. Syntaxorientierte Übersetzung

Code- generierung

Inter- pretation

Page 67: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-2

8. Syntaxorientierte Übersetzung

Zwischensprachen (I): Quadrupelsprachen Zwischensprachen (I): Quadrupelsprachen

die Anweisungen sind Dreiadreßbefehle

Operator 1. Operand 2. Operand 3. Operand

Quadrupelcode für die Zuweisung Z = A ∗ B + C ∗ D;

1: MPY A B $HV1 2: MPY C D $HV2 3: ADD $HV1 $HV2 $HV3 4: STORE $HV3 Z

Page 68: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-3

8. Syntaxorientierte Übersetzung

Zwischensprachen (II): Tripelsprachen

die Anweisungen sind Zweiadreßbefehle

Operator 1. Operand 2. Operand

Tripelcode für die Zuweisung Z = A ∗ B + C ∗ D;

1: MPY A B 2: MPY C D 3: ADD (1) (2) 4: STORE (3) Z

Page 69: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-4

8. Syntaxorientierte Übersetzung

Zwischensprachen (III): Postfixsprachen

die Anweisungen besitzen einen oder gar keinen expliziten Operanden weitere implizite Operanden liegen im Stack Jede Operation hat eine eindeutige Zahl von Operanden

Postfixcode für die Zuweisung Z = A ∗ B + C ∗ D ;

1: LOAD A 2: LOAD B 3: MPY 4: LOAD C 5: LOAD D 6: MPY 7: ADD 8: STORE Z

Page 70: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-5

8. Syntaxorientierte Übersetzung

Übersetzung von Ausdrücken in Quadrupelcode (I)

Ziel: Generierung von Zwischencode bei der syntaktischen Analyse

Methode: Der Analysestack wird so erweitert, daß während der Analyse semantische Informationen mitgeführt werden können.

Beispiel:

{ }{ }, , ( , )

=

= + ∗

→ +

= →

13

13

13

N

T

P

E , T

v ,

E T | E TT F | T *FF v | (E)

Page 71: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-6

8. Syntaxorientierte Übersetzung

Übersetzung von Ausdrücken in Quadrupelcode (II)

Semantische Informationen und Aktionen

Als semantische Information merken wir uns Variablen und Hilfsvariablen in einem Array HV . HV[i] bezeichnet sein i-tes Element.

Wenn der Parser eine syntaktische Struktur erkennt erzeugt er mit einer Funktion

generate (...) eine Zwischencode-Anweisung im Quadrupel-Format.

Notation: sem(sym) verweist auf die semantische Information zum Token sym .

Page 72: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-7

8. Syntaxorientierte Übersetzung

Übersetzung von Ausdrücken in Quadrupelcode (III)

Die semantischen Aktionen zu den Produktionen von 13Γ sind:

→E T sem(E) := sem(T)

→ +1 2E E T i ++ sem(E1) := hv[i] generate (ADD, sem(E2), sem(T), hv[i])

→T F sem(T) := sem(F)

→ ∗1 2T T F i ++ sem(T1) := hv[i] generate (MPY, sem(T2), sem(F), hv[i] )

→F v sem(F) := sem(v)

→F (E) sem(F) := sem(E)

Page 73: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

____________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-8

8. Syntaxorientierte Übersetzung

Ablauf der Übersetzung von (A+B)∗C Schritt Stackinhalt Eingabe ZwischenCode

1. ( A + B ) ∗ C

2. ( A + B ) ∗ C

3. ( v + B ) ∗ C A

4. ( F + B ) ∗ C A

5. ( T + B ) ∗ C A

6. ( E + B ) ∗ C A

7. ( E + B ) ∗ C A

8. ( E + v ) ∗ C A B

9. ( E + F ) ∗ C A B

10. ( E + T ) ∗ C A B

Übersetzung von Ausdrücken in Quadrupelcode (IV)

Page 74: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

____________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-9

8. Syntaxorientierte Übersetzung

Ablauf der Übersetzung von (A+B)∗C

11. ( E ) ∗ C ADD A B hv[1] hv[1]

12. ( E ) ∗ C hv[1]

13. F ∗ C hv[1]

14. T ∗ C hv[1]

15. T ∗ C hv[1]

16. T ∗ v hv[1] C

17. T ∗ F hv[1] C

18. T MPY hv[1] C hv[2] hv[2]

19. E hv[2]

Übersetzung von Ausdrücken in Quadrupelcode (IV)

Page 75: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-9

8. Syntaxorientierte Übersetzung

Übersetzung von Ausdrücken in Postfixcode (I)

Beispiel-Grammatik 11Γ

{ }{ }

{ }{ }

, , , , / , ( , )

[ | ]

| | ( )

, ,

,

=

= + − ∗

→ + − + −

= → ∗

11

11

11

N

T

P

expr term fact

ident number

expr term term | term

term fact fact | / fact

fact ident number expr

Page 76: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-10

8. Syntaxorientierte Übersetzung

Übersetzung von Ausdrücken in Postfixcode (II) Die Architektur der Zielmaschine

LOAD v bringt den Wert der Variablen v in den Stack

LIT c bringt den Wert der Konstanten c in den Stack

NEG negiert den obersten Stackeintrag

ADD addiert die obersten beiden Stackelemente und legt das Resultat wieder in den Stack

SUB subtrahiert die obersten beiden Stackelemente und legt das Resultat wieder in den Stack

MPY multipliziert die obersten beiden Stackelemente und legt das Resultat wieder in den Stack

DIV dividiert die obersten beiden Stackelemente und legt das Resultat wieder in den Stack

Page 77: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-11

8. Syntaxorientierte Übersetzung

Übersetzung von Ausdrücken in Postfixcode (III)

Die semantischen Aktionen zu 11Γ :

Semantik von: | | ( )→fact ident number expr

für die Struktur ident: erzeuge LOAD v für die Struktur number: erzeuge LIT c für die Struktur ( expr ): keine semantische Aktion erforderlich !

Page 78: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-12

8. Syntaxorientierte Übersetzung

Übersetzung von Ausdrücken in Postfixcode (IV)

Die semantischen Aktionen zu 11Γ :

Semantik von { }[ | ]→ + − + −expr term term | term

für das Vorzeichen − wird eine NEG-Anweisung generiert, sobald der Operand verarbeitet ist.

Für die Teilstrukturen + term und - term , wird zuerst der Operand verarbeitet und dann die Operation generiert

Semantik von { }→ ∗term fact fact | / fact

Für die Teilstrukturen ∗ term und / term , wird zuerst der Operand verarbeitet und dann die Operation generiert

Page 79: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

___________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-13

8. Syntaxorientierte Übersetzung

Übersetzung von Ausdrücken in Postfixcode (V)

Codegenerierung mit einem Recursive Descent-Übersetzer für Ausdrücke (A):

void exprParser::expression (void) { char plusMinus[6]; if ((sym==plus) || (sym == minus)) { if (sym==minus) strcpy (plusMinus, "NEG\n"); else strcpy (plusMinus, "" ); getSym(); term(); if (strlen(plusMinus)>0) cout << plusMinus ; } else { term(); } while((sym==plus) || (sym == minus)) { if (sym==plus) strcpy (plusMinus, "ADD\n"); else strcpy (plusMinus, "SUB\n"); getSym(); term(); cout << plusMinus ; } } void exprParser::term(void) { char timesSlash[6]; factor(); while ((sym==times) || (sym == slash)) { if (sym==times) strcpy (timesSlash, "MPY\n"); else strcpy (timesSlash, "DIV\n"); getSym(); factor(); cout << timesSlash ; } }

Page 80: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

___________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-14

8. Syntaxorientierte Übersetzung

Übersetzung von Ausdrücken in Postfixcode (VI)

Codegenerierung mit einem Recursive Descent-Übersetzer für Ausdrücke (B):

void exprParser::factor(void) { switch (sym) { case ident: getSym(); cout << "LOAD " << id << endl; break; case number: getSym(); cout << "LIT " << num << endl; break; case lparen: getSym(); expression(); if (sym == rparen) getSym(); else cout << "Symbol can't follow an expression !\n; break; default: cout << "factor expected !" << endl; break; } } Übersetzung einer Beispieldatei

Run

alpha + beta/12; pi*2/(radius1-radius2);(x17 - x18) / 15; a*b+c.

Page 81: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-15

8. Syntaxorientierte Übersetzung

Übersetzung bedingter Anweisungen (I)

Struktur des zu erzeugenden Code:

Code zur Auswertung der condition

jump on false L1

Code zur Auswertung des statement

nachfolgender Code

then if condition statement

L1:

Page 82: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-16

8. Syntaxorientierte Übersetzung

Übersetzung bedingter Anweisungen (II)

case ifSym: getSym(); condition( STAT_START | IDENT | DO_THEN_OF, lev ); if (sym==thenSym) getSym(); else error(16); fixup1 = cx; // Adresse des jpc-Befehls merken generate (jpc, 0, 0); // then-Zweig bedingt umgehen statement(followSymSet | UNTIL_ELSE, lev); code[fixup1].a = cx; // Adresse des jpc-Befehls setzen break;

Page 83: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-17

8. Syntaxorientierte Übersetzung

Der PL/0-Übersetzer

Die Struktur der Symboltabelle (I)

int tx; // symbol table index struct // symbol table: { objType kind; // object type of this entry char name[CMAX+1]; // object identifier union { int val; // numerical value for constants struct { int level; // address information int addr int size; }; }; } symTable[TXMAX];

Page 84: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-18

8. Syntaxorientierte Übersetzung

Der PL/0-Übersetzer

Die Struktur der Symboltabelle (II)

Einträge für Konstanten:

Konstanten-Name constObj Konstanten-Wert

Einträge für Variablen:

Variablen-Name varObj DeklarationsLevel Relativadr. in der DSA

Einträge für Prozeduren:

Prozedur-Name procObj DeklarationsLevel Adr. der 1. Anweisung DSA-Größe

Page 85: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-19

8. Syntaxorientierte Übersetzung

Der PL/0-Übersetzer

Die Datenraum-Struktur

Static Link Dynamic Link Rückkehradresse lokale Variablen lokale Hilfsvariablen

Page 86: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-20

8. Syntaxorientierte Übersetzung

Der PL/0-Übersetzer Zwischencode-Anweisungen (I)

Transportoperationen:

LIT n bringe einen Literalwert n in den Hilfsvariablenstack

LOD l , a bringe Variable mit der Relativdistanz a und der Niveaudifferenz l in den Stack

STO l , a bringe das Stacktop-Element in Variable mit der Relativdistanz a und der Niveaudifferenz l

INC n Reserviere n Plätze im Laufzeit-Stack für den nächsten Datenraum

Sprungbefehle:

JPU a springe zur Anweisung mit der Adresse a

JPC a Jump on false zur Code-Adresse a

CAL a Aufruf der Prozedur mit der Codeadresse a. (DSA anlegen, initialisieren, springen)

RET Rückkehr aus einer Prozedur

Page 87: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-21

8. Syntaxorientierte Übersetzung

Der PL/0-Übersetzer Zwischencode-Anweisungen (II)

Arithmetische Operationen

ADD addiere zwei Summanden. SUB subtrahiere das oberste Stackelement vom darunter stehenden MPY multipliziere zwei Faktoren. DIV Dividiere das vorletzte Stackelement durch das oberste. NEG negiere das oberste Stackelement.

Logische Operationen

OD Ist der (einzige) Operand ungerade ?

EQ Sind beide Operanden gleich ?

NE Sind beide Operanden ungleich ?

LE Ist der erste Operand kleiner oder gleich dem zweiten ?

GE Ist der erste Operand größer oder gleich dem zweiten ?

LS Ist der erste Operand kleiner als der zweite ?

GT ist der erste Operand größer als der zweite ?

Page 88: 5. Bottom up-Parser5. Bottom up-Parser...5. Bottom up-Parser Das Handle Ein Teilstring β einer Satzform αβγ heißt Handle, falls β die rechte Seite einer Produktion N→β ist

_______________________________________________________________________________________________________________________________ H.Kopp, V. Matoušek: Programmiersprachenentwurf / FH Regensburg 8-22

8. Syntaxorientierte Übersetzung

Der PL/0-Übersetzer Zwischencode-Generator

void pl0Parser::generate(opCode opc, int lv, int ad) { if (cx > CODEMAX) error(31); // too many code entries else { code[cx].o = opc; // generate operation code[cx].l = lv; // generate level difference code[cx].a = ad; // generate address cx++; // point to next free entry } }