Análise Sintática Descendente Analisador Sintático Construção de Compiladores Aula 17 - Análise Sintática Descendente Bruno Müller Junior Departamento de Informática UFPR 3 de Novembro de 2014 Bruno Müller Junior Departamento de Informática UFPR Construção de Compiladores Aula 17 - Análise Sintática Descendente
28
Embed
Construção de Compiladores Aula 17 - Análise Sintática ... · Análise Sintática Descendente Analisador Sintático Construção de Compiladores Aula 17 - Análise Sintática
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
1 Análise Sintática DescendenteEliminação de retrocessos
Converter para a Forma Normal de GreybachExemplo de gramática na FNGAnalisar o primeiro símbolo que uma variável pode derivarCálculo do PrimeiroAplicação do Algoritmo (1/2)Aplicação do Algoritmo (3.1)Aplicação do Algoritmo (3)Aplicação do Algoritmo (3.2)Aplicação do Algoritmo (3)Resultado
FatoraçãoExemploObservações
Eliminação da recursão à esquerdaArgumentação da validade da transformaçãoExercício
2 Analisador SintáticoGeração de ProgramasExemploExemploExemploExemploExemploExercício
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Existe mais de uma forma de eliminar retrocessos:Converter a gramática para a Forma normal de Greibach;Analisar o primeiro símbolo que uma variável pode derivar;
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Com uma gramática neste formato não há dúvidas sobre qualderivação usar quando tiver um token.Veja com α = +a ∗ ba (é linear).Não é adotado pois a transformação de uma gramática para aFNG gera um grande número de produções, e não é linear.
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
O primeiro símbolo terminal (ou só “Primeiro”) de cadavariável pode ser obtido com o seguinte algoritmo:
1 Desenhe uma tabela com quatro colunas;2 Preencha as linhas da primeira coluna com as variáveis;3 Preencha as linhas da segunda coluna com os terminais ou
variáveis que podem ser obtidos em uma derivação.4 Preencha a terceira coluna com o fecho transitivo da segunda;5 Copie os terminais da terceira coluna para a quarta coluna.
A quarta coluna contém os terminais válidos de cada variável.
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Primeiro (S) = adbcPrimeiro (A) = acPrimeiro (B) = dbPrimeiro (C) = cAgora já é possível fazer a análise sintática com complexidadeO(n). Verifique com a entrada α = ”abcdad”
S → AS |BAA → aB|CB → bA|dC → c
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
O símbolo ε (epsilon) indica a cadeia vazia.Não é um símbolo de entrada.Tanto a notação de G2 e de G3 são válidas, porém iremosadotar G2 por ser mais sintética.Observe que em G2 foi inserido os símbolo “[“ e “]”, quedelimitam a parte fatorada. Não precisa ser este, mas nãopode ser um token válido da linguagem (como por exemplo “(“e “)” de G1.
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
A transformação aplicada para eliminar a recursão à esquerdapode ser demonstrada formalmente, porém iremos sóargumentar:
No caso transformado (A→ β{α}), é fácil de ver que aspalavras válidas são β, βα, βαα, βαα · · ·α.Já a produção A→ Aα|β mostramos que também gera amesma linguagem montando a árvore de derivação.
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
As transformações acima permitem transformar umagramática de G1 em uma gramática G2 apropriada para ASDR.A partir de G2 existem duas formas básicas de construir oanalisador sintático: tabelas e programa equivalente.Como o método de tabelas será abordado na análise sintáticaascendente (LR), vamos descrever a geração de programas.
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Seja Gd uma gramática. Gere uma gramática G ′d aplicando os
seguintes passos:Aumente a gramática (S ′ → S#).Fatore a gramática;Elimine recursão à esquerda;Determine o Próximo para cada variável.A partir de G ′
d , escreva um programa onde:1 Cada variável é mapeada como uma subrotina;2 Em cada produção, faça:
ao encontrar uma variável, implemente como uma chamadada subrotina correspondenet:ao encontrar um token, consuma o token e procure pelopróximo token da entrada (analisador Léxico).
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente