19
Implementando um Montador com LEX e YACC

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

Embed Size (px)

Citation preview

Page 1: 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

Implementando um Montador com LEX e YACC

Page 2: 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

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

Page 3: 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

program : serie_of_lines{

/* generate assembly code */printf("The End!\n");

} ;serie_of_lines : line

| serie_of_lines line;

Regras de Produção

Page 4: 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

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

Page 5: 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

assembler_cmd : data_cmd| text_cmd

;instruction : add_inst

| addi_inst;

Regras de Produção

Page 6: 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

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

Page 7: 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

reg_num : DOLLAR NUMBER{

$$ = $2;}

;int_const : expression

{$$ = $1;

};

Regras de Produção

Page 8: 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

data_cmd : FULL_STOP DATA| FULL_STOP DATA int_const

;text_cmd : FULL_STOP TEXT

| FULL_STOP TEXT int_const;

Regras de Produção

Page 9: 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

expression : expression PLUS expression {

$$ = $1 + $3;}

| expression MINUS expression {

$$ = $1 - $3;}

| OPEN_PARENTHESIS expression CLOSE_PARENTHESIS {

$$ = $2;}

| NUMBER ;%%

Regras de Produção

Page 10: 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

%{#include <stdio.h>#include <stdlib.h>%}

%union{

int int_val;}

%start program

Declarações

Page 11: 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

%token NEW_LINE%token COMMENT

%token OPEN_PARENTHESIS%token CLOSE_PARENTHESIS%token FULL_STOP%token COMMA%token DOLLAR

Declarações

Page 12: 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

%token ADD%token ADDI

%token DATA%token TEXT

Declarações

Page 13: 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

%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

Page 14: 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

%%

int yyerror (char *mens){

fprintf(stderr, "%s\n", mens);}

intmain (int argc, char **argv){

return (yyparse());}

Rotinas em C do Usuário

Page 15: 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

%{#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

Page 16: 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

[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

Page 17: 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

Compilando o Montador

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

Page 18: 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

Trabalho 3 (enviar para [email protected])

Estenda o esqueleto de montador apresentado incluindo todas as instruções do próximo slide.

Implemente as operações de * e / sobre expressões.

Page 19: 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