1 / 22

Compilerbau WS06-07

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 }

vince
Download Presentation

Compilerbau WS06-07

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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) {2 x = x*y;3 } else {4 x = 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 - Parser: - von Bison generiert - "versteht" LC++ - syntaktische Analyse

  7. 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];

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

  11. 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 ')'

  12. 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 }

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

More Related