Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Compilerbau WS06-07 Benjamin Brink Saina Bayat. Ziel des Praktikums Die Implementierung eines kleinen Compilers für eine Teilmenge der Programmiersprache.

Ähnliche Präsentationen


Präsentation zum Thema: "Compilerbau WS06-07 Benjamin Brink Saina Bayat. Ziel des Praktikums Die Implementierung eines kleinen Compilers für eine Teilmenge der Programmiersprache."—  Präsentation transkript:

1 Compilerbau WS06-07 Benjamin Brink Saina Bayat

2 Ziel des Praktikums Die Implementierung eines kleinen Compilers für eine Teilmenge der Programmiersprache C++ unter Linux.

3 SD Unparser für LC++ - Akzeptiert LC++ - LC++ - {if, else, while, +,*,sin } -ganze Zahlen : {0,…,9} -Variablen: {a,…,z,A,…,Z} -Zuweisungen - Unveränderte Ausgabe

4 Beispiel 1 if (x < y) { 2x = x*y; 3 } else { 4x = sin(x+y); 5 }

5 Scanner / Parser - SD-Unparser: besteht aus Scanner/Parser - Scanner: - von Flex generiert - lexikographische Analyse - akzeptiert Wörter - erstellt Liste von Tokens

6 - Parser: - von Bison generiert - "versteht" LC++ - syntaktische Analyse Parser

7 Scanner im Detail scanner.l: 1 whitespace [ \t\n]+ 2 symbol[a-z]+ 3 number[0-9]+ 4 5 {whitespace} 6 7 "if"return IF; 8 "else"return ELSE; 9 "while"return WHILE; 10 "sin"return SIN; 11 12 {symbol} { yylval.a = strdup(yytext); return SYMBOL; } 13 {number} { yylval.a = strdup(yytext); return NUMBER; } 14 15 "=="return EQ; 16 "!="return NEQ; 17 " ="return GEQ; 19.return yytext[0];

8 Beispiel 1 if (x < y) { 2 x = = x*y; 3 } else { 4 x = sin(x+y) 5 }

9 Ausgabe des Scanners 1 IF '(' SYMBOL '<' SYMBOL ')' '{' 2 SYMBOL '=' '=' SYMBOL '*'SYMBOL '; ' 3 '}' ELSE '{' 4 SYMBOL '=' SIN '(' SYMBOL '+'SYMBOL ')' 5 '}'

10 Parser im Detail Parser im Detail parser.y: 1 %token SYMBOL IF ELSE WHILE SIN EQ NEQ LEQ GEQ 2 %left '+' 3 %left '*' 4 code: sequence_of_statements 5 sequence_of_statements: statement 6| statement sequence_of_statements 7 statement: assignment 8| control_structure 9 assignment: SYMBOL '=' expression ';'

11 Parser im Detail 10 control_structure: IF '(' comparism ')' '{' sequence_of_statements '}' 12 | IF '(' comparism ')' '{' sequence_of_statements '}' 13ELSE '{' sequence_of_statements '}' 14 | WHILE '(' comparism ')' '{' sequence_of_statements '}' 15 comparism: expression EQ expression 16 | expression NEQ expression 17 | expression ' ' expression 19 | expression LEQ expression 20 | expression GEQ expression 21 expression: expression '*' expression 22 | expression '+' expression 23 | SIN '(' expression ')' 24 | SYMBOL 25 | '(' expression ')'

12 Ausgabefunktion 1 static void print_with_tabs(char *s) 2 { 3char *p, *nl; 4int t, tablevel = 0; 5 6for (p=s; *p;) { 7nl = strchr(p, '\n'); 8if (nl) { 9*nl = 0; 10if (strchr(p, '}')) 11tablevel--; 12for (t=0; t<tablevel; t++) 13printf(TAB); 14printf("%s\n",p); 15if (strchr(p, '{')) 16tablevel++; 17p = nl+1; 18} 19 } 20 }

13 Sdcodelist - Generierung semantisch äquivalenter Form - Zerlegung der Ausdrucke in atomare Einheiten - Deklaration der neuer Variablen vi - Zuordnung der atomaren Teile zu den vi

14 Beispiel double v1,...,v7; if (x < y) { v1 = x; v2 = y; v3 = v1 * v2; x = v3; } else { v4 = x; v5 = y; v6 = v4 + v5; v7 = sin(v6); x = v7; } 1 if (x < y) { 2x = x*y; 3 } else { 4x =sin(x+y); 5 }

15 Implementierung assignment: SYMBOL '=' expression ';' sprintf($$.a, "%s%s = v%d;\n",$3.a,$1.a, $3.j); expression: expression '*' expression $$.j=i++; sprintf($$.a, "%s%sv%d = v%d * v%d;\n",$1.a,$3.a,$$.j,$1.j,$3.j); | expression '+' expression $$.j=i++; sprintf($$.a, "%s%sv%d = v%d + v%d;\n",$1.a,$3.a,$$.j,$1.j,$3.j); | SIN '(' expression ')' $$.j=i++; sprintf($$.a, "%sv%d = sin(v%d);\n",$3.a,$$.j,$3.j); | SYMBOL $$.j = i++; sprintf($$.a, "v%d = %s;\n", $$.j, $1.a); | NUMBER $$.j = i++; sprintf($$.a, "v%d = %s;\n", $$.j, $1.a);

16 Sdtlcode - Erweiterung der Codelist - Berechnung 1. partieller Ableitung der vi - Speicherung in Hilfsvariablen dvi

17 Beispiel x = 9*y + sin(z); double v1,...,v6, dv1,...,dv6; dv1 = 0; v1 = 9; dv2 = dy; v2 = y; dv3 = dv1 * v2 + v1 * dv2; v3 = v1 * v2; dv4 = dz; v4 = z; dv5 = dv4 * cos(v4); v5 = sin(v4); dv6 = dv3 + dv5; v6 = v3 + v5; dx = dv6; x = v6;

18 AST basiertet Ansatz Abstrakter Syntaxbaum - AST ist Datenstruktur - Parser generiert AST - Ausgabe mit print(), draw()

19 AST 1 class ast_vertex { 2 public: 3 int type; 4 int idx; 5 list sons; 6 char* symbol; 7 [...] 8 void print(FILE*,int); 9 void draw(FILE*); }

20 Ausschnitt parser.y expression: expression '*' expression { $$=new ast_vertex; $$->type=MUL_EXPRESSION_ASTV; $$->sons.push_back($1); $$->sons.push_back($3); $$->idx = ++i; }

21 Beispiel x= y * z * sin(z);

22 SD/AST Unterschiede: - Implementierungsaufwand - Lesbarkeit - Erweiterbarkeit


Herunterladen ppt "Compilerbau WS06-07 Benjamin Brink Saina Bayat. Ziel des Praktikums Die Implementierung eines kleinen Compilers für eine Teilmenge der Programmiersprache."

Ähnliche Präsentationen


Google-Anzeigen