Análise Sintática

Download Report

Transcript Análise Sintática

Análise Sintática Ascendente
O Algoritmo inicia a leitura do programa fonte, da esquerda para a
direita, varre as diferentes hipóteses e obtém a árvore de derivação. É claro
que a cadeia só é reconhecida quando atinge-se o símbolo inicial da gramática.
Algoritmo:
1. Adotar a cadeia dada como valor inicial de a
2. Procura-se decompor a de forma que a = bX1X2...Xng, existindo
uma produção da forma X = X1X2...Xn, chegamos a = bXg. O
significado é associar ao não terminal X e as subárvores são as
ocorrências de X1X2...Xn, que foram substituídas. Se Xi é um
terminal, a árvore associada será uma folha de rótulo Xi.
3. Repete-se o passo anterior até que a seja o símbolo inicial da
gramática.
CC 1 - ANÁLISE SINTÁTICA - FUNDAMENTOS
Análise Sintática Ascendente
Exemplo:
Seja a gramática de Expresssões, anteriormente definida:
1. E  T
4. T  F
7. | b
2. | E + T
5. | T * F
8. | (E)
3. |T
6. F  a
Supondo a cadeia a + b * a, teríamos que aplicar reduções até obter
a cadeia de entrada.
CC 1 - ANÁLISE SINTÁTICA - FUNDAMENTOS
Análise Sintática Ascendente
Observações:
Procuramos as reduções mais à esquerda, obtém-se as derivações
mais à direita que formam a cadeia;
Nem sempre as reduções são triviais e levam à uma sequência
válida;
Considerando o item anterior, o algoritmo deveria varrer todas as
hipóteses possíveis, retrocedendo, se necessário.
O algoritmo ideal sabe qual redução escolher - aplicável a um
número menor de gramáticas.
CC 1 - ANÁLISE SINTÁTICA - FUNDAMENTOS
Análise Sintática Ascendente
Problemas da Análise Ascendente:
 identificação da parte a a ser reduzida;
 identificação da produção a ser associada adequadamente à
redução. Assim, em uma gramática onde existam produções do tipo
Ab
B  b, o programa tem de saber qual produção deve ser
aplicada para redução
 há algoritmos que usam o mecanismo de redução diferente.
CC 1 - ANÁLISE SINTÁTICA - FUNDAMENTOS
Análise Sintática Descendente
Princípios Básicos:
- Parte-se do axioma da gramática, para chegar à sentença a ser
verificada: se esta sentença estiver correta do ponto de vista
gramatical, ela é reconhecida;
- Eqüivale à construir a árvore de derivação para a sentença, a partir
da raiz e obter nas folhas os símbolos da sentença;
- Quando as folhas representam os símbolos terminais relativos à
cadeia de entrada, a mesma foi reconhecida.
No curso: - Análise Descendente com Retrocesso
- Análise Descendente Recursiva
- Análise LL(k)
CC 1 - ANÁLISE SINTÁTICA - FUNDAMENTOS
Análise Descendente com Retrocesso
Um dos primeiros métodos para Análise Sintática
 Apresenta grandes ineficiências quanto à utilização de memória e
tempo
O processo é tipicamente exploratório: tenta-se a derivação mais à
esquerda para obter uma dada cadeia de entrada, através da
exploração: no caso de haver várias regras com o mesmo lado
esquerdo e diferentes lados direitos, ele escolhe uma e continua a
análise; caso tenha escolhido mal, ele seleciona outra possibilidade e
continua o processo
O processo termina quando não existem mais alternativas ou
quando a cadeia foi reconhecida.
CC 1 - ANÁLISE SINTÁTICA - FUNDAMENTOS
Análise Descendente com Retrocesso
Suponhamos a gramática dada por G = (Vn, Vt, {S}, P)
onde Vn = {S, A, B}, Vt = {a, b, c, d}, onde P é dado por:
1 - S -> A
2 - A -> a
3 - A -> aB
4 - B -> bB
5 - B -> cB
6 - B -> d
Quais seriam as tentativas executadas pelo parser para reconhecer
a cadeia abcd ?
Obs: a partir do exemplo, observa-se que o problema passa a ser
como fazer para evitar retrocessos na análise: conhecido o
próximo símbolo da cadeia e qual o não terminal a ser derivado,
determinar exatamente qual regra da Gramática deve ser aplicada.
CC 1 - ANÁLISE SINTÁTICA - FUNDAMENTOS
Análise Descendente com Retrocesso
Suponhamos a gramática dada por G = (Vn, Vt, {S}, P)
onde Vn = {S, A}, Vt = {a, b, c, d}, onde P é dado por:
1 - S -> cAd
2 - A -> ab
3 - A -> a
O processo de construção top-down para a cadeia ‘cad’ seria:
- fazemos S como nossa árvore inicial, c é o primeiro símbolo de a
- usando a primeira produção possível para S obtém-se a árvore:
S
c
A
d
CC 1 - ANÁLISE SINTÁTICA - FUNDAMENTOS
Análise Descendente com Retrocesso
Como c corresponde ao primeiro símbolo de a, então, uma
posição é avançada, ficando o ponteiro apontando para ‘a’, e o não
terminal ‘A’. A tentativa abaixo pode ser efetuada:
S
c
A
a
d
b
Agora, na leitura do próximo símbolo ‘d’ não há reconhecimento,
deve-se voltar ao símbolo A e tentar nova regra de produção que
permita o reconhecimento, e assim, sucessivamente.
CC 1 - ANÁLISE SINTÁTICA - FUNDAMENTOS
Análise Descendente com Retrocesso
Observações:
- possibilidade de loop infinito para produções com recursão à
esquerda
- backtracking: uma seqüência de expressões errôneas, capaz de
gerar uma má cadeia, leva a uma nova tentativa e à perda do efeito
semântico da tentativa errada;
- a ordem das substituições podem afetar a aceitação da cadeia, por
exemplo, no caso anterior, se tivéssemos tentado expandir A para a
e reconhecido A, o parser falharia na tentativa de reconhecimento.
CC 1 - ANÁLISE SINTÁTICA - FUNDAMENTOS
Análise Descendente Recursiva
Precisamos saber, dado o símbolo de entrada a e o não
terminal A a ser expandido, qual das alternativas da produção
A  a1| a2| ... |an é a única alternativa que deriva uma cadeia
começando por a
Se uma alternativa de A é l, e nenhuma das outras alternativas
deriva da cadeia começando com a, então podemos expandir
A  l aceitando a entrada a.
O parser recursivo descendente é um conjunto de procedimentos
recursivos, um para cada não terminal a ser derivado.
CC 1 - ANÁLISE SINTÁTICA - FUNDAMENTOS
Análise Descendente Recursiva
Restrições a este tipo de análise:
- gramáticas não recursivas à esquerda, com produções A
Aa;
- não possuindo mais que um lado direito de um não terminal começando
por um mesmo terminal;
Exemplo:
< programa> := <declarações> <bloco> .
procedure programa;
begin
declarações;
bloco;
lexico(x);
if (x = ‘.’) then write (“Programa Sintaticamente Correto”;
else write (“Erro de Sintaxe”);
end.
CC 1 - ANÁLISE SINTÁTICA - FUNDAMENTOS
Análise Descendente Recursiva - Implementação
Método: Diagrama Sintático -> Procedimento
Conseqüência: 1 Gramática -> 1 Programa
Não-terminal -> Grafo -> Procedimento
Exemplo: Seja a gramática dada por:
S -> aAd
A -> cA | eB
B -> f | g
CC 1 - ANÁLISE SINTÁTICA - FUNDAMENTOS