Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes...
-
Upload
luciana-medina-alencastre -
Category
Documents
-
view
224 -
download
5
Transcript of Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes...
![Page 1: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/1.jpg)
Teoria e Implementação de Linguagens Computacionais
Revisão 1º EE
André Ricardo Schäffer Lopes – [email protected]
Rodrigo Diego Melo Amorim– [email protected]
![Page 2: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/2.jpg)
Níveis de Linguagem
Linguagem de máquina 0000 0001 0011 0010 controle explícito dos endereços de memória dificuldade em ler, escrever, editar
Linguagem de Montagem Assembly language Uso de um programa montador (assembler)
Instruções têm relação direta com Linguagem de Máquina Linguagem de alto nível
Mais próxima da linguagem natural Uso de interpretadores ou compiladores
Várias instruções de máquina para cada linha de comando
![Page 3: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/3.jpg)
Processadores de Linguagens
Manipulam programas expressos em alguma linguagem de programação:
TradutoresCompiladores Interpretadores
![Page 4: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/4.jpg)
Tradutores e Compiladores
TradutorLinguagem fonte -> Linguagem destino
Chinês para inglêsJava para C
CompiladorLing. de alto nível -> Ling. de baixo nível
![Page 5: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/5.jpg)
Interpretadores
Recebem um programa fonte escrito em uma linguagem fonte, e o executam imediatamenteLê, analisa e executa as instruções, uma
de cada vez
![Page 6: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/6.jpg)
Compiladores x Interpretadores
Compiladores Tempo de espera pela compilação Execução dos programas com máxima
performance, em linguagem de máquina
Interpretadores Resultados imediatos
Sem a tradução do programa para código objeto antes da execução
Execução (de linguagem de alto nível) até 100 vezes mais lenta que a versão compilada
![Page 7: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/7.jpg)
Uso de interpretadores
Programador trabalha em modo interativo Quer ver o resultado de uma instrução antes de
entrar na próxima
Execução de instruções apenas um vez, ou raramente
Programas descartáveis Em que a velocidade de execução não é tão
importante
![Page 8: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/8.jpg)
Diagramas Tombstone
ProgramasPrograma P expresso na linguagem L
P
L
graph
Basic
sort
x86
sort
Java
![Page 9: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/9.jpg)
Diagramas Tombstone
MáquinasMáquina M
M
SPARCPPCx86
![Page 10: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/10.jpg)
Diagramas Tombstone
ExecuçãoPrograma P rodando na máquina M
P
M
M
sort
PPC
PPC
sort
PPC
x86X
![Page 11: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/11.jpg)
Diagramas Tombstone
TradutoresTradutor de S para T expresso na
linguagem L
S
L
T
Java
C
x86 Java
x86
x86
![Page 12: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/12.jpg)
Diagramas Tombstone
Tradução
Um programa fonte P expresso na linguagem S -> um programa objeto expresso na linguagem T, usando um tradutor de S para T executando na máquina M?
![Page 13: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/13.jpg)
Diagramas Tombstone
Tradução
P
S
P
TS
M
T
M
![Page 14: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/14.jpg)
Compilação em dois estágios
sort
Java
sort
CJava
x86
C
x86
C
x86
x86
x86
sort
x86
![Page 15: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/15.jpg)
Cross-Compiler
Roda em uma máquina hospedeira, mas gera código para outra máquinaUsado quando a máquina destino tem
pouca memória, não tem compilador ou outras ferramentas
![Page 16: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/16.jpg)
Exemplo
Cross-Compiler
sort
Java
sort
PPCJava
x86
PPC
x86
sort
PPC
PPC
![Page 17: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/17.jpg)
Diagramas Tombstone
Interpretador Interpretador de S expresso na linguagem L
S
L
SQL
x86
shell
C
Basic
x86
![Page 18: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/18.jpg)
Diagramas Tombstone
Interpretação
Um programa P expresso em uma linguagem S, usando um interpretador de S executando na máquina M?
![Page 19: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/19.jpg)
Diagramas Tombstone
S
M
P
S
M
![Page 20: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/20.jpg)
Interpretive Compiler
Características de interpretadores e compiladoresCompila para uma linguagem intermediária,
e interpreta esta linguagemSimples e rápido de traduzir para ela, e simples
e rápida de interpretar
Exemplo: Java, no JDK
![Page 21: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/21.jpg)
Java no JDK
Java
M
JVM JVM
M
Java
M
JVM
M
JVM
M
P
JVM
M
P
Java
P
JVM
![Page 22: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/22.jpg)
Máquina Real x Abstrata
Projeto de uma nova máquina “Ultima”Para testes: usar um interpretador
P
Ultima
Ultima
M
M
P
Ultima
Ultima
![Page 23: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/23.jpg)
Bootstrapping
Compilação de uma linguagem utilizando um compilador dessa mesma linguagemUtilizado para melhorar a eficiência de um
compiladorPrecisa de um compilador escrito em outra
linguagem que depois será descartado
![Page 24: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/24.jpg)
Bootstrapping versão 1
M
C
M
M
Ada-S
C
M
Ada-S
C
M Ada-S
M
M
![Page 25: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/25.jpg)
Bootstrapping versão 2
M
Ada-S
Ada-S
M
Ada-S
M
MAda-S
Ada-S
M
Inicia desenvolvimento
do novo compilador
Compilador antigo
Compilador novo
Ada-S
M
M
![Page 26: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/26.jpg)
Bootstrapping versão 2a
M
Ada-S
M
MAda-S
Ada-S
M
Compilador novo
Compilador +novo
Ada-S
M
M
Ada-S
Ada-S
MInicia desenvolvimento
do novo compilador
![Page 27: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/27.jpg)
Bootstrapping versão 3
M
Ada
Ada-S
M
Ada
Ada-S
M Ada
M
M
M
MAda-S M
Linguagem estendida
![Page 28: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/28.jpg)
Bootstrapping- melhorando a eficiência
Ada
Mslow
Mfast
Ada
Mslow
Mslow
Ada
Ada
Mfast
M
![Page 29: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/29.jpg)
Bootstrapping- melhorando a eficiência
Ada
Mslow
Mfast
M
P
Ada
P
Mfast
M
P
Mfast
![Page 30: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/30.jpg)
Bootstrapping- melhorando a eficiência
Ada
Mslow
Mfast
M
Ada
Ada
Mfast Ada
Mfast
Mfast
![Page 31: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/31.jpg)
Especificação de Linguagens
Sintaxe A forma do programa
Organização das frases Palavras reservadas
Semântica estática (Restrições contextuais) Regras de escopo e regras de tipo
Semântica Significado do programa
![Page 32: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/32.jpg)
O processo de Compilação
beginif x = 5 then... 1100111
0011100011
Código Fonte Compilador Programa
output+ params
![Page 33: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/33.jpg)
Fases de Compilaçãoab
stra
ção
implem
entação
Código fonte
Tokens e Lexemas
Árvoresintáticaabstrata
Códigomáquina
AST decorada
Análise Léxica
Análise SintáticaAnálise Semântica
Geração de Código
![Page 34: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/34.jpg)
Análise Léxica (Scanning)
Código fonte -> sequência de tokensSímbolos como identificadores, literais,
operadores, palavras-chave, pontuação etc.
if (n == 0) { return 1;} else { ...}
RPAR LCUR
RCUR
if LPAR
return
else
"n"id
"0"intLit
assign
"1"intLit comm
![Page 35: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/35.jpg)
Análise Sintática
Agrupa caracteres ou Tokens em uma estrutura hierárquica com algum significado
Responsável por determinar se uma dada cadeia de entrada pertence ou não à linguagem definida por uma gramática
int y = 0,k = 0;int x = y+++k;
A seguinte construção é válida?
![Page 36: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/36.jpg)
Gramáticas – descrevendo Linguagens
Gramáticas Livres de Contexto são utilizadas para descrever linguagens de programação
ProduçõesSímbolos terminaisSímbolos não-terminaisSímbolo inicial
![Page 37: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/37.jpg)
Exemplo
S → S ; SS → id := ES → print (L)E → idE → numE → E + EE → (S , E)L → EL → L , E
Terminais: id print , + ; := ( ) num Não terminas: S E L Símbolo inicial: S → é utilizado na notação de
produções
A cadeia seguinte pertence à gramática?
a := 7;b := c + (d := 5 + 6, d)
![Page 38: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/38.jpg)
Derivações
S S ; S S ; id := E id := E ; id := E id := num ; id := E id := num ; id := E + E id := num ; id := E + (S, E) id := num ; id := id + (S, E) id := num ; id := id + (id := E, E) id := num ; id := id + (id := E + E, E) id := num ; id := id + (id := E + E, id) id := num ; id := id + (id := num + E, id) id := num ; id := id + (id := num + num, id)
![Page 39: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/39.jpg)
Parse treeS
SS
E
Eid :=;
E:=id
id
+ E
)( , ES
Eid := id
EE +
num num
num
Construída conectando cada derivação à sua origem.
Obs. Na prática não é implementada pelos compiladores.
![Page 40: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/40.jpg)
Gramática Ambígua
A partir dela uma sentença pode dar origem a mais de uma árvore de parsing diferente
Indeterminismo é problemático para a compilação
Eliminação de ambigüidade
Refatoração da gramática
![Page 41: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/41.jpg)
Exemplo
x := 1 + 2 + 3;
S
Eid :=
E + E
E + E num
num num
S
Eid :=
E + E
E + Enum
num num
![Page 42: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/42.jpg)
Refatoração
S → S ; SS → id := ES → print (L)E → idE → numE → E + EE → (S , E)L → EL → L , E
S → S ; SS → id := ES → print (L)E → idE → numE → E + TE → TE → (S , E)L → EL → L , E
![Page 43: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/43.jpg)
Parsers
Avaliam uma entrada quanto à sintaxePodem ser
Top-down Recursive-descent / LL(k)
Bottom-up LR(k)
![Page 44: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/44.jpg)
Recursive descent parser
Algoritmo baseado em previsões
Funções mutuamente recursivas
Simples implementaçãoUma função para cada não-terminalUma cláusula para cada produçãoVerifica o primeiro símbolo terminal para
decidir qual função usar
![Page 45: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/45.jpg)
Exemplo
A ::= aBcC
B ::= CB | cC
C ::= da
parseA() { accept(‘a’); parseB(); accept(‘c’); parseC();}
parseB() { case (d): parseC(); parseB(); case (c): accept(‘c’); parseC();}
parseC() { accept(‘d’); accept(‘a’); }
![Page 46: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/46.jpg)
Recursive descent parser
Na prática, constrói uma tabela de produções indexadas por não-terminais e terminais
A ::= aBcC
B ::= CB | CA
C ::= da
a c d
A A::= aBcC
B B::= CBB::= CA
C C::= da
![Page 47: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/47.jpg)
Recursive descent parser
VantagensFácil de implementarFácil de entender
DesvantagensPerformance deficienteGramática reconhecida possui restrições
Sem recursão à esquerdaDeve estar fatorada
![Page 48: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/48.jpg)
Recursive descent parser
A ::= aBcC
B ::= CB | CA
C ::= da
A ::= aBcC
B ::= CX
X ::= B | A
C ::= da
a c d
A A::= aBcC
B B::= CX
C C::= da
X X::=A X::=B
GramáticaLL(k)
![Page 49: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/49.jpg)
Parsers LL(k)
Gramáticas SEM entradas duplicadas na tabela são conhecidas como LL(k)
LL(1) -> Left-to-right, leftmost-derivation, 1-symbol lookahead Left-to-right – direção na qual os símbolos serão examinados Leftmost-derivation – ordem pela qual os símbolos não-
terminais serão expandidos 1-symbol lookahead – não mais que um símbolo será
avaliado por vez
Também existem LL(2), LL(3),... Toda LL(1) é LL(2), toda LL(2) é LL(3),... LL(k)
![Page 50: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/50.jpg)
Recursão à esquerda
Gramáticas LL(1) são vulneráveis a entradas duplicadas. Por exemplo, o fragmento a seguir:
E → E + TE → T
O fato de E aparecer no início do lado direito da produção é a causa do problema. Isso é conhecido como Recursão à Esquerda. Para corrigir, precisamos refatorar a gramática com Recursão à Direita:
E → T E´E´ → +T E´ E´ →
![Page 51: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/51.jpg)
Parsers LR(k)
Supera as fraquezas de LL(k) LR(1) -> Left-to-right, rightmost-derivation, 1-
symbol lookahead
Uso de uma pilha para armazenar símbolos de forma temporária
Possui duas operações, shift e reduce shift - move o primeiro símbolo para o topo da pilha reduce - escolhe uma regra da gramática do tipo X→A B
C. pop C B A da pilha e push X.
![Page 52: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/52.jpg)
Parsing LR- de Gramáticas Ambíguas
Gramáticas ambíguas ocasionam conflitos em parsers LR
Shift-reduce conflictO parser não consegue decidir se empilha o
próximo símbolo da entrada, ou se reduz para uma regra já disponível
Reduce-reduce conflictO parser pode realizar uma redução para duas
regras distintas
![Page 53: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/53.jpg)
Parsing LR- de Gramáticas Ambíguas
Dangling-else
if a then if b then s1 else s2
if a then { if b then s1 else s2 }
if a then { if b then s1 } else s2
?
![Page 54: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/54.jpg)
Parsing LR- de Gramáticas Ambíguas
Solução:Transformar a gramática
Introdução dos conceitos de matched e unmatched
S ::= 'if' E 'then' S 'else' SS ::= 'if' E 'then' SS ::= ...
S ::= M | U
M ::= 'if' E 'then' M 'else' M | ...
U ::= 'if' E 'then' S | 'if' E 'then' M 'else' U
![Page 55: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/55.jpg)
Análise Semântica (Contextual)
Verifica se o programa está de acordo com as restrições contextuais da linguagem fonte
Em uma linguagem com tipos estáticos e ligação estática ela: Verifica regras de escopo Verifica regras de tipos
Duas fases: Identificação: ocorrências de nomes x definições Verificação de tipos: aplica regras de tipos para
cada expressão, inferindo os tipos, e depois compara com os tipos esperados
![Page 56: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/56.jpg)
Identificação
Faz a ligação entre uso de nomes e sua definição
Tabela de identificação (tabela de símbolos), com nome e atributos de cada identificador
Cada definição tem o seu escopo – parte do programa sobre a qual ela tem efeitoDelimitado por um bloco
![Page 57: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/57.jpg)
Estrutura de blocosde um programa
Monolítica:O único bloco é o programa inteiro
Declarações estão em um escopo globalRegras de escopo:
Nenhum identificador pode ser declarado mais de uma vez
Nenhum identificador pode ser usado sem ter sido definido
![Page 58: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/58.jpg)
Estrutura de blocosde um programa
PlanaO programa pode ser particionado em
vários blocos disjuntosDois níveis de escopo:
Escopo local: ocorrências de identificadores declarados localmente são restritos a um bloco em particular
Outras declarações têm escopo global
![Page 59: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/59.jpg)
Estrutura de blocosde um programa
Aninhada Blocos podem ser aninhados um dentro do
outroVários níveis de escopo:
Declarações no nível mais externo têm escopo global (nível 1)
Declarações dentro de um bloco interno são locais ao bloco
Cada bloco está dentro de outro bloco, com um nível a mais
![Page 60: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/60.jpg)
Passos
Travessia do programa fonteUm compilador de um passo atravessa o
programa uma única vezUm compilador de múltiplos passos faz
várias travessias
O projeto de um compilador é diretamente relacionado ao número de passos
![Page 61: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/61.jpg)
Compilação em múltiplos passos
Módulo principal (driver)Chama cada um dos passos
Driver do Compilador
Analisador Sintático Analisador Contextual Gerador de Código
![Page 62: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/62.jpg)
Compilação em passo único
Analisador sintáticoRealiza/chama as atividades à medida que
lê e reconhece o programa
Analisador Sintático
Analisador Contextual Gerador de Código
Driver do Compilador
![Page 63: Teoria e Implementação de Linguagens Computacionais Revisão 1º EE André Ricardo Schäffer Lopes – arsl@cin.ufpe.brarsl@cin.ufpe.br Rodrigo Diego Melo Amorim–](https://reader031.fdocumentos.com/reader031/viewer/2022020801/5706385d1a28abb8238fdfa6/html5/thumbnails/63.jpg)
Pontos relevantesno Projeto de um Compilador
Velocidade – possível vantagem para um passo Espaço – possível vantagem para um passo
(dados x programa) Modularidade – vantagem de múltiplos passos Flexibilidade – vantagem de múltiplos passos Transformações/otimizações de programas
– vantagem de múltiplos passos