Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Übersetzertechnik (in Arbeit!!!) © Günter Riedewald Die Folien sind eine Ergänzung der Vorlesung und nur für den internen Gebrauch konzipiert.

Ähnliche Präsentationen


Präsentation zum Thema: "Übersetzertechnik (in Arbeit!!!) © Günter Riedewald Die Folien sind eine Ergänzung der Vorlesung und nur für den internen Gebrauch konzipiert."—  Präsentation transkript:

1 Übersetzertechnik (in Arbeit!!!) © Günter Riedewald Die Folien sind eine Ergänzung der Vorlesung und nur für den internen Gebrauch konzipiert.

2 Motivation Programmiersprachen als wichtiges Mittel der Softwaretechnik  Weiterentwicklung der Softwaretechnik erfordert neue Sprachen einschließlich deren Implementation Programmiersprachen: - universell (Universalsprachen, general purpose languages): allgemein einsetzbar und unabhängig von einem konkreten Einsatzgebiet; Compilerentwicklung durch Spezialisten

3 - spezialisiert (Fachprogrammiersprachen, Spezialsprachen, special purpose languages, domain specific languages): in Syntax und Semantik zugeschnitten auf ein bestimmtes Fachgebiet; wegen stetig wachsendem Bedarf Entwicklung von Compilern/Interpretern auch durch Nichtspezialisten Probleme des Übersetzerbaus treten auch in anderen Gebieten der Informatik auf (z.B. XML) Abstrakte Betrachtung einer Übersetzung: - Analyse der Struktur der Eingabedaten - Strukturabhängige Erzeugung der Ausgabedaten

4 Gute Kenntnisse über Programmiersprachen und deren Compiler als Voraussetzung für Qualitätssoftware Didaktische Gründe: - Exemplarisches Vorgehen für die Entwicklung größerer Softwaresysteme : klarer logischer Aufbau, Modularisierung, Nutzung von Werkzeugen, Wartbarkeit, Wiederverwendbarkeit - Fachübergreifende Rolle bzgl. Voraussetzungen und eingesetzten Techniken: Automatentheorie, Theorie der formalen Sprachen, Theorie der Programmiersprachen, Prinzipien der Softwaretechnik, Rechnerarchitektur/ Rechnersysteme...

5 - Enger Zusammenhang zwischen Theorie und Praxis : gute theoretische Basis als Voraussetzung der Automatisierung der Compilerentwicklung  Vorbildcharakter für andere Informatikbereiche

6 Literatur A.V. Aho, J.D. Ullman: The Theory of Parsing, Translation and Compiling, Prentice Hall, 1972 A.V. Aho, J.D. Ullman: Principles of Compiler Design Addison-Wesley, 1977 A.V. Aho, R. Sethi, J.D. Ullman (2007 zusätzlich: M. S. Lam): Compilers Principles, Techniques and Tools, (Drachenbuch), Addison Wesley, 1986, 2007

7 A.V. Aho, R. Sethi, J.D. Ullman: Compilerbau, (Drachenbuch), Addison-Wesley, 1988, 1990 H. Alblas, A. Nymeyer: Practice and Principles of Compiler Building with C, Prentice Hall, 1996 A. W. Appel: modern compiler implementation in Java (in C) – basic techniques, Cambridge University Press, 1997 J. Elder: Compiler Construction – A Recursive Descent Model, Prentice Hall, 1994 D. Gries: Compiler Construction for Digital Computers, Wiley, 1971 In Russ.: Konstruirovanije kompiljatorov dlja cifrovych vyčislitelnych mašin, Mir, 1975

8 J. Holmes: Object-Oriented Compiler Construction, Prentice-Hall, 1995 U. Kastens: Übersetzerbau, Oldenbourg Verlag, 1990 H. Loeper, W. Otter, H.-J. Jäkel: Compiler und Interpreter für höhere Programmiersprachen, Akademie-Verlag, 1987 K. C. Louden: Compiler Construction – Principles and Practice, PWS Publ. Com., 1997 S. S. Muchnik: Advanced Compiler Design and Implementation, Morgan Kaufmann Publishers, 1997

9 S. Naumann, H. Langer: Parsing, Teubner Stuttgart, 1994 P. Rechenberg, M. Mössenbeck: Ein Compiler-Generator für Mikrocomputer, Hanser Verlag, 1985 W.M. Waite, G. Goos: Compiler Construction, Springer, 1984 D.A. Watt: Programming Language Processors, Prentice Hall International Series in Computer Science, 1993 D.A. Watt, D. F. Brown: Programming Language Processors in Java – Compilers and Interpreters, Prentice-Hall, 2000

10 R. Wilhelm, D. Maurer: Übersetzerbau – Theorie, Konstruktion, Generierung, Springer-Lehrbuch, 1992 N. Wirth: Compilerbau, Teubner Studienbücher Informatik, Teubner Stuttgart, 1986 P. D. Terry: Compilers & Compiler Generators – An Introduction with C++, Intern. Thomson Computer Press, 1997 H. Zima: Compilerbau I, II, BI Mannheim, Reihe Informatik 36,37, 1982, 1983

11 Translatoren - Arten Assemblierer ( Assembler ): übersetzt aus einer Sprache niederen Niveaus (Sprache mit symbolischer Adressierung, Assemblersprache) in Maschinensprache meist im Verhältnis 1:1 Makroassembler : übersetzt aus einer Sprache niederen Niveaus in Maschinensprache meist im Verhältnis 1:n mit n  1 Compiler : übersetzt aus Sprache von hohem Niveau in Maschinensprache (letztendlich)

12 Präprozessor : übersetzt aus Obermenge zu einer Sprache in Ausgangssprache Translator auf hohem Niveau: übersetzt aus Sprache hohen Niveaus in andere Sprache hohen Niveaus Decompiler ( Disassembler ): Regeneriert Quellcode aus Zielcode Self-resident translator : Erzeugung von Zielcode für die Wirtsmaschine (host) Cross-translator : Erzeugung von Zielcode für andere Maschine Interpreter : anweisungsweise Übersetzung und sofortige Ausführung von Quellcode

13 Interpretativer Compiler : Übersetzung aus einer Sprache hohen Niveaus in eine Zwischensprache mit anschließender Interpretation Emulator : Interpretation des Codes einer anderen Maschine

14 1 Übersetzerbau - Einführung 1.1 Symbolische Darstellungen Übersetzer ÜbersetzungProgramm P Übersetzer Programm P von Pin Quell- in I in Zielsprache Z sprache Q AbarbeitungEingabe-P Ausgabe- von Pdatenin Z daten

15 InterpretationProgramm P Inter- Ausgabedaten von Pin Quell- preter sprache Q Eingabedaten T-Diagramme (tombstones) ÜbersetzerP P Q Q  Z Z I

16 Abarbeitung eines Programms E P A Z Interpreter E P A Q Z

17 Modifikationen der T-Diagramme Programm P in L geschrieben P L Maschine M M Bezeichneter Compiler

18 1.2 Einführungsbeispiel Übersetzung von Pascal in P-Code P-Code: - Sprache der P-Maschine (abstrakter Rechner) - Zwischensprache in Compilern P P P Pascal Pascal  P-Code P-Code P-Code  M M M M

19 1.2.1 Implementierungsprinzipien für ausgewählte imperative Sprachkonzepte Imperative Konzepte Variablenkonzept: - Variable als Modell für einen Speicherplatz - Möglichkeit des Lesens und der Wertänderung (Schreiben)  Compilersicht: Speicherplatzzuordnung + Zugriff zum Wert als Ganzes oder in Teilen + Lebensdauer + Gültigkeitsbereich (Zugriffsrechte) Strukturierungskonzept für Datenstrukturen  Compilersicht: Abspeicherungskonzept + Zugriff

20 Sprachkonzepte zur Ablaufsteuerung  Compilersicht: Umsetzung in Sprünge unterschiedlicher Art Prozedurkonzept: - Nichtrekursive Prozedur  Compilersicht: Ersetzen des Aufrufs durch Anweisungen der Prozedur oder Sprünge mit Rückkehr zur Anweisungsfolge - Rekursive Prozedur  Compilersicht: mehrere gleichzeitige Aufrufe erfordern mehrere Inkarnationen des Speicherbereichs der Prozedur (Verwendung von Kellertechnik) - Parameterübergabe  Compilersicht: zusätzliche Anweisungen

21 P-Maschine DatenspeicherSTORE 0SP maxstr ProgrammspeicherCODE 0 PC codemax Befehlsausführung: -Steuerung durch Steuerschleife do PC := PC + 1; Ausführung des Befehls in CODE[PC-1] od - Initialisierung PC := 0

22 1.2.2 Ausgewählte Sprachkonstrukte und ihre Übersetzung Voraussetzungen: -Die Kontextbedingungen sind erfüllt (durch semantische Analyse geprüft). -Alle Konstrukte sind syntaktisch eindeutig zerlegbar (Durchführung durch syntaktische Analyse). Ausdrücke Übersetzungsfunktion: - code: Ausdruck x Umgebung  P-Code (Umgebung: u: Variablen  Adressen)

23 -Unterschiedliche Ausdruckbehandlung auf linker und rechter Seite einer Zuweisung  code R : Übersetzung in Befehle zur Berechnung eines Werts code L : Übersetzung in Befehle zur Berechnung einer Adresse Wertzuweisung code 〚 x := e 〛 u = code L 〚 x 〛 u ; code R 〚 e 〛 u ; sto T T Typ; u Umgebung; x Variable; e Ausdruck

24 Wirkung von sto : STORE vor   w Abarbeitung  SP-2SP  Adresse von x (u(x) =  ); w Wert von e STORE nach w  Abarbeitung  SP

25 code R 〚 e1 + e2 〛 u = code R 〚 e1 〛 u; code R 〚 e2 〛 u; add T T Typ; e1, e2 Ausdrücke Wirkung von add : STORE vor  w1 w2 Abarbeitung SP STORE nach  w Abarbeitungw = w1 + w2 SP

26 code R 〚 c 〛 u = ldc T c, c Konstante vom Typ T STORE vor  Abarbeitung SP STORE nach  c Abarbeitung SP

27 code L 〚 x 〛 u = ldc a u(x), x Variable STORE vor  Abarbeitung SP STORE nach  u(x) Abarbeitung SP

28 code R 〚 x 〛 u = code L 〚 x 〛 u; ind T = ldc a u(x); ind T, x Variable STORE vorw  Abarbeitungu(x) =   SP STORE nachw   Abarbeitung von ldc a u(x)  SP STORE nachw  w Abarbeitung von ind T  SP

29 Beispiel : Übersetzung von x := (x + (3 + y)), x, y vom Typ i code 〚 x := (x + (3 + y)) 〛 u = code L 〚 x 〛 u; code R 〚 (x + (3 + y)) 〛 u; sto i = ldc a u(x); code R 〚 x 〛 u; code R 〚 (3 + y) 〛 u; add i; sto i = ldc a u(x); ldc a u(x); ind i; code R 〚 3 〛 u; code R 〚 y 〛 u; add i; add i; sto i = ldc a u(x); ldc a u(x); ind i; ldc i 3; ldc a u(y); ind i; add i; add i; sto i

30 Abarbeitungsschritte: u(x) = , u(y) = , w1 Wert von x, w2 Wert von y, w3 = 3 + w2, w4 = w1 + w3  STORE-Zustände w1w2k w1w2k  w1w2k   w1w2k  w1 w1w2k  w1 3 w1w2k  w1 3  w1w2k  w1 3 w2 w1w2k  w1 w3 w1w2k  w4 w4w2k

31 Bedingte Anweisungen code 〚 if e then st1 else st2 fi 〛 u = code R 〚 e 〛 u; fjp l1; code 〚 st1 〛 u; ujp l2; l1: code 〚 st2 〛 u; l2:... Wirkung von fjp l1: k false  kPC := l1 k true  k Wirkung von ujp l2: PC := l2 Anweisungsfolgen code 〚 st1; st2 〛 u = code 〚 st1 〛 u; code 〚 st2 〛 u

32 Wiederholungen code 〚 while e do st od 〛 u = l1: code R 〚 e 〛 u; fjp l2; code 〚 st 〛 u; ujp l1; l2:... Beispiel : code 〚 while a > b do a := a - b od 〛 u = l1: code R 〚 a > b 〛 u; fjp l2; code 〚 a := a - b 〛 u; ujp l1; l2:...= l1: ldc a u(a); ind i; ldc a u(b); ind i; grt i; fjp l2; ldc a u(a); ldc a u(a); ind i; ldc a u(b); ind i; sub i; sto i; ujp l1; l2:...

33 1.3 Logische Compilerstruktur Physische Compilerstruktur Treiber SyntaktischeSemantischeSemantische AnalyseAnalyseSynthese Lexikalische Analyse

34 Physische Compilerstruktur (Fortsetzung) Treiber Syntaktische Analyse LexikalischeSemantischeSemantische AnalyseAnalyseSynthese

35 Logische Compilerstruktur (1) QuellprogrammAnalyse LexikalischerDatentabellen Analysator Codierte TerminalfolgeSyntaktischerDatenmodule Analysator Syntaxbaum Semantischer Analysator Dekorierter Syntaxbaum Semantische Synthese Zielprogramm

36 Logische Compilerstruktur (2) Quellprogramm Lexikalische Analyse Symbol-SyntaktischeFehlerbehandlung tabellen-Analyse verwaltung Semantische Analyse Zwischencode-Code-Code- ErzeugungOptimierungErzeugung Zielprogramm

37 2 Lexikalischer Analysator Aufgabe: Transformation des Quellprogramms aus einer Zeichenfolge in eine codierte Folge von Terminalen (Tokenfolge, Grundsymbolfolge) mit Sammlung spezieller Informationen in Tabellen Teilaufgaben: Auffinden und Erkennen eines Lexems ( ≙ Terminal) Codierung der Lexeme Auslassung überflüssiger Zeichenfolgen Erstellung von Datentabellen

38 2.1 Auffinden und Erkennen von Lexemen Fakt : Lexeme sind überwiegend durch reguläre Grammatikregeln beschreibbar.  Es existieren endliche Automaten, die genau diese Lexeme akzeptieren. Beispiel : ::= 0|1|...|9|0 |...|9 ::= A|...|Z|A |...|Z ::= A|...|Z|0|...|9| A |...|9 ::= +|-|(|)|/|/ |* |: |;|, ::= / ::= * ::= =

39 Endliche Automaten zu den Regeln: 0,...,9 SgZ0,...,9 A,...,Z SIdA,...,9 + - ( ) ;,** SSSt / /:= Sgl

40 Endlicher Automat für Akzeptanz aller Lexeme: A,...,Z A,...,Z,0,...,9 0,...,9 + - ( ) ;,* / :=

41 2.2 Kodierung der Lexeme KodierungLexem KodierungLexem 1Identifikator9** 2ganze Zahl10( 3BEGIN11) 4END12// 5REAL13:= 6/14;

42 Semantische Aktionen ADDAufsammeln von Zeichen eines Lexems in einer Puffervariablen A GCLesen des nächsten Quellprogrammzeichens, Zwischenablage in der Variablen Char sowie Bestimmung der Art des Zeichens LOOKUPBestimmung der Kodierung des in A abgelegten Lexems gemäß Tabelle der internen Kodierung (Kodierung 1 bei Nichtvorhandensein) OUT(C,A)Ausgabe eines Lexems (in A) zusammen mit seiner Kodierung (in C) GPCÜberlesen aller bedeutungslosen Zeichen und Fortsetzung wie GC sowie Löschen von A

43 Endlicher Automat mit semantischen Aktionen: A,...,Z LOOKUP(A,C);OUT(C,A) ADD;GCA,...,Z,0,...,9 ADD;GC 0,...,9OUT(2,A) ADD;GC0,...,9 GPCADD;GC + - ( ) ;, ADD;GCLOOKUP(A,C);OUT(C,A)* ADD;GC ADD;GCOUT(9,A) / ADD;GC /OUT(6,A) ADD;GCOUT(12,A) := ADD;GCADD;GCOUT(13,A)

44 2.5 Automatische Erzeugung von lexikalischen Analysatoren LexembeschreibungLexikalischer (reguläre Ausdrücke,Analysator - semantischeRahmensystem Aktionen) GeneratorSteuerung

45 Lex-Spezifikation % { }... %

46 Beispiel : # include ´´y.tab.h´´ extern int yyz, yyli; extern symbol *lookup(), *install(); % ´´\n´´{yyli ++;} [ ]; [0-9][0-9]*{symbol *s; if ((s=lookup(yytext))==0) s=install(yytext);...; return (ZAHL);} if{return (IF);}... true{keys *k; k=lookkey(yytext); yylval.yyk=k; return (TRUE);} [a-z][a-z 0-9]*{symbol *s; if ((s=lookup(yytext))==0) s=install(yytext); yylval.yysym=s; return (IDENTIFIKATOR);} %

47 3 Syntaktische Analyse Beispiel : 11Aus  Id ( Aus ) 12Aus  Id [ Aus ] 13Aus  Id 14Id  a 15Id  f 16Id  z

48 Syntaxbaum von f(a[z]) AusTop-down Analyse 11 IdAus 12 15Id Aus 13 14IdBottom-up Analyse 16 f(a[z])

49 3.1 Kellerspeicher in der Syntaxanalyse Top-down Analyse - Grundalgorithmus Voraussetzung: Verwendung eines Analysekellers Schritte des Algorithmus´: 1.Startsymbol in den Keller 2.Wiederholung folgender Schritte bis zum Erreichen eines leeren Kellers: - Nichtterminal an Kellerspitze: Expansion (Ersetzen des Nichtterminals durch rechte Seite einer geeigneten Syntaxregel) - Terminal an Kellerspitze: Vergleich mit aktuellem Element des analysierten Wortes; bei Gleichheit Streichen aus dem Keller, nächstes Element des Wortes wird aktuelles Element; bei Ungleichheit Backtracking

50 Beispiel :Top-down Analyse von f(a[z]) Aktuelles ElementKeller (Spitze links)Operation f(a[z])AusAus  Id ( Aus ) f(a[z])Id ( Aus )Id  f f(a[z])f ( Aus )2x Vergleich a[z])Aus )Aus  Id [ Aus ] a[z])Id [ Aus ] )Id  a a[z])a [ Aus ] )2x Vergleich z])Aus ] )Aus  Id  z z])z] )3x Vergleich 

51 Bottom-up Analyse - Grundalgorithmus Schritte des Algorithmus´: 1.Start mit leerem Keller 2.Wiederholung folgender Schritte, bis das Startsymbol allein im Keller ist: - Reduktion : nur möglich, wenn an der Kellerspitze die rechte Seite einer Regel ist (  Ersetzen durch linke Seite) - Einlesen (Verschiebung): Einlesen des nächsten Elements des Wortes in den Keller

52 Beispiel : Bottom-up Analyse von f(a[z]) RestwortKeller (Spitze rechts)Operation f(a[z])  Lesen f (a[z])fReduktion f zu Id (a[z])IdLesen (a [z])Id (aReduktion a zu Id [z])Id ( IdLesen [z ])Id ( Id [zReduktionen z zu Id, Id zu Aus ])Id ( Id [ AusLesen ] )Id ( Id [ Aus ]Reduktion Id [ Aus ] zu Aus )Id ( AusLesen )  Id ( Aus )Reduktion Id ( Aus ) zu Aus  Aus

53 3.2 Deterministische Syntaxanalyse Top-down Verfahren - Methode des rekursiven Abstiegs Grundmethode: Idee: Syntaktische Regel A ...wird als Prozedur zur Erkennung von Zeichenketten aus L(A) betrachtet, wobei die rechte Seite der Regel die Struktur vorgibt: Terminal: erwartetes Terminal Nichtterminal: Aufruf der entsprechenden Prozedur Alternativen: Code-Alternativen in der Prozedur

54 Beispiel : Prozedur zur Regel T  ( Aus )| [ Aus ] procedure T; begin case token of (: match( ( ); Aus; match( ) ); [: match( [ ); Aus; match( ] ); else error; end case ; end T; Vor.: token enthält aktuelles Terminal der zu analysierenden Zeichenkette

55 Definition der Prozedur match: procedure match(expectok); begin if token = expectok then gettoken else error fi ; end match; gettoken liest das nächste Zeichen aus der Zeichenkette und ordnet es token zu.

56 Konstruktion der Zerlegungsprozeduren N  X : procedure N; bedeutet Anweisungen zur Erkennung von X, wobei - X =  einer Leeranweisung - X = t (Terminal, token) match(t) - X = M (Nichtterminal) M (Aufruf der Prozedur) - X = A B ;

57 - X = A| B case token of e1: ; e2: ; else error; end case ; e1  DS(N, A), e2  DS(N, B) - X = A * while token  DS(N, A) do od entspricht.

58 Definition der Entscheidungsmenge (director set) Vor.: A   1 |...|  n DS(A,  i ) = {a  T| a  FIRST 1 (  i ) ∨ (  i  *  ⋀ a  FOLLOW 1 (A))} Beispiel: 1A  I T  11/12/13T  ( A )| [ A ]|  14/15/16I  a| f| z DS(T,  1 ) = { ( }DS(I,  1 ) = {a} DS(T,  2 ) = { [ }DS(I,  2 ) = {f} DS(T,  3 ) = { ], ),  }DS(I,  3 ) = {z}

59 Top-down Analyse von f(a[z]) Keller (  )ZeichenketteKeller Zeichenkette Af(a[z])  [ A ] ) I TA ] )z])  f TI T ] ) T(a[z])  z T ] ) ( A )T ] )])  A )a[z])  ] ) I T )))  a T )  T )[z]) 

60 LL(k)-Grammatik G = (N, T, P, S) G ist eine kontextfreie Grammatik Für beliebige Paare von Linksableitungen S  +  A     *  x S  +  A     *  y mit FIRST k (x) = FIRST k (y) gilt  = .

61 Starke LL(k)-Grammatik G = (N, T, P, S) Für jedes Paar von Regeln aus P A  x und A  y(A  x | y) gilt FIRST k (x FOLLOW k (A))  FIRST k (y FOLLOW k (A)) = 

62 Tabellengesteuerte LL(1)-Analyse Analysealgorithmus: Eingabe : Analysetabelle M, Zeichenkette w  T * Ausgabe : Fehlermeldung oder Regelnummernfolge Startkonfiguration : (w , S#,  ) Schritte : 1. (ax, A , r) ⊢ (ax, , r i) für M(A, a) = ( , i) 2. (ax, a , r) ⊢ (x, , r), a  T 3. ( , #, r) erfolgreicher Abschluss 4. Fehler sonst

63 Analysetabelle für obige Grammatik und Analyse von f(a[z]) afz( [ ) ]  AIT,1IT,1IT,1 T(A),11 [A],12 ,13 ,13 , 13 Ia,14f,15z,16 (f(a[z]) , A#,  ) ⊢ (f(a[z]) , IT#, (1)) ⊢ (f(a[z]) , fT#, (1 15)) ⊢ ((a[z]) , T#, (1 15)) ⊢ ((a[z]) , (A)#, ( )) ⊢ (a[z]) , A)#, ( )) ⊢ (a[z]) , IT)#, ( )) ⊢ (a[z]) , aT)#, ( )) ⊢ ([z]) , T)#, ( )) ⊢

64 ([z]) , T)#, ( )) ⊢ ([z]) ,[A])#, ( )) ⊢ (z]) , A])#, ( )) ⊢ (z]) , IT])#, ( )) ⊢ (z]) , zT])#, ( )) ⊢ (]) , T])#, ( )) ⊢ (]) , ])#, ( )) ⊢ () , )#, ( )) ⊢ ( , #, ( ))

65 Deterministische Syntaxanalyse Bottom-up Verfahren - Einfache Präzedenz Einfache Präzedenz Relationen: R <∙ S: Es existiert eine Regel U ...R V... und V  + S.... R ≐ S: Es existiert eine Regel U ...R S.... R ∙> S: Es existiert eine Regel U ...V W... Und V  +...R sowie W  * S....

66 Präzedenzmatrix für Beispielgrammatik Aus Id()[]afz Aus ≐≐ Id ≐ ∙> ≐ ∙> ( ≐ <∙ <∙ <∙ <∙ )∙>∙> [ ≐ <∙ <∙ <∙ <∙ ]∙>∙> a∙>∙> ∙>∙> f∙>∙> ∙>∙> z∙>∙> ∙>∙>

67 Analyseprozess unter Nutzung der Präzedenzmatrix Wiederholung folgender Schritte: 1. Einspeicherung der Zeichen der Zeichenkette in den Keller, bis an der Kellerspitze ein Zeichen E steht, das in der Relation ∙> mit dem nächsten einzulesenden Zeichen steht 2. Abstieg im Keller bis zum Erreichen des ersten Zeichens A mit y <∙ A, dabei befindet sich y im Keller direkt unter A 3. Reduktion der Zeichenkette A...E im Keller gemäß syntaktischen Regeln

68 Analyse von f(a[z]) KellerRestwort ( a [ z ] ) [ z ] ) ] ) ) Aus

69 LR(k)- Analyse Charakterisierung: Entspricht Grundverfahren modifiziert durch Vorausschau auf k Elemente Darstellung durch eine Zustandsmenge zusammen mit Übergangsfunktion in Form einer Analysetabelle, bestehend aus Aktionstabelle (Einlesen und Reduktion) und Sprungtabelle (Fortsetzung nach Reduktion)

70 Beispiel : Konstruktion der Analysetabelle für T  A ⊣ A  I ( A )| I [ A ]| I I  a| f| z Zustände und Übergänge des charakteristischen endlichen Automaten Zustand Q 0 :Zustand Q 1 :Zustand Q 2 : T . A ⊣ T  A. ⊣ A  I.( A ) A . I ( A )A  I. [ A ] A . I [ A ]A  I. A . IZustand Q 3 :Zustand Q 4 : I . aI  a. I  f. I . f I . z Zustand Q 5 : I  z.

71 Zustand Q 6 :Zustand Q 7 :Zustand Q 8 : A  I (. A )A  I [. A ]A  I ( A.) A . I ( A )A .I ( A ) A . I [ A ]A .I [ A ]Zustand Q 9 : A .IA .IA  I [ A. ] I . aI . a I . fI . fZustand Q 10 : I . zI . zA  I ( A ). Zustand Q 11 : A  I [ A ].

72 Q 0 A I Q 1 afz Q 2 Q 3 Q 4 Q 5 [ ( I Q 7 afz A I af z Q 9 Q 6 Q 2 Q 3 Q 4 Q 5 A ]Q 8 ) Q 11 Q 10 Charakteristischer endlicher Automat

73 Analysetabelle ( [afz]) ⊣ A I Q 0 Q 3 Q 4 Q 5 Q 1 Q 2 Q 1 T  A⊣ Q 2 Q 6 Q 7... A  I... Q 3... I  a... Q 4... I  f... Q 5... I  z... Q 6 Q 3 Q 4 Q 5 Q 8 Q 2 Q 7 Q 3 Q 4 Q 5 Q 9 Q 2 Q 8 Q 10 Q 9 Q 11 Q A  I ( A )... Q A  I [ A ]...

74 Syntaxanalyse unter Verwendung einer Analysetabelle (AT): Verwendung zweier Keller: Elementekeller (EK) wie im Grundalgorithmus und Zustandskeller (ZK) Start der Analyse: Q 0 im Zustandskeller Ende der Analyse: Altes Startsymbol im Elementekeller; Endezeichen als aktuelles Zeichen Schritte: 1. Einlesen : Aktuelles Zeichen der Eingabe in EK und neuer Zustand gemäß AT (bestimmt aus altem Zustand und Zeichen) in ZK 2. Reduktion :- Reduktion an EK-Spitze gemäß Regel aus AT (bestimmt durch alten Zustand und aktuelles Zeichen) - Entfernen von Zuständen aus ZK (Anzahl gleich Anzahl der Elemente auf r. S. der Regel) - Neuer Zustand gemäß AT (bestimmt durch Zustand an ZK-Spitze und Nichtterminal auf l. S. der Regel) in ZK

75 Beispiel : Analyse von f ( a [ z ] ) ⊣ ElementekellerRestwortZustandskeller Aktion f(a[z]) ⊣ Q 0 Einlesen f(a[z]) ⊣ Q 0 Q 4 Reduktion I(a[z]) ⊣ Q 0 Q 2 Einlesen I (a[z]) ⊣ Q 0 Q 2 Q 6 Einlesen I ( a[z]) ⊣ Q 0 Q 2 Q 6 Q 3 Reduktion I ( I[z]) ⊣ Q 0 Q 2 Q 6 Q 2 Einlesen I ( I [z]) ⊣ Q 0 Q 2 Q 6 Q 2 Q 7 Einlesen I ( I [ z]) ⊣ Q 0 Q 2 Q 6 Q 2 Q 7 Q 5 Reduktion I ( I [ I]) ⊣ Q 0 Q 2 Q 6 Q 2 Q 7 Q 2 Reduktion I ( I [ A]) ⊣ Q 0 Q 2 Q 6 Q 2 Q 7 Q 9 Einlesen I ( I [ A ]) ⊣ Q 0 Q 2 Q 6 Q 2 Q 7 Q 9 Q 11 Reduktion I ( A) ⊣ Q 0 Q 2 Q 6 Q 8 Einlesen I ( A ) ⊣ Q 0 Q 2 Q 6 Q 8 Q 10 Reduktion A ⊣ Q 0 Q 1

76 Konflikte im charakteristischen endlichen Automaten Reduktion-Reduktion: zwei unterschiedliche Reduktionen im gleichen Zustand Beispiel : T  S ⊣ S  a A bA  A bA  c T . S ⊣ a S  a. A b A S  a A. b b S  a A b. S . a A b A . A b A  A. b A  A b. A . c S c T  S. ⊣ A  c.

77 Reduktion-Einlesen: Aus einem Zustand mit einer Reduktion führt eine mit einem Terminal bewertete Kante. Beispiel : siehe Zustand Q 2 im charakteristischen endlichen Automaten des Standardbeispiels  Grammatikklassifizierung LR(0)-Grammatik: Der charakteristische endliche Automat ist konfliktfrei. SLR(1)-Grammatik: Konflikte lassen sich auf der Basis von einem Element Vorausschau unter Nutzung der FOLLOW- Mengen auflösen.

78 Beispiele : Zustand Q 2 im Standardbeispiel A  I.( A )Einlesen (benötigt werden ( oder [ ) oder A  I. [ A ]Reduktion von I zu A? A  I. FOLLOW 1 (A) = { ), ], ⊣ }, (, [ ∉ FOLLOW 1 (A)  - Ist das aktuelle Zeichen ( oder [, dann erfolgt Einlesen. - Ist das aktuelle Zeichen aus FOLLOW 1 (A), dann erfolgt Reduktion. - Sonst liegt ein syntaktischer Fehler vor. Obiger Reduktion-Reduktion-Konflikt läßt sich auflösen: FOLLOW 1 (S) = { ⊣ } FOLLOW 1 (A) = { b }

79 LALR(1)-Grammatik: analog zur SLR(1)- Grammatik, aber mit „Verfeinerung“ der FOLLOW-Mengen Beispiel : dS T  S. ⊣ c A A cFOLLOW 1 (A) = { a, b} FOLLOW 1 1 (A) = { b } A  c. 1 2 A  c. FOLLOW 1 2 (A) = { a } a b a b S  d c a. S  d A b. S  A a. S  c b.

80 LR(k)-Grammatik (  -frei) Für beliebige Paare von Ableitungsfolgen S  * w 1 z w 2  w 1 v w 2, z  v  P, w 2  T * S  * w 1 ´ z´ w 2 ´  w 1 ´ v´ w 2 ´, z´  v´  P, w 2 ´  T * mit w 1 v = w 1 ´ v´ und FIRST k (w 2 ) = FIRST k (w 2 ´) Folgt z = z´ und v = v´.

81 Zustände des charakteristischen endlichen Automaten für LR(k)-Grammatiken Ergänzung einer „Situation“ A  x. X z durch einen Kontext K, wobei folgende Eigenschaften erfüllt sein müssen: Anfangszustand enthält Situation S .w ⊣ Zustand q enthalte Situation A  u.X , K und zu X existieren die Regeln X  w 1 ;...; X  w n, dann enthält q ebenfalls X .w 1, K´;...; X  w n, K´ mit K´= FIRST k (  K)

82 Enthält der Zustand q die Situation A  u. x , K, dann erfolgt ein Übergang in einen Zustand mit der Situation A  u. x , K Konflikte im charakteristischen endlichen Automaten: Reduktion-Reduktion : Ein Zustand enthält die Situationen A  u., K 1 und A  v., K 2 mit A ≠ B oder u ≠ v, aber t  K 1  K 2 Reduktion-Einlesen : Ein Zustand enthält die Situation A  u., K und besitzt einen Übergang mit dem Terminal t und t  K.

83 Beispiel : LR(1)-Zustände für Standardbeispiele (Auswahl) Q 0 : T .A ⊣ Q 0  Q 2 : A  I.(A), ⊣ A .I(A), ⊣ A  I.[A], ⊣ A .I[A], ⊣ A  I., ⊣ A .I, ⊣ I .a, {(, [, ⊣ } I .f, {(, [, ⊣ } I .z, {(, [, ⊣ }

84 3.4 Syntaktische Fehler Aufgaben der Fehlerbehandlung: Lokalisierung des Fehlers Klassifizierung des Fehlers Fehlernachricht: - Fehlerposition - Grad oder Art des Fehlers - Genauere Angaben zum Fehler Stabilisierung und Fortsetzung der Analyse

85 Fehlerposition : w  T * und es existiert w´  T *, wobei w w´  L(G) (w lässt sich durch w´ zum Wort aus L(G) ergänzen) Für w x, x  T, existiert keine Ergänzung v  T *, so dass w x v  L(G).  x ist eine Fehlerposition Beispiel : In x * (3 – z / y ; ist das „;“ eine Fehlerposition, da x * (3 – z / y richtig ergänzt werden kann, aber x * (3 – z / y ; nicht.

86 Bemerkungen: Bei LL(1)- und LR(1)-Verfahren der syntaktischen Analyse wird ein Fehler immer an einer Fehlerposition erkannt. Der Fehler muss nicht durch das Zeichen an der Fehlerposition verursacht worden sein.

87 3.5 Automatische Erzeugung von Syntaxanalysatoren Kontextfreie GrammatikAnalysator Rahmen- programm GeneratorTabellen

88 yacc-Spezifikation % %

89 4 Semantische Analyse 4.1 Symboltabellen Einfache Struktur Hashtabelle mit Verkettungstechnik Beispiel : 1DE 2 0A1B0 3CAESAR 4FAUL 5 0F0 6D10 C50 frei

90 Symboltabellen mit abgetrennter Schlüsselliste Hashtabelle mit Verkettungstechnik und abgetrennter Schlüsselliste Beispiel : frei 2 D E 3 A 1 B 6 C A E S A R 4 F A U L 1 F 2 D 1 2 C 5

91 Beispiel : Programm mit Blockstruktur BEGIN REAL a, b, c, d;... BEGIN REAL c, f;... L1:... END; BEGIN REAL g, d;... L2: BEGIN REAL a;... END; L3:... END

92 Symboltabelle mit Blockstruktur 1 Beispiel : Symboltabelle für obiges Programm L1 Blocknummer2 1 3f 3 1 4c Übergeordneter Block4 3 1a L3 Anzahl EintragungenL2 d Adresseg d c b a

93 Symboltabelle mit Blockstruktur 2 Form der Listenelemente: Deklarationen BlockZeiger aufVerkettungVerkettung nummerInformationim BlockIdentifikatoren Blockstruktur BlockAnfangÜbergeordneter nummerBlockketteBlock

94 Beispiel : Symboltabelle zum obigen Programm a14 / 1 / / b21 1 / c32 / 1 2 / d / 5 f 62 3 / g 73 / / 8 L192 6 / L / L /

95 Blockstrukturtabelle 11 4 /

96 4.2 Realisierung der semantischen Analyse Beispiel : Attributierte Grammatik für Deklarationsfolgen Kontextfreie Basisgrammatik 1 ::= VAR ; 2 0 ::= ; 1 3 ::=  4 ::= 5 ::= BOOL 6 ::= INT Kontextbedingung: Kein Identifikator darf mehrfach deklariert werden.

97 Zuordnung der Attribute AttributArtBedeutungZuordnung Sv  Symboltabelle vorläufig Sn  Symboltabelle neu, IT  (Identifikator, Typ) T  Typ I  Identifikator error  true, false,

98 Semantische Regeln 1.Sn :=.Sn.error :=.error.Sv := INIT(.IT) 2 0.Sn := 1.Sn 0.error := 1.error  IN( 0.Sv,.IT) 1.Sv := ENTRY( 0.Sv,.IT), wenn ¬ IN( 0.Sv,.IT) 3.Sn :=.Sv.error := false 4.IT := IDDECL(.I,.T) 5.T := ´bool´ 6.T := ínt´

99 Dekorierter Syntaxbaum von VAR INT x; BOOL y; {(´x´,´int´),(´y´,´bool´)}, false VAR ; (´x´,´int´) {(´x´,´int´)}, {(´x´,´int´),(´y´,´bool´)}, false ; ´int´´x´(´y´,´bool´) {(´x´,´int´),(´y´,´bool)}, INTx {(´x´,´int´),(´y´,´bool´)}, ´bool´´y´ false BOOLy 

100 Schachtelung von Programmeinheiten Beispiel : Programm PROGRAM H;PROC B; PROC D;...; call C;...END B; END D;...call B; PROC A;END A; PROC C;...; call A;...; call D;......; call D; END H; END C;

101 Statische Schachtelung mit Schachtelungstiefe H/0 D/1A/1 C/2B/2 Dynamische Schachtelung H AD B C D

102 Datenbereich (Prozedurschachtel, Kellerrahmen) einer Prozedur (eines Blocks) zur Laufzeit Allgemeiner Aufbau Funktions Statischer Dynamischer alter EP Rücksprung wert Vorgänger Vorgänger Wert adresse MP Parameter Lokale Felder Zwischen (statisch) Variablen (semidyn.) ergebnisse SPEP

103 Variablenadressierung: (Schachtelungstiefe, Relativadresse) Beispiel : PROGRAM H;Adressierung: VAR x1, y;In H: x1 (0, 5) PROC p; y (0, 6) VAR i, x1, k;In p: i (1, 5)...x1...x1 (1, 6)...k...k (1, 7)...y... END p; call p;...x1... END H;

104 Aktionen bei Eintritt in eine Prozedur q (p ruft q auf) Setzen des statischen Vorgängers von q Setzen des dynamischen Vorgängers von q (Anfangsadresse des Datenbereichs von p – alter MP- Wert) Retten des alten EP-Wertes Berechnung der aktuellen Parameter Setzen des MP-Registers auf Anfangsadresse des Datenbereiches von q (SP + 1)

105 Abspeicherung der Rückkehradresse Ausführung des Sprungs auf ersten Befehl des übersetzten q-Programms Setzen des SP-Registers Berechnung des EP-Wertes und Setzen des EP-Registers sowie Überprüfung auf mögliche Kollision zwischen Keller und Halde

106 Aktionen bei Verlassen der Prozedur q (Rückkehr nach p) Freigabe des Datenbereichs bis auf eventuellen Funktionswert Setzen der MP-, EP- und SP-Register für die Prozedur p Rückkehr nach p

107 Beispiel : rekursiver Funktionsaufruf PROGRAM Fak; VAR r : integer; FUNCTION F(n: integer): integer; IF n = 1 THEN F := 1 ELSE F := n * F(n – 1); END F; r := F(3); END Fak; Adressierung r(0, 5)n(1, 5)F(1, 0)

108 Übersetzung von Fak ; lda i 0 6; ; M1: sto i; Übersetzung von F(n) ; lod i 0 5; ldc i 1; equ i; fjp l1; lda i 0 0; ldc i 1; sto i; ujp l2; l1: lda i 0 0; lod i 0 5; ; M2: mul i; sto i; l2:

109 Abspeicherung von Datenstrukturen Mehrdimensionale Felder A: ARRAY [u 1.. o 1,..., u n.. o n ] OF Speicherabbildungsfunktion Adresse (A[i 1,..., i n ]) = Adresse (A[u 1,..., u n ]) + (i 1 – u 1 ) * d 2 *...* d n + (i 2 – u 2 ) * d 3 *...* d n (i n – u n ) = k + v (d i = o i – u i + 1)

110 Semidynamische Felder Beispiel : semidynamische Felder in ALGOL 68 begin... n :=...;...; m :=...;... begin [n] int A; [m] int B;... A[i] := B[j+3] * k;... end... end

111 Schablone (Felddeskriptor) eines semidynamischen Feldes A: ARRAY [u 1.. o 1,..., u n.. o n ] OF u 1 o 1 d 1... u n o n d n nk´adr adr = Adresse (A[u 1,..., u n ]) k´= u 1 * d 2 * d n + u 2 * d 3 * d n u n

112 Datenbereich für inneren Block Schablone für ASchablone für B Voraussetzung: Zur Laufzeit gilt n = 4 und m = 5.

113 Erzeugte Befehlsfolgen (im Beispiel): Aufbau des DB einschließlich der teilweise gefüllten Schablonen Berechnung von n und der fehlenden Elemente der Schablone für A Neuberechnung der ersten freien Adresse des freien dynamischen Speicherteils Berechnung von m und der fehlenden Elemente der Schablone für B Neuberechnung der ersten freien Adresse des freien dynamischen Speicherteils Adressberechnung für A[i] aus der Schablone für A Adressberechnung für B[j+3] aus der Schablone für B

114 Datenmüllbeseitigung (garbage collection) Arbeitsschritte: Zeigerverfolgung und Markierung besetzter Speicherbereiche  Speicherkarte Herstellung eines Adressbuchs (alte Adressen, neue Adressen) Zeigertransformation (auf neue Adressen) Komprimierung des Speichers (Auslassung von Müllbereichen)

115 Parameterübergaben Referenzaufruf (call by reference): PROC del(VAR t: Elem;...);Befehlsfolgen: BEGIN...t :=...END;- Berechnung ...- Abspeicherung von  auf del(T,...); Platz von t Tt LDLD   DB aufrufende ProzedurDB von del

116 Werteaufruf (call by value): PROC del1 (k: Key;...);Befehlsfolgen: BEGIN...z := k;...END;- Berechnung von w... aus a del1(a,...);- Abspeicherung von k w auf Platz von k LDww Wert von a DB von del1

117 Werte-Resultatsaufruf (call by value-result): Kombination von call by reference und call by value mit Änderung des aktuellen Parameters erst bei Rückkehr (zusätzlicher Umspeicherungsbefehl) Tt LDwLD  wAufruf  LDw´LD  w´Rückkehr DB aufrufende Prozedur DB aufgerufene Prozedur

118 Namensaufruf (call by name): Beispiele : ALGOL 60 - procedure p(x); integer x; begin... i := 2; x := 9;... end ;... array a[1 : 9];Realisierung: integer i; begin......i := 2; a[i] := 9; i := 1;... p(a[i]); end

119 procedure R(X, I); begin I := 2; X := 5; I := 3; X := 1 end ;... R(B[J * 2], J); Realisierung: begin J := 2; B[J * 2] := 5; J := 3; B[J * 2] := 1 end

120 Konkreter Syntaxbaum – abstrakter Syntaxbaum Beispiel : Ausdruck 5 * a Konkreter SyntaxbaumAbstrakte Syntaxbäume * num(5)id(a) * *num(5) id(a) a 5

121 Quadrupel (Dreiadresscode) Allgemeine Form : [,,, ] mit Operand, Resultat: - Bezeichner (deklarierte oder temporäre Variable) - Zahl (Konstante, Sprungziel) - leer (ohne Bedeutung)

122 Ausdrücke : [,,, ] Beispiel : [add-int, t1, t2, h] Zuweisung : [sto-T,,, ], T Typ Beispiel : [sto-int, x,, y] Unbedingter Sprung : [ujp, ] Bedingter Sprung : [fjp,, ] Ausführung des Sprungs zur Anweisung mit der Marke, wenn der Wert der Variablen false ist

123 If-Anweisung IF e THEN st1 ELSE st2 FI: Quad(e)Quadrupel zur Berechnung von e; Wert von e wird h1 zugewiesen [fjp, h1, l1] Quad(st1)Quadrupelfolge für st1 [ujp, l2] l1:Quad(st2)Quadrupelfolge für st2 l2:... Andere Darstellung von Marken : [label, ]

124 Beispiel : IF a < b THEN a := a + 1 ELSE b := b + 1 FI [les-int, a, b, h1] [fjp, h1, l1] [add-int, a, 1, h1] [sto-int, h1, a] [ujp, l2] l1:[add-int, b, 1, h1] [sto-int, h1, b] l2:...

125 Tripel (Binärbaum) Allgemeine Form : -(,, ) -Repräsentation des Ergebnisses durch das Tripel selbst Graphische Darstellung :Operator Operand1 Operand2

126 Beispiel : IF a < b THEN a := a + 1 ELSE b := b + 1 FI (1)(les-int, a, b) (2)(fjp, (1), l1) (3)(add-int, a, 1) (4)(sto-int, a, (3)) (5)(ujp, l2) l1:(6)(add-int, b, 1) (7)(sto-int, b, (6)) l2:(8)...

127 Erzeugung von Zwischensprachrepräsentationen Methoden : Aufruf semantischer Routinen in Verbindung mit syntaktischer Analyse Verwendung attributierter Grammatiken Verwendung attributierter Translationsgrammatiken Baumtransformation

128 Beispiel : Voraussetzungen : -Bezeichnungen: P Feld für P-Code mit Zeiger p auf nächste Eintragstelle, S Analysekeller mit Spitze i -Speicherbedarf: Die Befehle ldc i, ldc a, ind i, add i, mul i, neg i benötigen (kodiert) nur je 1 Speicherplatz. Bezeichner und Konstanten brauchen 2 Speicherplätze (Kenncode, Adresse in entsprechender Tabelle). Regeln : 1 ::= 2 ::=

129 3 ::= + P[p] := ´ add i´; p := p + 1; P[p] := ´;´; p := p + 1; 4 ::= - P[p] := ´ neg i´; p := p + 1; P[p] := ´;´; p := p + 1; 5 ::= 6 ::= * P[p] := ´ mul i´; p := p + 1; P[p] := ´;´; p := p + 1;

130 7 ::= P[p] := ´ ldc a´; p := p + 1; P[p] := S[i]; p := p + 2; P[p] := ´;´; p := p + 1; P[p] := ´ ind i´; p := p + 1; P[p] := ´;´; p := p + 1; 8 ::= P[p] := ´ ldc i´; p := p + 1; P[p] := S[i]; p := p + 2; P[p] := ´;´; p := p + 1; 9 ::= ( )

131 Beispiel : Syntaxanalyse und Erzeugung von P-Code Ausdruck: a * (b + 5) Tokenfolge (symbolisch):Bez a * ( Bez b + Kon 5 ) Analysekeller SRegelP[p] Bez a 7 ldc a a; ind i; 5 * (Bez b 7 ldc a b; ind i; * ( 5, 2 * ( + Kon 5 8 ldc i 5; * ( + 5 * ( + 3 add i; * ( )9 * 6 mul i 2, 1

132 Beispiel : vorheriges Beispiel unter Verwendung einer attributierten Grammatik Attribute: PsynthetisiertP-Code IsynthetisiertBezeichner KsynthetisiertKonstante Syntaktische Regeln: s.o. Semantische Regeln: 1P( ) := P( ) 2P( ) := P( ) 3P( 0 ) := CONCAT(P( 1 ), P( ), ´ add i;´)

133 4P( ) := CONCAT(P( ), ´ neg i;´) 5P( ) := P( ) 6P( 0 ) := CONCAT(P( 1 ), P( ), ´ mul i;´) 7P( ) := CONCAT( ´ldc a ´, I( ), ´; ind i;´) 8P( ) := CONCAT( ´ldc i ´, K( ), ´;´) 9P( ) := P( )

134 Beispiel : ZABCDE E TABCDE T*FBCD FA(EBCD) Beza E +T A ldc a a; ind i; B ldc a b; ind i; T F C C ldc i 5; D add i; F BKon 5 E mul i; Bez b

135 Beispiel : Attributierte Translationsgrammatik für arithmetische Ausdrücke 1 x  p x := p 2 x  p x := p 3 x  q + r ADD y,z,p := NEWT; y := q; z := r 4 x  - q NEG y,p := NEWT; y := q 5 x  p x := p 6 x  q * r MULT y,z,p := NEWT; y := q; z := r

136 7 x  p x := p 8 x  p x := p 9 x  ( p )x := p Attributwerte: Speicheradressen :=NEWT: a und b wird die Adresse eines freien Speicherplatzes im Speicher T zugewiesen Translation (ohne Attribute): Bez * (Bez + Kon)  ADD MULT

137 Codeerzeugung im engeren Sinne Arten von Zielcode: Maschinenprogramm mit absoluten Adressen (Load-and-go- Compiler) Maschinenprogramm mit relativen Adressen (relocatable Code)  Bearbeitung vor Abarbeitung: - Zusammenstellung unabhängig voneinander übersetzter Programmkomponenten mit externen Referenzen aufeinander zu einem Lademodul (load module) - Auflösung der externen Referenzen durch Binder (linker) - Überführung in absolut adressiertes, ausführbares Programm durch Ladeprogramm (loader)

138 Programm in Assemblersprache  Notwendigkeit eines Assemblerlaufes Programm in Programmiersprache einer abstrakten Maschine  zweistufige Übersetzung: Quellsprache  Sprache der abstrakten Maschine  Zielsprache Beispiel : Übersetzung von Pascal in P-Code (Code der P-Maschine) und Übersetzung des P-Codes in Zielsprache

139 Übersetzung Zwischensprache – Zielsprache Grundlegende Techniken Voraussetzungen : Befehle der Zielmaschine LOAD R O  R STORE R O  O STORE O1 O2  O2 ADD-I R O +  R SUB-I R O -  R Inhalt von Speicherplatz a  aAbspeicherung auf Speicherplatz a

140 RRegisteradresse (im Falle 1 Registers ACC) O kann sein: Registeradresse Hauptspeicheradresse = Konstante(Direktoperand) STACKAdresse der Spitze des Kellerspeichers

141 Beispiel : Tabellengesteuerte Codeerzeugung Voraussetzungen : Übersetzung aus Tripeldarstellung in Befehle obiger Zielmaschine gen(a)erzeugt Befehl a code(t)vertritt Befehlsfolge, die durch Übersetzung des Teilbaums t entstand LBlinker Teilbaum RBrechter Teilbaum Eine Variable in den erzeugten Befehlen vertritt den ihr im Hauptspeicher zugeordneten Speicherplatz.

142 Tabelle für SUB-I (bzw. DIV-I) Variable/KonstanteUnterbaum Var.gen( LOAD ACC LB )code( RB ) /gen( SUB-I ACC RB )gen( STORE ACC STACK ) Kon.gen( LOAD ACC LB ) gen( SUB-I ACC STACK ) Uncode( LB )code( RB ) tergen( SUB-I ACC RB )gen( STORE ACC STACK ) bacode( LB ) umgen( SUB-I ACC STACK )

143 Tabelle für ADD-I (bzw. MUL-I) Variable/KonstanteUnterbaum Var.gen( LOAD ACC LB )code( RB ) /gen( ADD-I ACC RB )gen( ADD-I ACC LB ) Kon. Uncode( LB )code( LB ) tergen( ADD-I ACC RB )gen( STORE ACC STACK ) bacode( RB ) umgen( ADD-I ACC STACK )

144 Tabelle für Zuweisung Variable/KonstanteUnterbaum Var.gen( STORE RB LB )code( RB ) gen( STORE ACC LB ) Uncode( LB )code( RB ) tergen( STORE RB )gen( STORE ACC STACK ) bacode( LB ) umgen( STORE STACK )

145 Beispiel : Zuweisung h := a * ((c + 5 * a) – (c * d)) Tripel (1)(mul-int, 5, a) (2)(add-int, c, (1)) (3)(mul-int, c, d) (4)(sub-int, (2), (3)) (5)(mul-int, a, (4)) (6)(sto-int, (5), h)

146 Tripel als Binärbaum := (6) h* (5) a- (4) + (2)* (3) c * (1) c d 5a

147 Erzeugte Befehlsfolgen LOAD ACC =5code((1))code((4))code((5))MUL-I ACC a code((1))code((2))code((5))code((6)) ADD-I ACC cSTORE ACC h LOAD ACC ccode((3)) MUL-I ACC d code((3))code((4)) STORE ACC STACK code((2)) SUB-I ACC STACK

148 Generatoren für Codegeneratoren Verwendung von Baumgrammatiken Vorgehensweise : Beschreibung der Codeerzeugung: - Regeln der Baumgrammatik beschreiben die Zwischensprache: ::= - Zuordnung von Schablonenfolgen für Erzeugung der Zielsprachbefehle zu Regeln

149 Erzeugung des Codegenerators aus vorheriger Beschreibung Codeerzeugung durch Codegenerator : - Überdeckung des Baums zum Zwischensprachprogramm durch Baummuster (in Form von Termen); Auflösung von Mehrdeutigkeiten durch Kostenfunktion - Erzeugung von Zielcode aus Schablonenfolgen gemäß Überdeckung

150 Beispiel : Baumgrammatikregeln mit Schablonen 1r.2 ::= word( d.1 ) { LOAD R.2 D.1 } 2r.1 ::= iadd( r.1, r.2 ) { ADD-I R.1 R.2 } 3 ::= store( word( d.1 ), r.2 ) { STORE R.2 D.1 } r.i Registeradresse; d.i Hauptspeicheradresse einer deklarierten Variable word, iadd, store Operatoren der Zwischensprache (Präfixform)

151 QuellspracheZwischensprache A := A + Bstore(word(d.a), iadd(word(d.a), word(d.b))) Überdeckungsbaum store wordiadd d.awordword d.ad.b

152 Objektorientierte Compilerstruktur (nach D. A. Watt, D. F. Brown: Programming Language Processors in Java) Compilertreiber Treiber ParserCheckerEncoder Scanner

153 Compilertreiber public class Compiler { public static void compileProgram(...) { //Generierung des Parsers Parser parser = new Parser(...); //Generierung des semantischen Analysators Checker checker = new Checker(...); //Generierung des Zielcodegenerators Encoder generator = new Encoder(...);

154 //Aufruf des Parsers mit Erzeugung des abstrakten Syntaxbaums //AST Program theAST = parser.parse(); //Aufruf des semantischen Analysators mit Dekoration von AST checker.check(theAST); //Aufruf des Codegenerators mit Erzeugung des Zielprogramms generator.encode(theAST); } public static void main(String[] args) {...compileProgram(...);...} }

155 Pakete : AbstractSyntaxTrees: - Klassen zur Definition der AST-Datenstrukturen Je Klasse: Konstruktor zum AST-Aufbau und visitor- Methode zur Verknüpfung mit semantischer Analyse (contextual analyzer) und Codeerzeugung (code generator) - Manipulation der AST-Felder SyntacticAnalyzer: - Parserklassen zur syntaktischen Analyse (Methode des rekursiven Abstiegs) und zur AST-Konstruktion - Hilfsklassen

156 ContextualAnalyzer: Checker-Klasse zur Durchführung der semantischen Analyse CodeGenerator: Encoder-Klasse führt ausgehend vom AST Speicherzuteilung durch und erzeugt Zielcode

157 Parser public class Parser{ //Aktuelles Symbol im analysierten Programm private Token currentToken; //Vergleich aktuelles Symbol – erwartetes Symbol private void accept(byte expectedKind){ if (currentToken.kind == expectedKind) currentToken = scanner.scan(); else Fehlermeldung;}

158 //Nächstes Symbol wird zum aktuellen Symbol private void acceptIt(){ currentToken = scanner.scan();} //Hilfsmethoden //Parsingmethoden private Program parseProgram(){ //Instanzvariable für AST //Syntaxanalyse für Programme //AST-Erzeugung für Programme return //AST für Programm }...

159 public Program parse(){ currentToken = scanner.scan(); Program progAST = parseProgram(); if (currentToken.kind != Token.EOT) Fehlermeldung return progAST}... }

160 AST Abstrakte Klasse für AST: public abstract class AST{...} AST-Knoten als Unterklassen der AST-Klasse Abstrakte Klasse für Expression: public abstract class Expression extends AST{...} Konkrete Klassen mit Konstruktor für AST Beispiel : AST-Konstruktor der Klasse AssignCommand public AssignCommand(Vname V, Expression E){ this.V = V; this.E = E;}

161 Lexikalische Analyse public class Scanner{... private boolean isDigit(char c){...} //true, falls c eine Ziffer ist... public Token scan(){... return new Token(currentKind, currentSpelling.toString());} } public class Token{...} //Lexembeschreibungen in Aufbau und Codierung

162 Semantische Analyse Anwendung des visitor pattern: 1. Einrichtung einer Schnittstelle Visitor 2. Für jeden konkreten AST einer Unterklasse A Verwendung einer Visitor-Methode visitA 3. Anreicherung der abstrakten AST-Klasse mit der visit- Methode zum Besuch von AST-Knoten 4. Implementation von visit in jeder Unterklasse 5. Implementation der eigentlichen semantischen Analyseprozeduren im Checker (semantischer Analysator)

163 Schnittstelle Visitor public interface Visitor{ //visitA-Methoden public Object visitProgram(Program prog, Object arg);... public Object visitAssignCommand(AssignCommand com, Object arg);}

164 Implementierung von Visitor in Checker public final class Checker implements Visitor{ //Symboltabelle private IdentificationTable idTable; //Visitor-Methoden public Object visitAssignCommand(Assigncommand com, Object arg){ Type vType = (Type) com.V.visit(this, null); Type eType = (Type) com.E.visit(this, null); if(! eType.equals(vType)) Fehlermeldung return null; }

165 ... //Start der semantischen Analyse public void check(Program prog){ //Initialisierung der Symboltabelle idTable = new IdentificationTable();... prog.visit(this, null); }

166 Erweiterung der AST-Klasse public abstract class AST{... public abstract Object visit(Visitor v, Object arg); } Implementierung von visit in den AST-Unterklassen public class A extends...{... public Object visit(Visitor v, Object arg){ return v.visitA(this, arg);} }

167 Codeerzeugung Nutzung des visitor patterns mit Implementierung der Visitor-Methoden in der Klasse Encoder: public final class Encoder implements Visitor{... //Visitor-Methoden public Object visitAssignCommand(AssignCommand com, Object arg){ com.E.visit(this, arg); encodeAssign(com.V); return null;} public void encode(Program prog){ prog.visit(this, null);} }


Herunterladen ppt "Übersetzertechnik (in Arbeit!!!) © Günter Riedewald Die Folien sind eine Ergänzung der Vorlesung und nur für den internen Gebrauch konzipiert."

Ähnliche Präsentationen


Google-Anzeigen