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



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

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

Theoretische Grundlagen der Informatik

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Programmiersprachen und Übersetzer

Binäre Bäume Darstellung und Traversierung

Äquivalente Grammatiken / attributierte Grammatik

2. Programmierung in C

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Grundbegriffe der Informatik

Datenaufbereitung in SPSS. Daten zusammenfügen

5. Syntaxanalyse und der Parser-Generator yacc. 5.5 Aufsteigende Analyse. Absteigende Analyse versus aufsteigende Analyse. 5.5 Aufsteigende Analyse

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

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

Excel Funktionen durch eigene Funktionen erweitern.

Grammatiken in Prolog

Software Engineering Klassendiagramme Assoziationen

Anleitung: Einrichtung der Fritz!Box 7272 mit VoIP Telefonanschluss

Einführung in die Programmierung

t r Lineare Codierung von Binärbbäumen (Wörter über dem Alphabet {, }) Beispiel code( ) = code(, t l, t r ) = code(t l ) code(t r )

Lehrer: Einschreibemethoden

1 topologisches Sortieren

Excel Pivot-Tabellen 2010 effektiv

Anwendertreffen 20./21. Juni

Kapitel 4. Einführung in den Scannergenerator Flex. Einführung in den Scannergenerator Flex Wintersemester 2008/09 1 / 9

Erstellen von x-y-diagrammen in OpenOffice.calc

Objektbasierte Entwicklung

2.11 Kontextfreie Grammatiken und Parsebäume

Idee: Wenn wir beim Kopfknoten zwei Referenzen verfolgen können, sind die Teillisten kürzer. kopf Eine Datenstruktur mit Schlüsselwerten 1 bis 10

Datenstrukturen und Algorithmen

Formale Sprachen und Grammatiken

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

Propädeutikum. Dipl.-Inf. Frank Güttler

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

Erwin Grüner

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Die Excel Schnittstelle - Pro Pack

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Inhalte der Vorlesung. Wiederholung. Die Phasen der Übersetzung. 1. Einführung

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Inhalte der Vorlesung. 3. Der Textstrom-Editor sed. 3. Der Textstrom-Editor sed. Grundprinzip eines Textstrom-Editors

Berechnungen in Access Teil I

Algorithmik II. a) Fügen Sie in einen anfangs leeren binären Baum die Schlüsselfolge 20, 28, 35, 31, 9, 4, 13, 17, 37, 25 ein.

Vorkurs C++ Programmierung

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

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

Kapiteltests zum Leitprogramm Binäre Suchbäume

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Die Programmiersprache C99: Zusammenfassung

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

! " # $ " % & Nicki Wruck worldwidewruck

4 Aufzählungen und Listen erstellen

Datenstrukturen & Algorithmen

Programmierkurs Java

Deklarationen in C. Prof. Dr. Margarita Esponda

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Meldewesen Plus. TIPP: Nach Möglichkeit sollten Sie vor dem Erstellen von Etiketten die Vorlagen dupliziert haben!

Programmteil Zeiterfassung für Projekt und Mitarbeiter

1 Vom Problem zum Programm

GOLDESEL-Schulung Referat 05 Finanzcontrolling

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

affilinet_ Flash-Spezifikationen

Definition von domänenspezifischen Sprachen mit Xtext: Einführung. 19. November 2014

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 16

Professionelle Seminare im Bereich MS-Office

Übersicht Programmablaufsteuerung

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Java Kurs für Anfänger Einheit 5 Methoden

P&P Software - Adressexport an Outlook 05/29/16 14:44:26

Einführung in die Programmierung Laborübung bei Korcan Y. Kirkici. 12.Übung bis

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

FIS: Projektdaten auf den Internetseiten ausgeben

Kapitalerhöhung - Verbuchung

Kapitel 2: Formale Sprachen Kontextfreie Sprachen. reguläre Grammatiken/Sprachen. kontextfreie Grammatiken/Sprachen

Programmierung in C. Grundlagen. Stefan Kallerhoff

Summenbildung in Bauteiltabellen mit If Then Abfrage

Assoziation und Aggregation

Handout für die Einrichtung von Microsoft Outlook

KONSTRUKTION VON ROT-SCHWARZ-BÄUMEN

Hilfe zur Urlaubsplanung und Zeiterfassung

Übungen Programmieren 1 Felix Rohrer. Übungen

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

Klausur in Programmieren

Simplex-Umformung für Dummies

Lehrstuhl Informatik VI Grundzüge der Informatik * WS 2008/2009 Prof. Dr. Joachim Biskup

Datenexport aus JS - Software

Theoretische Informatik I

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Autoformat während der Eingabe

A. Ersetzung einer veralteten Govello-ID ( Absenderadresse )

Erstellen einer digitalen Signatur für Adobe-Formulare

Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me

1. Formale Sprachen 1.2 Grammatiken formaler Sprachen

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Einführung in die Programmierung

Einlesen einer neuen Chipkarte in der VR-NetWorld Software Seccos 6 gültig bis 2013

Tevalo Handbuch v 1.1 vom

Mit dem Tool Stundenverwaltung von Hanno Kniebel erhalten Sie die Möglichkeit zur effizienten Verwaltung von Montagezeiten Ihrer Mitarbeiter.

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Transkript:

Inhalte der Vorlesung 6. Syntaxgesteuerte Übersetzung 1.Einführung 2.Lexikalische Analyse 3.Der Textstrom-Editor sed 4.Der Scanner-Generator lex (2 Termine) 5.Syntaxanalyse und der Parser-Generator yacc (3 T.) 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 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 3 Attributierter Syntaxbaum Knoten mit Werten Wert: durch Semantikregel des Knotens Semantikregel mit Seitenwirkungen möglich Ausgabe := position real globale Variable verändern + initial * real rate real inttoreal 60 integer Ü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 Grammatikregel Semantikregel l e NL print(e.val) e e 1 + t e.val := e 1.val + t.val e t e.val := t.val t t 1 f t.val := t 1.val f.val t f t.val := f.val f ( e ) f.val := e.val f NUMBER f.val := NUMBER.val S-attributierte Definition 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 Semantikregel d t l l.in := t.type t INT t.type := integer t REAL t.type := real l l 1, ID l 1.in := l.in addtype(id.entry, l.in) l ID addtype(id.entry, l.in) Ableitungsbaum mit Attribut in an l-knoten t.type := real REAL ID 1 d l.in = real l.in = real, ID 3 l.in = real, ID 2 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 9 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 10 Abhängigkeitsgraph Abhängigkeiten zwischen Attributen wird über Ableitungsbaum konstruiert Beispiel: t REAL 4 type 9 in 7 in d l 10, ID 2 ID 1 1 entry 5 in l l 8, ID 3 3 entry 6 2 entry Abhängigkeitsgraph (2) 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 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 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 11 Ü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 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 13 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 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 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 17 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 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 b j : 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 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 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 29 Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 30 Verschiedene Typen für die Attributwerte (3) calc-types.y #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() 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 31 Ü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: $1 und $$ haben ohnehin gleichen Platz auf Stack 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) 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) Implizites Attribut für Position in der Eingabe (5) 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() @$,... 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 37 Ü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 abgefangen durch error-regel für berechnung Ü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 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 m i 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 (2 Termine) 5.Syntaxanalyse und der Parser-Generator yacc (3 T.) 6.Syntaxgesteuerte Übersetzung 7.Übersetzungssteuerung mit make Übersetzergenerierung Syntaxgesteuerte Übersetzung Jan Bredereke, Universität Bremen 51