Home Documents Implementando um Montador com LEX e YACC. Ponto de Partida – Descrição da Sintaxe na Linguagem... Implementando um Montador com LEX e YACC. Ponto de Partida – Descrição da Sintaxe na Linguagem em Yacc Começamos especificando a sintaxe da linguagem
Embed Size (px)
344 x 292 429 x 357 514 x 422 599 x 487
Text of Implementando um Montador com LEX e YACC. Ponto de Partida – Descrição da Sintaxe na Linguagem... Slide 1 Implementando um Montador com LEX e YACC Slide 2 Ponto de Partida Descrio da Sintaxe na Linguagem em Yacc Comeamos especificando a sintaxe da linguagem de montagem que ser traduzida pelo montador para linguagem de mquina usando o padro yacc. O arquivo yacc tem o formato: declaraes % regras de produo % rotinas em C do usurio Slide 3 program :serie_of_lines { /* generate assembly code */ printf("The End!\n"); } ; serie_of_lines:line |serie_of_lines line ; Regras de Produo Slide 4 line:nline_or_comment |assembler_cmd nline_or_comment |instruction nline_or_comment |error { yyerrok; exit (1); } ; nline_or_comment:NEW_LINE |COMMENT NEW_LINE ; Regras de Produo Slide 5 assembler_cmd:data_cmd |text_cmd ; instruction:add_inst |addi_inst ; Regras de Produo Slide 6 add_inst:ADD reg_num COMMA reg_num COMMA reg_num { printf("add $%d, $%d, $%d\n", $2, $4, $6); } ; addi_inst:ADDI reg_num COMMA reg_num COMMA int_const { printf("addi $%d, $%d, %d\n", $2, $4, $6); } ; Regras de Produo Slide 7 reg_num:DOLLAR NUMBER { $$ = $2; } ; int_const:expression { $$ = $1; } ; Regras de Produo Slide 8 data_cmd:FULL_STOP DATA |FULL_STOP DATA int_const ; text_cmd:FULL_STOP TEXT |FULL_STOP TEXT int_const ; Regras de Produo Slide 9 expression :expression PLUS expression { $$ = $1 + $3; } |expression MINUS expression { $$ = $1 - $3; } |OPEN_PARENTHESIS expression CLOSE_PARENTHESIS { $$ = $2; } | NUMBER ; % Regras de Produo Slide 10 %{ #include %} %union { int int_val; } %start program Declaraes Slide 11 %token NEW_LINE %token COMMENT %token OPEN_PARENTHESIS %token CLOSE_PARENTHESIS %token FULL_STOP %token COMMA %token DOLLAR Declaraes Slide 12 %token ADD %token ADDI %token DATA %token TEXT Declaraes Slide 13 %token NUMBER %type reg_num %type int_const %type expression %token PLUS %token MINUS %left PLUS MINUS % Declaraes Slide 14 % int yyerror (char *mens) { fprintf(stderr, "%s\n", mens); } int main (int argc, char **argv) { return (yyparse()); } Rotinas em C do Usurio Slide 15 %{ #include #include "y.tab.h" //extern int yylval; %} % addreturn (ADD); addireturn (ADDI); datareturn (DATA); textreturn (TEXT); Especificao do Analisador Lxico em Lex Slide 16 [0-9]+{yylval.int_val = atoi(yytext); return NUMBER;}; 0x[0-9a-fA-F]+{yylval.int_val = atoi(yytext); return NUMBER;}; \(return (OPEN_PARENTHESIS); \)return (CLOSE_PARENTHESIS); \.return (FULL_STOP); \,return (COMMA); \$return (DOLLAR); \+return (PLUS); \-return (MINUS); \nreturn (NEW_LINE); \#.*return (COMMENT);.; % Especificao do Analisador Lxico em Lex Slide 17 Compilando o Montador yacc -d parser.y lex analisador_lexico.l gcc -o assembler lex.yy.c y.tab.c -ll Slide 18 Trabalho 3 (enviar para sp1@lcad.inf.ufes.br) Estenda o esqueleto de montador apresentado incluindo todas as instrues do prximo slide. Implemente as operaes de * e / sobre expresses. Slide 19