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

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

Implementando um Montador com LEX e YACC

Apresentações semelhantes


Apresentação em tema: "Implementando um Montador com LEX e YACC"— 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 Regras de Produção program : serie_of_lines {
/* generate assembly code */ printf("The End!\n"); } ; serie_of_lines : line | serie_of_lines line

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

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

6 Regras de Produção 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);

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

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

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

10 Declarações %{ #include <stdio.h> #include <stdlib.h> %}
%union { int int_val; } %start program

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

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

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

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

15 Especificação do Analisador Léxico em Lex
%{ #include <stdio.h> #include "y.tab.h" //extern int yylval; %} %% add return (ADD); addi return (ADDI); data return (DATA); text return (TEXT);

16 Especificação do Analisador Léxico em Lex
[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); \n return (NEW_LINE); \#.* return (COMMENT); . ; %%

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 sp1@lcad.inf.ufes.br)
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"

Apresentações semelhantes


Anúncios Google