Inhalte der Vorlesung. 6. Syntaxgesteuerte Übersetzung. Attributierter Syntaxbaum. 6. Syntaxgesteuerte Übersetzung

Ähnliche Dokumente
Inhalte der Vorlesung. 6. Syntaxgesteuerte Übersetzung. 6. Syntaxgesteuerte Übersetzung. Attributierter Syntaxbaum

Inhalte der Vorlesung. 4. Der Scanner-Generator lex. 4. Der Scanner-Generator lex. 4.1 lex: Grundlagen

Lexikalische Programmanalyse der Scanner

SYNTAXGESTEUERTE ÜBERSETZUNG

Compilerbau Syntaxanalyse 68. LR(1)-Syntaxanalyse

Äquivalente Grammatiken / attributierte Grammatik

4 Lexikalische Analyse und Parsing

yacc/ bison

Die Programmiersprache C Eine Einführung

Einführung - Parser. Was ist ein Parser?

Dr. Monika Meiler. Inhalt

Werkzeuge zur Programmentwicklung

Fachseminar Compilerbau

Kapitel 5: Syntax-Analyse

Syntaxanalyse Ausgangspunkt und Ziel

Android-Apps Gegenüberstellung Delphi java

9 Compilerbau-Werkzeuge

Grundlagen der Programmierung

LR(1) Itemmengenkonstruktion

Allgemeine Informatik 2 im SS 2007 Programmierprojekt

Lexikalische Analyse, Tokenizer, Scanner

4. Einfache Programmstrukturen in C Einfache Programmstrukturen in C

Programmiersprachen und Übersetzer

Programmierung 2. Übersetzer: Das Frontend. Sebastian Hack. Klaas Boesche. Sommersemester

Einführung in die Informatik 2

Zusammengehörige Daten struct. Strukturierte Datentypen und Funktionszeiger. Zugriff auf struct-elemente. Variablendeklarationen mit struct

Von der Grammatik zum AST

Syntaxgerichtete Übersetzung und Typüberprüfung

Definition Compiler. Bekannte Compiler

Grundlagen der Programmierung

6 Kontextfreie Grammatiken

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

Präzedenz von Operatoren

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14

Probeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, Uhr Bearbeitungszeit: 105 Minuten

Fachseminar. Semantische Analyse

Übersetzergenerierung mit lex und yacc

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

S. d. I.: Programieren in C Folie 4-1. im Gegensatz zu Pascal gibt es in C kein Schlüsselwort "then"

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Programmierung mit C Zeiger

Binäre Bäume Darstellung und Traversierung

Vorlesung Programmieren

Abgeleitete Datentypen

Klassen und Objekte. Klassen sind Vorlagen für Objekte. Objekte haben. Attribute. Konstruktoren. Methoden. Merkblatt

9.4 Grundlagen des Compilerbaus

Attributierte Grammatiken

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Einstieg in die Informatik mit Java

Grammatiken und ANTLR

1 Aufgaben 1.1 Umgebungsvariable setzen: CLASSPATH

Klausur C-Programmierung / / Klingebiel / 60 Minuten / 60 Punkte

Binärbäume. Prof. Dr. E. Ehses,

Einstieg in die Informatik mit Java

13. Bäume: effektives Suchen und Sortieren

Was bisher geschah Chomsky-Hierarchie für Sprachen: L 0 Menge aller durch (beliebige) Grammatiken beschriebenen Sprachen L 1 Menge aller monotonen

C- Kurs 09 Dynamische Datenstrukturen

Deklarationen in C. Prof. Dr. Margarita Esponda

C- Kurs 04 Anweisungen

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

JAVA-Datentypen und deren Wertebereich

GI Vektoren

Arrays (Felder/Vektoren)

Algorithmen & Programmierung. Steuerstrukturen im Detail Selektion und Iteration

Advanced Programming in C

Unterlagen. CPP-Uebungen-08/

Assoziative Container in C++ Christian Poulter

Anwenundg regulärer Sprachen und endlicher Automaten

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

kontextfreie Grammatiken Theoretische Informatik kontextfreie Grammatiken kontextfreie Grammatiken Rainer Schrader 14. Juli 2009 Gliederung

C/C++ Programmierung

Compilerbau II Skript

Einstieg in die Informatik mit Java

Eine Einführung in C-Funktionen

Der Grid-Occam-Compiler. Syntaxanalyse

Es ist für die Lösung der Programmieraufgabe nicht nötig, den mathematischen Hintergrund zu verstehen, es kann aber beim Verständnis helfen.

10 Die Programmiersprache C99: Zusammenfassung

Struktur des MicroJava- Compilers

Übungspaket 14 Eindimensionale Arrays

Elementare Datentypen in C++

Die Programmiersprache C99: Zusammenfassung

...imbeispiel: Die Konkatenation der Blätter des Ableitungsbaums t bezeichnen wir auch mit yield(t). liefert die Konkatenation: name int + int.

Programmieren in C. Funktionen mit Zeigern und Adressen. Prof. Dr. Nikolaus Wulff

Automaten und formale Sprachen Klausurvorbereitung

C-Deklarationen lesen und schreiben

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

Name: Seite 1. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort.

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 11 (Parser II)

1 Syntax von Programmiersprachen

Informatik II Bäume. Beispiele. G. Zachmann Clausthal University, Germany Stammbaum. Stammbaum. Stammbaum

ARBEITSBLATT ZU FORMALEN SPRACHEN

Algorithmen & Programmierung. Ausdrücke & Operatoren (1)

C für Java-Programmierer

5. Abgeleitete Datentypen

Java: Eine kurze Einführung an Beispielen

Aufzählungstypen. Rekursive Datentypen und der ganze Rest. Aufzählungen als Ganzzahlwerte. Verwendung von Aufzählungen

Repetitorium Informatik (Java)

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Transkript:

Inhalte der Vorlesung 6. Syntaxgesteuerte Übersetzung 1.Einführung 2.Lexikalische Analyse 3.Der Textstrom-Editor sed 4.Der Scanner-Generator lex 5.Syntaxanalyse und der Parser-Generator yacc 6.Syntaxgesteuerte Übersetzung 7.Übersetzungssteuerung mit make Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 2 6. Syntaxgesteuerte Übersetzung 6.1 Syntaxgesteuerte Definitionen 6.2 Konstruktion expliziter Syntaxbäume 6.3 Aufsteigende Auswertung Attributierter Syntaxbaum position real Knoten mit Werten := + initial * real rate real inttoreal 60 integer Wert: durch Semantikregel des Knotens Semantikregel mit Seitenwirkungen möglich Ausgabe globale Variable verändern Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 3 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 4

Abhängigkeiten von Attributen synthetisiertes Attribut Wert hängt nur von Nachfolgeknoten ab ererbtes Attribut Wert hängt von Vorgängern und Geschwistern ab Syntaxgesteuerte Definition ist kontextfreie Grammatik plus: Attributmenge für jedes Grammatiksymbol Menge von Semantikregeln für jede Grammatikregel Auswertungsreihenfolge muß Abhängigkeitsgraph beachten Baum: nicht unbedingt explizit aufgebaut Attributgrammatik: ist syntaxgesteuerte Definition plus Semantikregeln ohne Seitenwirkungen Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 5 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 6 Syntaxgesteuerte Definition eines einfachen Taschenrechners S-attributierte Definition Grammatikregel l e NL e e 1 + t e t t t 1 f t f f ( e ) f NUMBER Semantikregel print(e.val) e.val := e 1.val + t.val e.val := t.val t.val := t 1.val f.val t.val := f.val f.val := e.val f.val := NUMBER.val syntaxgesteuerte Definition nur synthetisierte Attribute Wert hängt nur von Nachfolgeknoten ab Beispiel: Taschenrechner eben kann von Blättern zur Wurzel ausgewertet werden leicht Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 7 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 8

Ererbte Attribute Ererbte Attribute: Beispiel Wert hängt von Vorgängern und Geschwistern ab für Abhängigkeit von Kontext Beispiel: Typ eines Bezeichners Grammatikregel d t l t INT Semantikregel l.in := t.type t.type := integer Ableitungsbaum mit Attribut in an l-knoten t.type := real d l.in = real t REAL l l 1, ID t.type := real l 1.in := l.in addtype(id.entry, l.in) REAL l.in = real, ID 3 l.in = real, ID 2 l ID addtype(id.entry, l.in) ID 1 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 9 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 10 Abhängigkeitsgraph Abhängigkeitsgraph (2) Abhängigkeiten zwischen Attributen wird über Ableitungsbaum konstruiert Beispiel: d wenn möglich: Abhängigkeitsgraphen schrittweise an Tafel unter Beamer-Bild der Vor-Folie malen Der Abh.-Graph hat für jedes Attribut einen Knoten 1,...: Sind die Knoten des Abh.-Graphen t REAL 4 type 7 in 5 in l l 8, ID 3 3 entry 6 1, 2, 3 : Wir fangen hier mit den Attributen an, die von nichts abhängen ID 3 hat Attribut entry 6, 7, 8 : Knoten für Scheinattribute 9 in l 10, ID 2 2 entry ID 1 1 entry Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 11 je eines für jeden Prozeduraufruf Siehe auch Drachenbuch S. 346f. l = steht für list (of IDs) Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 12

Auswertungsreihenfolge nötig: topologische Sortierung Reihenfolge für Auswertung, die Abhängigkeiten einhält verschiedene Methoden: Syntaxbaummethoden explizite topologische Sortierung für jeden Syntaxbaum wieder neu regelbasierte Methoden feste, aber explizite Reihenfolge für jede Regel von Hand oder automatisch unbewußte Methoden beliebiges festes Schema z.b. so, wie Parser gerade die Grammatikregeln erkennt 6. Syntaxgesteuerte Übersetzung 6.1 Syntaxgesteuerte Definitionen 6.2 Konstruktion expliziter Syntaxbäume 6.3 Aufsteigende Auswertung Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 13 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 14 Syntaxbaum Konstruktion expliziter Syntaxbäume verdichteter Ableitungsbaum Operatoren und Schlüsselworte in Knoten verschoben Ableitungsbaum Syntaxbaum Zuweisung := Bezeichner := Ausdruck position + position Ausdruck + Ausdruck initial * Bezeichner Ausdruck * Ausdruck rate 60 Vorteil: entkoppelt Syntaxanalyse und Übersetzung Reihenfolge der Analyse beschränkt nicht Generierung Nachteil: Platzbedarf ggf. hoch initial Bezeichner rate Zahl 60 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 15 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 16

Konstruktion expliziter Syntaxbäume für Ausdrücke ein Knoten pro Operator und pro Operand Knoten z.b. implementiert als Record OO-Sprachen: Knoten als Objekt Felder: Werte Zeiger auf andere Records Rekursive Auswerter für Attribute für explizite Syntaxbäume Auswertung der Attribute erst nach Fertigstellung des Syntaxbaums Realisierung: gegenseitig rekursive Funktionen eine Funktion pro Nichtterminal bzw. Symbol Aufruf der Funktionen für Unterknoten in geeigneter Reihenfolge: L-attributierte Definition: links nach rechts sonst: geeignete andere Reihenfolge evtl. mehrere Durchläufe zur vollständigen Auswertung nötig Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 17 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 18 6. Syntaxgesteuerte Übersetzung 6.1 Syntaxgesteuerte Definitionen 6.2 Konstruktion expliziter Syntaxbäume 6.3 Aufsteigende Auswertung S-attributierte Definition nur synthetisierte Attribute Wert hängt nur von Nachfolgeknoten ab kann von Parser mit aufsteigender Analyse nebenher ausgewertet werden ohne expliziten Syntaxbaum Idee der Auswertung: synthetisierte Attribute mit auf Parser-Stack bei jeder Reduktion: Werte mit von Stack nehmen neuen Wert berechnen neuen Wert mit neuem Nichtterminal auf Stack legen Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 19 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 20

L-attributierte Definition syntaxgesteuerte Definition Bedingung für ererbtes Attribut von bj : sei: Regel a b 1 b 2... b j-1 b j... b n dann: Attribut von b j hängt nur ab von 1. Attributen von weiter links stehenden b 1, b 2,..., b j-1 und 2. ererbten Attributen von a keine Einschränkungen für synthetisierte Attribute Eigenschaften L-attributierter Definitionen erlaubt auch (bestimmte) ererbte Attribute kann immer durch Depth-First-Traversierung (s.u.) des Syntaxbaums ausgewertet werden alle syntaxgesteuerten Definitionen über LL(1)-Grammatiken sind L-attributiert jede LL(1)-Grammatik ist auch eine LR(1)-Grammatik daher immer durch yacc auswertbar viele syntaxgesteuerten Definitionen über LR(1)-Grammatiken sind L-attributiert Name L : Attributinformation fließt von links nach rechts Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 21 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 22 Depth-First-Traversierung des Syntaxbaums procedure dfvisit(k : knoten) begin for n := alle Nachfolger von k, links rechts do begin berechne ererbte Attribute von n dfvisit(n) end berechne synthetisierte Attribute von k end Übersetzungsschema Notation zur Spezifikation der Übersetzung während der Syntaxanalyse kein expliziter Syntaxbaum notwendig kontextfreie Grammatik Attribute an Grammatiksymbolen synthetisiert und ererbt semantische Aktionen in rechte Seiten der Regeln eingefügt, eingeschlossen in Klammern { Zeitpunkt der Auswertung dadurch explizit yacc verwendet Übersetzungsschemata Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 23 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 24

Übersetzungsschema: Beispiel Übersetzungsschema: Beispiel (2) Taschenrechner für ganze Zahlen mit yacc hier nur synthetisierte Attribute daher alle semantischen Aktionen immer am Ende Demo calc-int.l #include <math.h> #include "calc-int.tab.h" % %option noyywrap DIGIT [0-9] {DIGIT+ { yylval = atoi(yytext) return NUMBER "=" "(" ")" "+" "-" "*" "/" { return *yytext [[:space:]] { /* ignoriere Whitespace */. { return ILLEGAL_CHAR Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 25 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 26 Übersetzungsschema: Beispiel (3) Übersetzungsschema: Beispiel (4) calc-int.y #include <stdio.h> #define YYERROR_VERBOSE void yyerror(char *) % %token NUMBER ILLEGAL_CHAR %left '-' '+' %left '*' '/' eingabe: /* empty */ eingabe berechnung berechnung: term '=' { printf("ergebnis: %d\n", $1) term: NUMBER term '+' term { $$ = $1 + $3 term '-' term { $$ = $1 - $3 term '*' term { $$ = $1 * $3 term '/' term { $$ = $1 / $3 '(' term ')' { $$ = $2 void yyerror(char *msg) { printf("\neingabefehler: %s\n", msg) int main() { return yyparse() Variable yylval: Attributwert für Token von lex gesetzt, von yacc gelesen semantische Aktionen in Programmiersprache C $$ : Wert des Attributs des Nichtterminals auf der linken Seite $1 : Wert des Attributs des Grammatiksymbols auf der rechten Seite ganz links liegt auf Parser-Stack $2:... 2. Symbol von links... Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 27 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 28

Verschiedene Typen für die Attributwerte Default: Attribute sind int aber Normalfall: Typen der Attribute verschieden Beispiel: Taschenrechner für Fließkommazahlen und Strings Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 29 Demo calc-types.l Verschiedene Typen für die Attributwerte (2) #include <stdlib.h> #include <math.h> #include <string.h> #include "calc-types.tab.h" char *dequote(const char *) % %option noyywrap DIGIT [0-9] {DIGIT+("."{DIGIT*)? { yylval.zahl = atof(yytext) return NUMBER "\""[^"\n]*"\"" { yylval.string = dequote(yytext) return STRING "=" "(" ")" "+" "-" "*" "/" { return *yytext [[:space:]] { /* ignoriere Whitespace */. { return ILLEGAL_CHAR char *dequote(const char *s) { char *retval retval = (char *) malloc(strlen(s)-2+1) strncpy(retval, &(s[1]), strlen(s)-2) return retval Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 30 calc-types.y Verschiedene Typen für die Attributwerte (3) #include <stdio.h> #include <stdlib.h> #include <string.h> #define YYERROR_VERBOSE void yyerror(char *) char *addstring(const char *, const char *) % %union { double zahl char * string %token ILLEGAL_CHAR %token <zahl> NUMBER %token <string> STRING %left '-' '+' %left '*' '/' %type <zahl> zahlterm %type <string> stringterm eingabe: /* empty */ eingabe zahlberechnung eingabe stringberechnung zahlberechnung: zahlterm '=' { printf("ergebnis: %g\n", $1) stringberechnung: stringterm '=' { printf("ergebnis: \"%s\"\n", $1) zahlterm: NUMBER zahlterm '+' zahlterm { $$ = $1 + $3 zahlterm '-' zahlterm { $$ = $1 - $3 zahlterm '*' zahlterm { $$ = $1 * $3 zahlterm '/' zahlterm { $$ = $1 / $3 '(' zahlterm ')' { $$ = $2 stringterm: STRING stringterm '+' stringterm { $$ = addstring($1, $3) char *addstring(const char *s1, const char *s2) { char *retval retval = (char *) malloc(strlen(s1)+strlen(s2)+1) strcpy(retval, s1) strcat(retval, s2) return retval void yyerror(char *msg) { printf("\neingabefehler: %s\n", msg) int main() { return yyparse() Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 31 Verschiedene Typen für die Attributwerte (4) %union definiert alle mögliche Typen von Attributen wie C-union Zugriff auf yylval jetzt durch yylval.xy auch in lex-datei Zuordnung eines Typs zu Nichtterminal %type <xy> meinnichtterminal Zuordnung eines Typs zu Symbol %token <xy> meintoken Alternative Typzuordnung: $<xy>$, $<xy>1,... Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 32

Die Default-Aktion von yacc falls keine Aktion für eine Regel Default: $$ = $1 nur, falls Typen zusammenpassen nur, falls nicht leere Regel (kein $1 ) Implementation: Implizites Attribut für Position in der Eingabe Position von Symbolen/Nichtterminalen wichtig für Fehlermeldungen Beispiel: Taschenrechner für ganze Zahlen, erweitert (nur sinnvoll, wenn er aus Datei liest) $1 und $$ haben ohnehin gleichen Platz auf Stack Demo Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 33 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 34 Implizites Attribut für Position in der Eingabe (2) calc-int-loc.l #include <math.h> #include "calc-int-loc.tab.h" extern YYLTYPE yylloc #define YY_USER_INIT { \ yylloc.first_line = 1 yylloc.first_column = 0 \ yylloc.last_line = 1 yylloc.last_column = 0 \ #define YY_USER_ACTION { \ yylloc.first_column = yylloc.last_column+1 \ yylloc.last_column += yyleng \ % %option noyywrap DIGIT [0-9] {DIGIT+ { yylval = atoi(yytext) return NUMBER "=" "(" ")" "+" "-" "*" "/" { return *yytext [ \t] { /* ignoriere Whitespace */ \n { /* ignoriere Whitespace, setze Position in nächste Zeile */ yylloc.first_line++ yylloc.first_column = 0 yylloc.last_line++ yylloc.last_column = 0. { return ILLEGAL_CHAR Implizites Attribut für Position in der Eingabe (3)./calc-int-loc < calc-int-loc.txt lex muß yacc Position des Symbols mitteilen: Variable yylloc von yacc definiert, falls @$,... (s.u.) verwendet Default: 4 Felder, wie angegeben Makro YY_USER_INIT bei Initialisierung von Lexer ausgeführt Makro YY_USER_ACTION vor jeder Lexer-Aktion ausgeführt Newline muß Position auf nächste Zeile setzen Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 35 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 36

Implizites Attribut für Position in der Eingabe (4) calc-int-loc.y #include <stdio.h> #define YYERROR_VERBOSE void yyerror(char *) % %token NUMBER ILLEGAL_CHAR %left '-' '+' %left '*' '/' eingabe: /* empty */ eingabe berechnung berechnung: term '=' { printf("ergebnis: %d\n", $1) error '=' term: NUMBER { @$ = @1 term '+' term { $$ = $1 + $3 term '-' term { $$ = $1 - $3 term '*' term { $$ = $1 * $3 term '/' term { if ($3) { $$ = $1 / $3 else { $$ = 0 printf("\nim Bereich %d(%d)-%d(%d): ", @3.first_line, @3.first_column, @3.last_line, @3.last_column ) printf("division durch Null\n") YYERROR '(' term ')' { $$ = $2 void yyerror(char *msg) { printf("\nan Position %d(%d): ", yylloc.first_line, yylloc.first_column ) printf("%s\n", msg) int main() { return yyparse() Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 37 Implizites Attribut für Position in der Eingabe (5) @$,... muß mind. einmal verwendet sein, damit yylloc existiert notfalls irgendwo redundante Aktion mit Zuweisung @$ = @1 wie hier hinter NUMBER @1 : Position des ersten Grammatiksymbols @$ Position des Nichterminals für ganze Regel Zugriff: in Aktion mit @1,... in yyerror() nur auf Eingabeposition in yylloc Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 38 Implizites Attribut für Position in der Eingabe (6) Default-Aktion für Eingabeposition: @$ : erstes Zeichen von @1 bis letztes Zeichen des letzten Symbols Beispiel: Division durch Null, Klammerausdruck im Nenner Makro YYERROR: löst Syntaxfehler aus Übersetzungsschema mit semantischen Aktionen in der Mitte bekanntes Beispiel: Variablendeklaration in C int i, j, k und real i, j, k hier nur zwei Typen abgefangen durch error-regel für berechnung Demo Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 39 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 40

Übersetzungsschema mit semantischen Aktionen in der Mitte (2) typedecl-glob.l #include <string.h> #include "typedecl-glob.tab.h" % %option noyywrap IDENT [[:alpha:]_]+ "int" { return INT "real" { return REAL {IDENT { yylval.name = strdup(yytext) return ID "," { return *yytext [[:space:]] { /* ignoriere Whitespace */. { return ILLEGAL_CHAR Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 41 Übersetzungsschema mit semantischen Aktionen in der Mitte (3) typedecl-glob.y #include <stdio.h> #define YYERROR_VERBOSE void yyerror(char *) void addtype(char *, int) #define T_INT 0 #define T_REAL 1 int curr_type % %union { int idtype char * name %token INT REAL ID ILLEGAL_CHAR %type <name> ID %type <idtype> type %verbose def: type { curr_type = $1 list type: INT { $$ = T_INT REAL { $$ = T_REAL list: list ',' ID { addtype($3, curr_type) ID { addtype($1, curr_type) void addtype(char *id, int type) { printf("adding type %s for id '%s'\n", (type? "REAL" : "INT"), id) void yyerror(char *msg) { printf("\n%s\n", msg) int main() { return yyparse() Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 42 Übersetzungsschema mit semantischen Aktionen in der Mitte (4) keine ererbten Attribute verwendet stattdessen Kommunikation über globale Variable Problem: geht nicht rekursiv hier aber OK Aufsteigende Auswertung ererbter Attribute Problem: Erben abwärts, Auswertung aufwärts (meist) Lösung: L-attributierte Definitionen hinreichende Regeln für semantische Aktionen: 1.ererbtes Attribut für b j bereits links davon berechnet 2. kein Zugriff auf synthetisierte Attribute weiter rechts läßt yacc sowieso nicht zu 3. synthetisiertes Attribut für a erst ganz rechts berechnet Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 43 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 44

Problem mit eingebetteten Aktionen in Übersetzungsschemata Parser reduziert, wenn ganze Regel gelesen aber: eingebettete Aktion kommt vorher Lösung: Transformation der Grammatik: Entfernen eingebetter Aktionen yacc macht es intern automatisch Entfernen eingebetteter Aktionen aus Übersetzungsschemata Transformation der Grammatik führe für jede eingebettete Aktion i ein neues Markierungsnichtterminal m i ein und eine Regel m i ε füge mi an die Stelle der Aktion ein und verschiebe die Aktion ans Ende der neuen Regel Demo Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 45 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 46 Entfernen eingebetteter Aktionen aus Übersetzungsschemata (2) siehe typedecl-glob.output Problem: neue Regel kann evtl. Konflikt erzeugen, weil sie früher reduziert Erben von Attributen auf dem Parser-Stack eine Implementierung des Erbens von Attributen erfüllt automatisch die Bedingungen für L-attributierte Definitionen yacc macht es so Idee: die bisher berechneten Attribute für die aktuelle Regel liegen alle im Parser-Stack Zugriff durch geeignete Indizierung Attribut des Grammatiksymbols direkt links von der Aktion liegt ganz oben Demo Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 47 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 48

Erben von Attributen auf dem Parser-Stack (2) typedecl.y #include <stdio.h> #define YYERROR_VERBOSE void yyerror(char *) void addtype(char *, int) #define T_INT 0 #define T_REAL 1 % %union { int idtype char * name %token INT REAL ID ILLEGAL_CHAR %type <name> ID %type <idtype> type %verbose def: type { $<idtype>$ = $1 list type: INT { $$ = T_INT REAL { $$ = T_REAL list: list ',' ID { addtype($3, $<idtype>0) ID { addtype($1, $<idtype>0) void addtype(char *id, int type) { printf("adding type %s for id '%s'\n", (type? "REAL" : "INT"), id) void yyerror(char *msg) { printf("\n%s\n", msg) int main() { return yyparse() Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 49 yacc: Erben von Attributen auf dem Parser-Stack (3) $0 : oberster Wert auf Parser-Stack $-1 : zweitoberster Wert,... $$ in eingebetteter Regel: andere Bedeutung: Wert für diese Aktion, nicht für die ganze Regel $<idtype>$: explizite Typangabe nötig, da unbenannt Vorsicht: Bei jedem Reduzieren von list muß das Richtige auf Stack sein! Aktion $$ = $1 hier redundant, aber ggf. sicherer alle Verwendungen von list prüfen! Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 50 Inhalte der Vorlesung 1.Einführung 2.Lexikalische Analyse 3.Der Textstrom-Editor sed 4.Der Scanner-Generator lex 5.Syntaxanalyse und der Parser-Generator yacc 6.Syntaxgesteuerte Übersetzung 7.Übersetzungssteuerung mit make Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 51