220 likes | 319 Views
Compilerbau WS06-07. Benjamin Brink Saina Bayat. Ziel des Praktikums. Die Implementierung eines kleinen Compilers für eine Teilmenge der Programmiersprache C++ unter Linux. SD Unparser für LC++. - Akzeptiert LC++ - LC++ - {if, else, while, +,* ,sin }
E N D
Compilerbau WS06-07 Benjamin Brink Saina Bayat
Ziel des Praktikums Die Implementierung eines kleinen Compilers für eine Teilmenge der Programmiersprache C++ unter Linux.
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
Beispiel 1 if (x < y) {2 x = x*y;3 } else {4 x = sin(x+y);5 }
Scanner / Parser - SD-Unparser: besteht aus Scanner/Parser- Scanner: - von Flex generiert - lexikographische Analyse - akzeptiert Wörter - erstellt Liste von Tokens
Parser - Parser: - von Bison generiert - "versteht" LC++ - syntaktische Analyse
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];
Beispiel 1 if (x < y) {2 x = = x*y;3 } else {4 x = sin(x+y)5 }
Ausgabe des Scanners 1 IF '(' SYMBOL '<' SYMBOL ')' '{'2 SYMBOL '=' '=' SYMBOL '*'SYMBOL '; ' 3 '}' ELSE '{'4 SYMBOL '=' SIN '(' SYMBOL '+'SYMBOL ')'5 '}'
Parser im Detail Parser im Detailparser.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 ';'
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 ')'
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 }
Sdcodelist - Generierung semantisch äquivalenter Form- Zerlegung der Ausdrucke in atomare Einheiten- Deklaration der neuer Variablen vi- Zuordnung der atomaren Teile zu den vi
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 }
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);
Sdtlcode - Erweiterung der Codelist- Berechnung 1. partieller Ableitung der vi- Speicherung in Hilfsvariablen dvi
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;
AST basiertet Ansatz Abstrakter Syntaxbaum - AST ist Datenstruktur- Parser generiert AST- Ausgabe mit print(), draw()
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*);}
Ausschnitt parser.y expression: expression '*' expression { $$=new ast_vertex; $$->type=MUL_EXPRESSION_ASTV; $$->sons.push_back($1); $$->sons.push_back($3);$$->idx = ++i; }
Beispiel x= y * z * sin(z);
SD/AST Unterschiede: • Implementierungsaufwand • Lesbarkeit • Erweiterbarkeit