SlideShare uma empresa Scribd logo
1 de 3
Baixar para ler offline
Trabalho de Compiladores (v.2)
                                     Prof. Dr. Erwin Doescher


Análise Léxica: Deve reconhecer os seguintes elementos da linguagem

Palavras reservadas: else if int char return void while puts gets
Símbolos especiais: + – * / < <= > >= == != = ; , { } [ ] ( )

tokens: ID NUM string else if int char return void while puts gets relop

Definições regulares:
ID → letra ( letra | digito | _ )*
NUM → digito digito*
relop → <= | < | > | >= | == | !=
letra → [ a – z ]
digito → [ 0 – 9 ]
escape → " | ' | n | t
simbolos → [][@!#$%&()_+={}~?/;:.>,<|] | "-" | ' | ^
interno → letra | digito| escape | simbolos | espaço
string → "(interno|*)* "
comentarios → / *(/ * | interno| n)**/ | //.*n

Análise Sintática:

programa → lista_decl
lista_decl → lista_decl decl | decl
decl → var_decl | fun_decl

var_decl → tipo_var lista_id_var ;
lista_id_var → lista_id_var, id_var | id_var
id_var → ID | ID [ NUM ] | *ID | *ID [ NUM ]
tipo_var → int | char

fun_decl → tipo_var ID ( params ) composto_decl | void ID ( params ) composto_decl
params → param_lista | void
param_lista → param_lista, param | param
param → tipo_var id_param
id_param → ID | ID [ ] | *ID | *ID [ ]
tipo_fun → tipo_var | void

composto_decl → { local_decl statement_lista }
local_decl → local_decl var_decl | 
statement_lista → statement_lista statement | 
statement → puts_decl | gets_decl |expr_decl | composto_decl | sel_decl | iter_decl | retorno_decl

puts_decl → puts (ID); | puts (string);
gets_decl → gets (ID);
expr_decl → expr ; | ;
sel_decl → if ( expr ) statement
           | if ( expr ) statement else statement
iter_decl → while ( expr ) statement
retorno_decl → return ; | return expr ;
expr → var = expr | simples_expr
var → ID | ID [ expr ]
simples_expr → soma_expr relop soma_expr | soma_expr
relacional → <= | < | > | >= | == | !=
soma_expr → soma_expr soma termo | termo
soma → + | –
termo → termo mult fator | fator
mult → * | /
fator → ( expr ) | var | chamada | NUM

chamada → ID ( args )
args → arg_lista | 
arg_lista → arg_lista, expr | expr


Sugestão de roteiro de implementação:
   1. Defina o atributo dos tokens a serem enviados do analisador léxico para o sintático
   2. Defina os atributos dos símbolos gramaticais para o analisador sintático, definindo-os em
       uma estrutura
   3. Defina o atributo para o analisador implementado com o Yacc como sendo a união dos tipos
       definidos nos itens 1) e 2)
   4. Antes de implementar o arquivo do analisador léxico, defina os tokens necessários no
       arquivo do analisador sintático
   5. Faça o analisador léxico
   6. Defina as regras de produção no arquivo do analisador sintático, deixando provisoriamente
       as regras semânticas em branco
   7. Defina as regras semânticas usadas para inserir variáveis na tabela de símbolos
   8. Faça a verificação de tipos das regras de produção que necessitarem
   9. Defina o tipo de armazenamento a ser usado para o código intermediário: vetor fixo, vetor
       dinâmico ou lista ligada
   10. Crie as funções auxiliares necessárias para concatenar dois fragmentos de código
       intermediário em um único
   11. Crie as funções para gerar temporários e rótulos únicos
   12. Defina as regras semânticas para gerar o código de 3 endereços de cada produção.
   13. Implemente as otimizações básicas simples
   14. Implemente a rotina que leia o vetor de código intermediário e escreva o programa em
       linguagem de montagem correspondente (código alvo).


Prazos:
04/11/2010 – Analisador Léxico e Sintático com a inserção de dados na tabela de símbolos e
Verificação de tipos
18/11/2010 – Geração do código intermediário
25/11/2010 – Otimizações simples de código
02/12/2010 – (Final) Geração de código alvo
Obs.: A produção do if gera um conflito empilha/reduz:

sel_decl → if ( expr ) statement
          | if ( expr ) statement else statement

Para resolver o conflito é preciso dar uma precedência maior para o if … else.

Isto pode ser feito no yacc definindo as precedências:

%nonassoc menor_que_else
%nonassoc eles

no começo do arquivo e definindo a produção como:


sel_decl : if '(' expr ')' statement            %prec menor_que_else
         | if '(' expr ')' statement else statement
         ;

Mais conteúdo relacionado

Mais procurados

Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1Israel Messias
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Saulo Arruda
 
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...Manuel Menezes de Sequeira
 
Vetores, Matrizes e Strings em C Parte 3
Vetores, Matrizes e Strings em C Parte 3Vetores, Matrizes e Strings em C Parte 3
Vetores, Matrizes e Strings em C Parte 3Elaine Cecília Gatto
 
PHP Arrays - Básico | Certificação
PHP Arrays - Básico | CertificaçãoPHP Arrays - Básico | Certificação
PHP Arrays - Básico | CertificaçãoRicardo de Carvalho
 
Vetores, Matrizes e Strings em C Parte 1
Vetores, Matrizes e Strings em C Parte 1Vetores, Matrizes e Strings em C Parte 1
Vetores, Matrizes e Strings em C Parte 1Elaine Cecília Gatto
 
Tradutor de Pig Latin
Tradutor de Pig LatinTradutor de Pig Latin
Tradutor de Pig LatinElen Arantza
 
Aprendendo objective c - parte 1
Aprendendo objective c - parte 1Aprendendo objective c - parte 1
Aprendendo objective c - parte 1Alamo Saravali
 
Linguagem de Programação PERL
Linguagem de Programação PERLLinguagem de Programação PERL
Linguagem de Programação PERLTiago R. Sampaio
 
Javascript Avançado
Javascript AvançadoJavascript Avançado
Javascript AvançadoBruno Tavares
 
Biblioteca strings profª ms
Biblioteca strings profª msBiblioteca strings profª ms
Biblioteca strings profª msJoelsa Soares
 
Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros Karoline Tavares
 

Mais procurados (18)

Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1Programação Orientada a Objetos (POO) com PHP - Parte 1
Programação Orientada a Objetos (POO) com PHP - Parte 1
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1
 
Python Emsl2009
Python Emsl2009Python Emsl2009
Python Emsl2009
 
02 entidade projeto-vhd-ivanl
02   entidade projeto-vhd-ivanl02   entidade projeto-vhd-ivanl
02 entidade projeto-vhd-ivanl
 
Php básico
Php básicoPhp básico
Php básico
 
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
 
Vetores, Matrizes e Strings em C Parte 3
Vetores, Matrizes e Strings em C Parte 3Vetores, Matrizes e Strings em C Parte 3
Vetores, Matrizes e Strings em C Parte 3
 
PHP Arrays - Básico | Certificação
PHP Arrays - Básico | CertificaçãoPHP Arrays - Básico | Certificação
PHP Arrays - Básico | Certificação
 
Vetores, Matrizes e Strings em C Parte 1
Vetores, Matrizes e Strings em C Parte 1Vetores, Matrizes e Strings em C Parte 1
Vetores, Matrizes e Strings em C Parte 1
 
Tradutor de Pig Latin
Tradutor de Pig LatinTradutor de Pig Latin
Tradutor de Pig Latin
 
Aprendendo objective c - parte 1
Aprendendo objective c - parte 1Aprendendo objective c - parte 1
Aprendendo objective c - parte 1
 
Minicurso php
Minicurso phpMinicurso php
Minicurso php
 
Linguagem C 09 Ponteiros
Linguagem C 09 PonteirosLinguagem C 09 Ponteiros
Linguagem C 09 Ponteiros
 
Linguagem de Programação PERL
Linguagem de Programação PERLLinguagem de Programação PERL
Linguagem de Programação PERL
 
Javascript Avançado
Javascript AvançadoJavascript Avançado
Javascript Avançado
 
PHP 5.3 - Funções
PHP 5.3 - FunçõesPHP 5.3 - Funções
PHP 5.3 - Funções
 
Biblioteca strings profª ms
Biblioteca strings profª msBiblioteca strings profª ms
Biblioteca strings profª ms
 
Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros Linguagem C - Funções e ponteiros
Linguagem C - Funções e ponteiros
 

Destaque

Ficha javacc
Ficha javaccFicha javacc
Ficha javaccÆx Lynx
 
Compilers - Using Lex and YACC
Compilers - Using Lex and YACCCompilers - Using Lex and YACC
Compilers - Using Lex and YACCMichel Alves
 
Como Construir um compilador-cap 2
Como Construir um compilador-cap 2Como Construir um compilador-cap 2
Como Construir um compilador-cap 2Maellson Marques
 
[TUTORIAL] PetitParser
[TUTORIAL] PetitParser[TUTORIAL] PetitParser
[TUTORIAL] PetitParserESUG
 
Poscomp-Cadernodequestes ano2011
Poscomp-Cadernodequestes ano2011Poscomp-Cadernodequestes ano2011
Poscomp-Cadernodequestes ano2011Maellson Marques
 
Compilador analise lexica
Compilador analise lexicaCompilador analise lexica
Compilador analise lexicaAdilmar Dantas
 
Como Construir um Compilador cap-1
Como Construir um Compilador cap-1Como Construir um Compilador cap-1
Como Construir um Compilador cap-1Maellson Marques
 
Gerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresGerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresAnderson Favaro
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Librarieselliando dias
 
Compilador-Analisador Léxico com FLEX + Linguagem C
Compilador-Analisador Léxico com FLEX + Linguagem C Compilador-Analisador Léxico com FLEX + Linguagem C
Compilador-Analisador Léxico com FLEX + Linguagem C Aldisio Medeiros
 

Destaque (15)

JavaCC
JavaCCJavaCC
JavaCC
 
Ficha javacc
Ficha javaccFicha javacc
Ficha javacc
 
Compiladores
CompiladoresCompiladores
Compiladores
 
Compilers - Using Lex and YACC
Compilers - Using Lex and YACCCompilers - Using Lex and YACC
Compilers - Using Lex and YACC
 
Como Construir um compilador-cap 2
Como Construir um compilador-cap 2Como Construir um compilador-cap 2
Como Construir um compilador-cap 2
 
poscomp-Gabarito ano2010
poscomp-Gabarito ano2010poscomp-Gabarito ano2010
poscomp-Gabarito ano2010
 
[TUTORIAL] PetitParser
[TUTORIAL] PetitParser[TUTORIAL] PetitParser
[TUTORIAL] PetitParser
 
Poscomp-Cadernodequestes ano2011
Poscomp-Cadernodequestes ano2011Poscomp-Cadernodequestes ano2011
Poscomp-Cadernodequestes ano2011
 
Compilador analise lexica
Compilador analise lexicaCompilador analise lexica
Compilador analise lexica
 
poscomp-Gabarito ano2011
poscomp-Gabarito ano2011poscomp-Gabarito ano2011
poscomp-Gabarito ano2011
 
Gcc
GccGcc
Gcc
 
Como Construir um Compilador cap-1
Como Construir um Compilador cap-1Como Construir um Compilador cap-1
Como Construir um Compilador cap-1
 
Gerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - CompiladoresGerador de Código-Objeto - Compiladores
Gerador de Código-Objeto - Compiladores
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Libraries
 
Compilador-Analisador Léxico com FLEX + Linguagem C
Compilador-Analisador Léxico com FLEX + Linguagem C Compilador-Analisador Léxico com FLEX + Linguagem C
Compilador-Analisador Léxico com FLEX + Linguagem C
 

Semelhante a Trabalho

Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoronaldoferraz
 
LIA - Linguagem Interpretada de Algoritmos
LIA - Linguagem Interpretada de AlgoritmosLIA - Linguagem Interpretada de Algoritmos
LIA - Linguagem Interpretada de AlgoritmosRafael Martins
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Luciano Ramalho
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascalJocelma Rios
 
O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9Nando Vieira
 
Py sintaxe
Py sintaxePy sintaxe
Py sintaxeFlapenta
 
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonIEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonDiogo Gomes
 
Construindo um analisador de executáveis
Construindo um analisador de executáveisConstruindo um analisador de executáveis
Construindo um analisador de executáveisFernando Mercês
 
Vale Security Conference - 2011 - 11 - Fernando Mercês [Octane Labs] [Coding ...
Vale Security Conference - 2011 - 11 - Fernando Mercês [Octane Labs] [Coding ...Vale Security Conference - 2011 - 11 - Fernando Mercês [Octane Labs] [Coding ...
Vale Security Conference - 2011 - 11 - Fernando Mercês [Octane Labs] [Coding ...Vale Security Conference
 
Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Marco Mendes
 

Semelhante a Trabalho (20)

Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programação
 
Linguagem_C.pdf
Linguagem_C.pdfLinguagem_C.pdf
Linguagem_C.pdf
 
LIA - Linguagem Interpretada de Algoritmos
LIA - Linguagem Interpretada de AlgoritmosLIA - Linguagem Interpretada de Algoritmos
LIA - Linguagem Interpretada de Algoritmos
 
Unidade7 1
Unidade7 1Unidade7 1
Unidade7 1
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
 
Lógica de programação pascal
Lógica de programação   pascalLógica de programação   pascal
Lógica de programação pascal
 
Ud2
Ud2Ud2
Ud2
 
Ed1
Ed1Ed1
Ed1
 
Introducao Google GO
Introducao Google GOIntroducao Google GO
Introducao Google GO
 
O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9
 
Python2.5.ppt
Python2.5.pptPython2.5.ppt
Python2.5.ppt
 
02_lisp.pdf
02_lisp.pdf02_lisp.pdf
02_lisp.pdf
 
03_lisp.pdf
03_lisp.pdf03_lisp.pdf
03_lisp.pdf
 
Py sintaxe
Py sintaxePy sintaxe
Py sintaxe
 
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonIEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
 
Palestra cbq
Palestra cbqPalestra cbq
Palestra cbq
 
Construindo um analisador de executáveis
Construindo um analisador de executáveisConstruindo um analisador de executáveis
Construindo um analisador de executáveis
 
Vale Security Conference - 2011 - 11 - Fernando Mercês [Octane Labs] [Coding ...
Vale Security Conference - 2011 - 11 - Fernando Mercês [Octane Labs] [Coding ...Vale Security Conference - 2011 - 11 - Fernando Mercês [Octane Labs] [Coding ...
Vale Security Conference - 2011 - 11 - Fernando Mercês [Octane Labs] [Coding ...
 
Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10
 
Curso de Python e Django
Curso de Python e DjangoCurso de Python e Django
Curso de Python e Django
 

Trabalho

  • 1. Trabalho de Compiladores (v.2) Prof. Dr. Erwin Doescher Análise Léxica: Deve reconhecer os seguintes elementos da linguagem Palavras reservadas: else if int char return void while puts gets Símbolos especiais: + – * / < <= > >= == != = ; , { } [ ] ( ) tokens: ID NUM string else if int char return void while puts gets relop Definições regulares: ID → letra ( letra | digito | _ )* NUM → digito digito* relop → <= | < | > | >= | == | != letra → [ a – z ] digito → [ 0 – 9 ] escape → " | ' | n | t simbolos → [][@!#$%&()_+={}~?/;:.>,<|] | "-" | ' | ^ interno → letra | digito| escape | simbolos | espaço string → "(interno|*)* " comentarios → / *(/ * | interno| n)**/ | //.*n Análise Sintática: programa → lista_decl lista_decl → lista_decl decl | decl decl → var_decl | fun_decl var_decl → tipo_var lista_id_var ; lista_id_var → lista_id_var, id_var | id_var id_var → ID | ID [ NUM ] | *ID | *ID [ NUM ] tipo_var → int | char fun_decl → tipo_var ID ( params ) composto_decl | void ID ( params ) composto_decl params → param_lista | void param_lista → param_lista, param | param param → tipo_var id_param id_param → ID | ID [ ] | *ID | *ID [ ] tipo_fun → tipo_var | void composto_decl → { local_decl statement_lista } local_decl → local_decl var_decl |  statement_lista → statement_lista statement |  statement → puts_decl | gets_decl |expr_decl | composto_decl | sel_decl | iter_decl | retorno_decl puts_decl → puts (ID); | puts (string); gets_decl → gets (ID); expr_decl → expr ; | ; sel_decl → if ( expr ) statement | if ( expr ) statement else statement iter_decl → while ( expr ) statement
  • 2. retorno_decl → return ; | return expr ; expr → var = expr | simples_expr var → ID | ID [ expr ] simples_expr → soma_expr relop soma_expr | soma_expr relacional → <= | < | > | >= | == | != soma_expr → soma_expr soma termo | termo soma → + | – termo → termo mult fator | fator mult → * | / fator → ( expr ) | var | chamada | NUM chamada → ID ( args ) args → arg_lista |  arg_lista → arg_lista, expr | expr Sugestão de roteiro de implementação: 1. Defina o atributo dos tokens a serem enviados do analisador léxico para o sintático 2. Defina os atributos dos símbolos gramaticais para o analisador sintático, definindo-os em uma estrutura 3. Defina o atributo para o analisador implementado com o Yacc como sendo a união dos tipos definidos nos itens 1) e 2) 4. Antes de implementar o arquivo do analisador léxico, defina os tokens necessários no arquivo do analisador sintático 5. Faça o analisador léxico 6. Defina as regras de produção no arquivo do analisador sintático, deixando provisoriamente as regras semânticas em branco 7. Defina as regras semânticas usadas para inserir variáveis na tabela de símbolos 8. Faça a verificação de tipos das regras de produção que necessitarem 9. Defina o tipo de armazenamento a ser usado para o código intermediário: vetor fixo, vetor dinâmico ou lista ligada 10. Crie as funções auxiliares necessárias para concatenar dois fragmentos de código intermediário em um único 11. Crie as funções para gerar temporários e rótulos únicos 12. Defina as regras semânticas para gerar o código de 3 endereços de cada produção. 13. Implemente as otimizações básicas simples 14. Implemente a rotina que leia o vetor de código intermediário e escreva o programa em linguagem de montagem correspondente (código alvo). Prazos: 04/11/2010 – Analisador Léxico e Sintático com a inserção de dados na tabela de símbolos e Verificação de tipos 18/11/2010 – Geração do código intermediário 25/11/2010 – Otimizações simples de código 02/12/2010 – (Final) Geração de código alvo
  • 3. Obs.: A produção do if gera um conflito empilha/reduz: sel_decl → if ( expr ) statement | if ( expr ) statement else statement Para resolver o conflito é preciso dar uma precedência maior para o if … else. Isto pode ser feito no yacc definindo as precedências: %nonassoc menor_que_else %nonassoc eles no começo do arquivo e definindo a produção como: sel_decl : if '(' expr ')' statement %prec menor_que_else | if '(' expr ')' statement else statement ;