Carregar apresentação
A apresentação está carregando. Por favor, espere
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.
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.