Escolar Documentos
Profissional Documentos
Cultura Documentos
de Reconhecedores
Representações
Gramática
Gramática
Reconhecedor
Reconhecedor
Linguagem
Núcleo
Núcleodo
do
compilador
compilador
Obtenção
Gramática
Gramática
Mapeamento
Mapeamentocanônico
canônico Otimizações
Otimizações
Reconhecedor
Reconhecedor
Canônico
Canônico
Manual
Manual Automático
Automático Manuais
Manuais Automáticas
Automáticas
Reconhecedor
Reconhecedor
Eficiente
Eficiente
aula 06 – página 1 de 8
Preparação
Gramática
Gramática Gramática
Gramática
Original
Original Preparada
Preparada
Manipulação
ManipulaçãoGramatical
Gramatical
Transformações Mapeamentos
Mapeamentos
Transformações
Mudanças
Mudançasde
deNotação
Notação
A construção de reconhecedores
• O problema geral apresenta alta complexidade
• Isto leva a implementações de alto custo
• Compromisso: restrição a gramáticas de tipos 3 e 2
• Os reconhecedores podem ser:
– não-determinísticos (descendentes ou ascendentes)
» técnica de backtracking
» tentativa e erro
» exaustivo
» ineficiente
– determinísticos
» top-down (descendentes)
» bottom-up (ascendentes)
» híbridos
aula 06 – página 2 de 8
Reconhecedores determinísticos
• Reconhecedores descendentes (top-down)
– São simples e eficientes
– Aplicam-se às linguagens livres de contexto LL(k)
– Métodos usualmente utilizados:
» Descendente recursivo
• Fatoração e Não-recursividade à esquerda
• Mapeamento direto das gramáticas em programas
» LL(k)
• Gramáticas não-ambíguas
• Usam o estado e k símbolos de look-ahead para determinar a produção a aplicar
Gramáticas LL(k)
• LL(k) significa:
– left to right analysis
– leftmost derivation
– k-symbol look-ahead
• Sendo A → α e A → α’ produções da gramática
se S =>* βAγγ1 =>* βα γ1 =>* βα1α2γ1
e S =>* βAγγ2 =>* βα’γγ2 =>* βα1α3γ2
α1|=k e α1 formado apenas de terminais
com |α
então A → α é dita uma produção LL(k)
• Gramáticas LL(k) devem ter todas as produções LL(k)
• Todas as gramáticas LL(k) podem gerar reconhecedores
determinísticos
• Linguagens LL(k) nunca são ambíguas
• Nunca há recursões à esquerda em gramáticas LL(k)
aula 06 – página 3 de 8
Eliminação de Recursões à Esquerda
Α → ΑΘ1 | ΑΘ2 | ϕ1 | ϕ2
• substituir por:
Α → ϕ1 Β | ϕ2Β
Β → Θ1 Β | Θ2 Β | ε
Fatoração
Α → aα
α | aβ
β
• substituir por:
Α → aΒ
Β →α|β
1.
1.Eliminação
Eliminaçãode
derecursões
recursões
ààesquerda e fatoração
esquerda e fatoração
aula 06 – página 4 de 8
Análise Descendente Recursiva
S→→
→TX
S→ TX
→
X→
X→→+TX
+TX
→ε
X→ε
→ε
X→ε
T→→
→FY
T→ FY
→
Y→
Y→→*T
*T
→ε
Y→ε
→ε
Y→ε
F→→
→aa
F→
F→→
→(S)
F→ (S)
Mapeamento
Mapeamentodireto
diretodas
dasproduções
produçõesem
emfunções
funçõesbooleanas
booleanas
Boolean
BooleanProcedure
ProcedureAvança;
Avança; Programa
Begin ProgramaPrincipal:
Principal:
Begin Entrada:=próximoátomo
Entrada:=próximo átomode
deentrada;
entrada; ififSS then
Aponta then OK
OK
Aponta o átomo de entradaseguinte;
o átomo de entrada seguinte; else
Avança:=true;
Avança:=true; End;
End; else erro
errode
desintaxe
sintaxe
Boolean
BooleanProcedure
Procedure S;
S; Boolean
BooleanProcedure
ProcedureY; Y;
S:= if T
S:= if T Y:=
Y:=ififentrada=“
entrada=“*””
→ * T Y→ →
thenXX S→
then S→→TX
TX then
thenavança
avançaand →*T
and T Y→ *T
else false;
else false; else
elsetrue; →ε
true;Y→ε
→ε
Y→ε
Boolean
BooleanProcedure
ProcedureX; X; Boolean
BooleanProcedure
ProcedureF; F;
X:=if entrada=“+”
X:=if entrada=“+” F:=if entrada=“a”
F:=if entrada=“a”
then
thenififavança
avançaand
andTT then avança F→
thenavança →
F→→aa
thenXX X→
then →
X→→+TX
+TX else if entrada=“(”
else if entrada=“(”
else false then
thenififSSand
andavança
avança
else false then
thenififentrada=“)”
entrada=“)”
else
elsetrue; →ε
X→ε
→ε
X→ε →
true; then true FF→
thentrue →(S)
(S)
else false
else false
Boolean
BooleanProcedure
ProcedureT;T; else
elsefalse;
false;
T:=if F then Y else false; →
T:=if F then Y else false;T→
→FY
T→ FY
aula 06 – página 5 de 8
Dado a gramática:
S → TX
X → +TX
X → ε
T → F*T
T → F
F → a
F → (S)
% RECONHECEDOR "TOP-DOWN" em MATLAB
global Posicao
Posicao = 1;
if Proc_S(Arquivo,Posicao)
disp('compilacao correta')
else
disp('erro de compilacao')
end
fclose( 'all' );
%Proc_S.M
function retorno = Proc_S(Arquivo,Posicao)
global Posicao
if ~( Proc_T (Arquivo,Posicao) )
retorno = 0;
else
if ~( Proc_X (Arquivo,Posicao) )
retorno = 0;
else
retorno = 1;
end
end
%Proc_X.M
function retorno = Proc_X(Arquivo,Posicao)
global Posicao
if Arquivo(Posicao)== '+'
Posicao = Posicao + 1;
retorno = Proc_S (Arquivo,Posicao);
else
retorno = 1;
end
aula 06 – página 6 de 8
%Proc_T.M
function retorno = Proc_T(Arquivo,Posicao)
global Posicao
if ~( Proc_F (Arquivo,Posicao) )
retorno = 0;
else
if Arquivo(Posicao) == '*'
Posicao = Posicao + 1;
retorno = Proc_T (Arquivo,Posicao);
else
retorno = 1;
end
end
%Proc_F.M
function retorno = Proc_F(Arquivo,Posicao)
global Posicao
if Arquivo(Posicao) == 'a'
Posicao = Posicao + 1;
retorno = 1;
else
if Arquivo(Posicao) == '('
Posicao = Posicao + 1;
if Proc_S (Arquivo,Posicao)
if Arquivo(Posicao) == ')'
Posicao = Posicao + 1;
retorno = 1;
else
retorno = 0;
end
else
retorno = 0;
end
else
retorno = 0;
end
end
% LE_ARQ.M
function [Arquivo, Tamanho] = le_arq( FID )
j = 0;
while feof(FID) ~= 1,
S = fgets(FID);
for i = 1:max(size(S));
j = j + 1;
Arquivo(j) = S(i);
end
end
aula 06 – página 7 de 8
EXERCÍCIOS
1) Dado o algoritmo abaixo que realiza um reconhecedor sintático "top-down", determine qual a
gramática associada na forma de regras de produção. O símbolo "~" denota NOT e "|" denota OR.
A variável Posição aponta para os caracteres do arquivo fonte.
if X
disp('compilacao correta')
else
disp('erro de compilacao')
end
function X
if ~(P)
return(0);
else
if Caracter == ';'
return(1);
else
return(X);
end
end
function P
if ~(Caracter == 'I')
return(0);
else
Posicao = Posicao + 1;
if ~(Caracter == '>')
return(0);
else
Posicao = Posicao + 1;
if ~(Caracter == 'I'| Caracter == 'T'| Caracter == 'E')
return(0);
else
Posicao = Posicao + 1;
if ~(Caracter == '.')
return(0);
else
Posicao = Posicao + 1;
if ~(Caracter == '(')
return(1);
else
Posicao = Posicao + 1;
if ~(Caracter == 'I')
return(0);
else
Posicao = Posicao + 1;
if ~(Caracter == ')')
return(0);
else
retorno = 1;
Posicao = Posicao + 1;
end
end
end
end
end
end
end
aula 06 – página 8 de 8