compilerbau ws06 07 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Compilerbau WS06-07 PowerPoint Presentation
Download Presentation
Compilerbau WS06-07

Loading in 2 Seconds...

play fullscreen
1 / 22

Compilerbau WS06-07 - PowerPoint PPT Presentation


  • 79 Views
  • Uploaded on

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 }

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Compilerbau WS06-07' - vince


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
compilerbau ws06 07

Compilerbau WS06-07

Benjamin Brink

Saina Bayat

ziel des praktikums
Ziel des Praktikums

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

sd unparser f r lc
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
Beispiel

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

scanner parser
Scanner / Parser

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

slide6

Parser

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

scanner im detail
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];

beispiel1
Beispiel

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

ausgabe des scanners
Ausgabe des Scanners

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

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

parser im detail
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 detail1
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
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
Sdcodelist

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

beispiel2
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
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
Sdtlcode

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

beispiel3
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
AST basiertet Ansatz

Abstrakter Syntaxbaum

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

slide19
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
Ausschnitt parser.y

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

beispiel4
Beispiel

x= y * z * sin(z);

sd ast
SD/AST

Unterschiede:

  • Implementierungsaufwand
  • Lesbarkeit
  • Erweiterbarkeit