View
130
Download
8
Category
Preview:
Citation preview
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 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
program : serie_of_lines{
/* generate assembly code */printf("The End!\n");
} ;serie_of_lines : line
| serie_of_lines line;
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
;
Regras de Produção
assembler_cmd : data_cmd| text_cmd
;instruction : add_inst
| addi_inst;
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);}
;
Regras de Produção
reg_num : DOLLAR NUMBER{
$$ = $2;}
;int_const : expression
{$$ = $1;
};
Regras de Produção
data_cmd : FULL_STOP DATA| FULL_STOP DATA int_const
;text_cmd : FULL_STOP TEXT
| FULL_STOP TEXT int_const;
Regras de Produção
expression : expression PLUS expression {
$$ = $1 + $3;}
| expression MINUS expression {
$$ = $1 - $3;}
| OPEN_PARENTHESIS expression CLOSE_PARENTHESIS {
$$ = $2;}
| NUMBER ;%%
Regras de Produção
%{#include <stdio.h>#include <stdlib.h>%}
%union{
int int_val;}
%start program
Declarações
%token NEW_LINE%token COMMENT
%token OPEN_PARENTHESIS%token CLOSE_PARENTHESIS%token FULL_STOP%token COMMA%token DOLLAR
Declarações
%token ADD%token ADDI
%token DATA%token TEXT
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
%%
Declarações
%%
int yyerror (char *mens){
fprintf(stderr, "%s\n", mens);}
intmain (int argc, char **argv){
return (yyparse());}
Rotinas em C do Usuário
%{#include <stdio.h>#include "y.tab.h"
//extern int yylval;%}
%%add return (ADD);addi return (ADDI);
data return (DATA);text return (TEXT);
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);. ;%%
Especificação do Analisador Léxico em Lex
Compilando o Montador
yacc -d parser.y lex analisador_lexico.l gcc -o assembler lex.yy.c y.tab.c -ll
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.
Recommended