1 / 13

Análise Sintática Ascendente

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:

verdi
Download Presentation

Análise Sintática Ascendente

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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.

  2. Análise Sintática Ascendente Exemplo: Seja a gramática de Expresssões, anteriormente definida: 1. E  T 2. | E + T 3. |T Supondo a cadeia a + b * a,teríamos que aplicar reduções até obter a cadeia de entrada. 4. T  F 5. | T * F 6. F  a 7. | b 8. | (E)

  3. 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.

  4. 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.

  5. 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)

  6. 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.

  7. 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 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. 4 - B -> bB 5 - B -> cB 6 - B -> d

  8. 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

  9. 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 d a 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.

  10. 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.

  11. 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.

  12. 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.

  13. 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

More Related