A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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.

Apresentações semelhantes


Apresentação em tema: "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."— Transcrição da apresentação:

1 Implementando um Montador com LEX e YACC

2 Ponto de Partida – Descrição da Sintaxe na Linguagem em Yacc Começamos especificando a sintaxe da linguagem de montagem que será traduzida pelo montador para linguagem de máquina usando o padrão yacc. O arquivo yacc tem o formato: declarações % regras de produção % rotinas em C do usuário

3 program :serie_of_lines { /* generate assembly code */ printf("The End!\n"); } ; serie_of_lines:line |serie_of_lines line ; Regras de Produção

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 Produção

5 assembler_cmd:data_cmd |text_cmd ; instruction:add_inst |addi_inst ; Regras de Produção

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 Produção

7 reg_num:DOLLAR NUMBER { $$ = $2; } ; int_const:expression { $$ = $1; } ; Regras de Produção

8 data_cmd:FULL_STOP DATA |FULL_STOP DATA int_const ; text_cmd:FULL_STOP TEXT |FULL_STOP TEXT int_const ; Regras de Produção

9 expression :expression PLUS expression { $$ = $1 + $3; } |expression MINUS expression { $$ = $1 - $3; } |OPEN_PARENTHESIS expression CLOSE_PARENTHESIS { $$ = $2; } | NUMBER ; % Regras de Produção

10 %{ #include %} %union { int int_val; } %start program Declarações

11 %token NEW_LINE %token COMMENT %token OPEN_PARENTHESIS %token CLOSE_PARENTHESIS %token FULL_STOP %token COMMA %token DOLLAR Declarações

12 %token ADD %token ADDI %token DATA %token TEXT Declarações

13 %token NUMBER %type reg_num %type int_const %type expression %token PLUS %token MINUS %left PLUS MINUS % Declarações

14 % int yyerror (char *mens) { fprintf(stderr, "%s\n", mens); } int main (int argc, char **argv) { return (yyparse()); } Rotinas em C do Usuário

15 %{ #include #include "y.tab.h" //extern int yylval; %} % addreturn (ADD); addireturn (ADDI); datareturn (DATA); textreturn (TEXT); Especificação do Analisador Léxico em Lex

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);.; % Especificação do Analisador Léxico em Lex

17 Compilando o Montador yacc -d parser.y lex analisador_lexico.l gcc -o assembler lex.yy.c y.tab.c -ll

18 Trabalho 3 (enviar para Estenda o esqueleto de montador apresentado incluindo todas as instruções do próximo slide. Implemente as operações de * e / sobre expressões.

19


Carregar ppt "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."

Apresentações semelhantes


Anúncios Google