Compilerbau WS06-07 Benjamin Brink Saina Bayat. Ziel des Praktikums Die Implementierung eines...

22
Compilerbau WS06-07 Benjamin Brink Saina Bayat

Transcript of Compilerbau WS06-07 Benjamin Brink Saina Bayat. Ziel des Praktikums Die Implementierung eines...

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

Compilerbau WS06-07

Benjamin BrinkSaina Bayat

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

Ziel des Praktikums

Die Implementierung eines kleinen Compilers für

eine Teilmenge der Programmiersprache C++ unter Linux.

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

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

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

Beispiel

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

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

Scanner / Parser

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

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

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

Parser

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

Scanner im Detail

scanner.l:1 whitespace [ \t\n]+2 symbol [a-z]+3 number [0-9]+45 {whitespace}67 "if" return IF;8 "else" return ELSE;9 "while" return WHILE;10 "sin" return SIN;1112 {symbol} { yylval.a = strdup(yytext); return SYMBOL; }13 {number} { yylval.a = strdup(yytext); return NUMBER; }1415 "==" return EQ;16 "!=" return NEQ;17 "<=" return LEQ;18 ">=" return GEQ;19 . return yytext[0];

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

Beispiel

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

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

Ausgabe des Scanners

1 IF '(' SYMBOL '<' SYMBOL ')' '{'2 SYMBOL '=' '=' SYMBOL '*'SYMBOL '; '

3 '}' ELSE '{'4 SYMBOL '=' SIN '(' SYMBOL '+'SYMBOL ')'5 '}'

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

Parser im Detail

Parser im Detail

parser.y:1 %token SYMBOL IF ELSE WHILE SIN EQ NEQ LEQ GEQ2 %left '+'3 %left '*'4 code: sequence_of_statements5 sequence_of_statements: statement6 | statement sequence_of_statements7 statement: assignment8 | control_structure9 assignment: SYMBOL '=' expression ';'

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

Parser im Detail

10 control_structure: IF '(' comparism ')' '{' sequence_of_statements '}'

12 | IF '(' comparism ')' '{' sequence_of_statements '}'

13 ELSE '{' sequence_of_statements '}'

14 | WHILE '(' comparism ')' '{' sequence_of_statements '}'

15 comparism: expression EQ expression16 | expression NEQ expression17 | expression '<' expression18 | expression '>' expression19 | expression LEQ expression20 | expression GEQ expression21 expression: expression '*' expression22 | expression '+' expression23 | SIN '(' expression ')'24 | SYMBOL 25 | '(' expression ')'

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

Ausgabefunktion

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

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

Sdcodelist

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

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

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) {2 x = x*y;3 } else {4 x =sin(x+y);5 }

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

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);

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

Sdtlcode

- Erweiterung der Codelist

- Berechnung 1. partieller Ableitung der vi- Speicherung in Hilfsvariablen dvi

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

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;

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

AST basiertet Ansatz

Abstrakter Syntaxbaum - AST ist Datenstruktur

- Parser generiert AST- Ausgabe mit print(), draw()

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

AST

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

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

Ausschnitt parser.y

expression: expression '*' expression{

$$=new ast_vertex;$$->type=MUL_EXPRESSION_ASTV;$$->sons.push_back($1);$$->sons.push_back($3);$$->idx = ++i;

}

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

Beispiel

x= y * z * sin(z);

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

SD/AST

Unterschiede:- Implementierungsaufwand- Lesbarkeit- Erweiterbarkeit