Você está na página 1de 8

Técnicas de Construção

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

• Reconhecedores ascendentes (bottom-up)


– São mais complexos
– Aplicam-se a todas as linguagens livres de contexto determinísticas
– Cobrem portanto todas as linguagens LL(k)
– Método: LR(k)
• Usam também k símbolos de look-ahead para efetuar decisões

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Β
Β →α|β

Análise Descendente Recursiva


S tem recursão
à esquerda
S→→
→TX
S→ TX

S→
S→→S+T
S+T →
X→
X→ +TX
→+TX
S→→
→TT
S→ F pode ser posto
X e Y: novos →ε
X→ε
→ε
X→ε
não-terminais
T→→
→F*T
T→ F*T em evidência T→→
→FY
T→ FY
T→→
→FF
T→ →
Y→
Y→ *T
→*T
F→→
→aa
F→ →ε
Y→ε
→ε
Y→ε
F→→
→(S)
F→ (S) F→→
→aa
F→
F→→
→(S)
F→ (S)

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

IN = fopen( 'c:\LL1.txt', 'r' );

[Arquivo, Tamanho] = le_arq( IN );

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

Arquivo(j+1) = ' ';


Tamanho = max(size(Arquivo));

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.

fopen( 'fonte.txt', 'r' ); // programa


principal

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

Você também pode gostar