Upload
internet
View
109
Download
1
Tags:
Embed Size (px)
Citation preview
Análise Sintática - Continuação
Profa. Heloise Manica Paris Teixeira
Parte 3
Slides cedidos pela Prof. Valéria Feltrin (DIN-UEM)
Análise sintática
Descendente(Top-down)
Ascendente(Bottom-up)
Com retrocesso(back track)
Sem retrocesso(preditive)
Analisadores SintáticosDo símbolo de partida para
a sentença Da sentença para o simbolo de partida
Um analisador preditivo tenta prever a construção seguinte da cadeia de entrada com base em uma ou mais marcas de verificação à frente
Análise sintática Descendente Sem Retrocesso (Preditiva)
ASD Preditiva
• ASD preditiva– Sabe-se de antemão qual regra aplicar
• Algoritmos:– LL(1)
• O primeiro “L” se refere ao fato de o processamento ocorrer da esquerda para a direita (Left)
• O segundo “L” se refere ao fato de o analisador acompanhar uma derivação à esquerda para a cadeia de entrada.
• O número (1) significa que é usado um símbolo da entrada para prever a direção da análise.
– LL(1)Recursivo
• Ambos algoritmos exigem, em geral, a computação dos conjuntos de verificação Primeiro (First) e de Seqüência (Follow)
ASD Preditiva Recursiva
• Um analisador sintático recursivo é um conjunto de procedimentos possivelmente recursivos, um para cada não terminal a ser derivado
– Também chamado de analisador de “descida recursiva”
– Cada regra gramatical para um A não terminal é vista como uma definição de um procedimento, em que o lado direito de A especifica o código para esse procedimento
ASD preditiva recursiva• Exemplo
E T + E | T
T F * T | F
F a | b | (E)
procedimento ASDinício prox_token(); E;fim
procedimento Einício T; se (token='+‘) então prox_token(); E;fim
procedimento Tinício F; se (token =‘*‘) então prox_token(); T;fim
procedimento F início se ( token ='(‘ ) então prox_token(); E; se (token =')‘) então prox_token() senão ERRO; senão se (token =‘a‘) ou (token =‘b‘) então prox_token() senão ERRO; fim
ASD preditiva recursiva
• Método formal para gerar os procedimentos– Regras de transformação: mapeamento das regras de
um não terminal em grafos sintáticos• Também podem ser usados diagramas de transição
(Aho et al., 1995, pg82)– Regras de tradução: mapeamento dos grafos em
procedimentos
• ExemploS aAd A cA | eBB f | g
a AS:
Símbolo terminal
Símbolo não terminal
Grafo sintático
ASD preditiva recursiva
S aAd
procedimento S início se (token =‘a’) então prox_token(); A; se (token =‘d’) então prox_token() senão ERRO; senão ERRO;fim
a A dS
ASD preditiva recursiva
A cA | eB
procedimento A início se (token =‘c’) então prox_token(); A; senão se (token =‘e’) então prox_token(); B; senão ERRO;fim
c AA
e B
ASD preditiva recursiva
B f | g
procedimento B início se (token =‘f’) ou (token =‘g’) então prox_token() senão ERRO;fim
fB
g
ASD preditiva recursiva• Programa principal
procedimento ASDinício prox_token(); S; se (terminou_cadeia) então SUCESSO senão ERROfim
Geralmente, concatenamos um símbolo $ no fim da cadeia antes do seu reconhecimento.
terminou_cadeia é a verificação da condição token = $
ASD preditiva recursiva
• Regras de transformação– Regras gramaticais grafos sintáticos
1. Toda regra da gramática é mapeada em um grafo
2. Toda ocorrência de um terminal x corresponde ao seu reconhecimento na cadeia de entrada e a leitura do próximo símbolo dessa cadeia
x
ASD preditiva recursiva3. Toda ocorrência de um não-terminal A
corresponde a análise imediata de A
4. Alternativas são representadas como
A
A
B
C
ASD preditiva recursiva
5. Uma seqüência A B C é mapeada em
6. A forma A* é representada por
A B C
A
ASD preditiva recursiva
• Exercício: Faça o grafo sintático da gramática abaixo:
A x | (B)B AC C +AC | ε
( B )
Ax
BA C
CA+ C
ASD preditiva recursiva
• Os grafos sintáticos podem ser simplificados
• transformar chamadas recursivas em loops
– Os grafos simplificados devem ser equivalentes aos grafos originais
– As simplificações nos grafos vão se refletir no código gerado para cada grafo
ASD preditiva recursiva
• Exemplo:
• Simplifique o grafo abaixo para C +AC | ε
CA+
CA+ C
ASD preditiva recursiva
• Regras de tradução– Grafos sintáticos procedimentos
1. Reduzir o número de grafos: união de grafos para maior simplicidade e eficiência
ASD preditiva recursiva
• Faça a união dos grafos abaixo. Se possível, simplifique após a união.
ET E’
E’
T
+
T
+E
T
+E
T
ASD preditiva recursiva 2. Escrever um procedimento para cada grafo
• A seqüência
origina o procedimentoinício
A;B;C;
fim
A B C
ASD preditiva recursiva
• A alternativa
origina o procedimento início
se (token está em Primeiro(A)) então Asenão se (token está em Primeiro(B)) então Bsenão se (token está em Primeiro(C)) então C
fim
A
B
C
ASD preditiva recursiva
• Uma repetição
origina o procedimento início
enquanto (token está em Primeiro(A)) façaA;
fim
A
ASD preditiva recursiva
• O terminal
origina
iníciose (token = x)
então prox_token()senão ERRO;
fim
x
ASD preditiva recursiva• O não terminal
origina
início
A;
fim
A
ASD preditiva recursiva• Exercício: fazer o(s) procedimento(s) para os
grafos sintáticos– Se possível, reduza o no de grafos
( B )
Ax
BA C
C A+
ASD preditiva recursiva
( B )
Ax
C A+
BA C
( B )
Ax
+
A
Redução dos grafos
ASD preditiva recursiva
Redução dos grafos
( )
Ax
+
A
( B )
Ax
+
A
ASD preditiva recursivaprocedimento Ainício
se (token =‘x’) então prox_token()senão se (token =‘(‘) então
façaprox_token();A;
até (token <>’+’);se (token =‘)’)
então prox_token()senão ERRO;
senão ERRO;fim
( )
Ax
+
A