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

  • View
    118

  • Download
    8

Embed Size (px)

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