Construção de Compiladores Aula 17 - Análise Sintática ... · Análise Sintática Descendente...
Transcript of Construção de Compiladores Aula 17 - Análise Sintática ... · Análise Sintática Descendente...
Análise Sintática Descendente Analisador Sintático
Construção de CompiladoresAula 17 - Análise Sintática Descendente
Bruno Müller Junior
Departamento de InformáticaUFPR
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
Análise Sintática Descendente Analisador Sintático
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
Análise Sintática Descendente Analisador Sintático
Análise Sintática Descendente
Esquema básico (com retrocessos);Melhoramentos:
Eliminação de retrocessos;Fatoração;Eliminação da recursão à esquerda;
Geração de Programa
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Eliminação de retrocessos
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
Análise Sintática Descendente Analisador Sintático
Eliminação de retrocessos
Análise Sintática Descendente
A FNG é caracterizada quando todas as produções de umagramática estão no seguinte formato:
{A → a}{A → X1α|X2α| . . .}
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Eliminação de retrocessos
Análise Sintática Descendente
Exemplo:
{E → +EEE → ∗EEE → aE → b}
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
Análise Sintática Descendente Analisador Sintático
Eliminação de retrocessos
Análise Sintática Descendente
Uma alternativa mais viável é procurar o primeiro terminalderivável de cada variável.Considere as produções abaixo:
{A → BA|a}{B → b|C |A}{C → c}
Não é difícil de ver que os terminais deriváveis:A: a, b, cB: a, b, cC : c
Faça a análise sintática da entrada α = ”bcaa”.Existe um mecanismo formal para calcular o primeiro símbolo.
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Eliminação de retrocessos
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
Análise Sintática Descendente Analisador Sintático
Eliminação de retrocessos
Análise Sintática DescendenteS → AS |BAA → aB|CB → bA|dC → c
Passos 1 e 2: Criar a tabela, preencher primeira colunaΨp Ψp∗ Primeiro
S ABA aCB bdC c
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Eliminação de retrocessos
Análise Sintática DescendenteS → AS |BAA → aB|CB → bA|dC → c
Passo 3: Fecho transitivo.Ψp Ψp∗ Primeiro
S AB ABA aC aCB bd bcC c c
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Eliminação de retrocessos
Análise Sintática DescendenteS → AS |BAA → aB|CB → bA|dC → c
Passo 3: Fecho transitivo.Ψp Ψp∗ Primeiro
S AB ABaCA aC aCcB bd bdC c c
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Eliminação de retrocessos
Análise Sintática DescendenteS → AS |BAA → aB|CB → bA|dC → c
Passo 3: Fecho transitivo.Ψp Ψp∗ Primeiro
S AB ABaCbdA aC aCcB bd bdC c c
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Eliminação de retrocessos
Análise Sintática DescendenteS → AS |BAA → aB|CB → bA|dC → c
Passo 4: Descartar as variáveisΨp Ψp∗ Primeiro
S AB ABaCdbc adbcA aC aCc acB bd bc bdC c c c
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Eliminação de retrocessos
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
Análise Sintática Descendente Analisador Sintático
Fatoração
Fatoração
Um outro problema ocorre quando temos uma gramática G1que precisa verificar mais de um token à frente. Exemplo:
G1 = {S → aAS |aSAA → b|c}
Em alguns casos, é possível fatorar G1 gerando uma gramáticaG2 (onde L(G1) = L(G2)) que só precisa do primeiro token.
G2 = {S → a(AS |SA)
A → b|c}
G3 = {S → aXX → AS |SAA → b|c}
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Fatoração
Fatoração
Fatore a gramática G1 abaixo. precisa verificar mais de umtoken à frente. Exemplo:
G1 = {E → T + E |TT → F ∗ T |FF → a|(E)}
G2 = {E → T [+E |ε]T → F [∗T |ε]F → a|(E)}
G3 = {E → TE1
E1 → +E |εT → FT1
T1 → ∗T |εF → a|(E)}
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Fatoração
Fatoração
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
Análise Sintática Descendente Analisador Sintático
Eliminação da recursão à esquerda
Eliminação da recursão à esquerda
Um outro problema ocorre quando a gramática apresentaproduções com recursão à esquerda:
A → Aα|β
Há uma forma de converter estas produções para outrasequivalentes, onde não há recursão à esquerda:
A → β{α}
Aqui, o que está entre os símbolos “{“ e “}“ são repetidos dezero a n vezes.
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Argumentação da validade da transformação
Argumentação da validade da transformação
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
Análise Sintática Descendente Analisador Sintático
Argumentação da validade da transformação
Argumentação da validade da transformação
Aplique a transformação na gramática abaixo:
E → E + T |TT → T ∗ F |FE → a|(E )
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Analisador Sintático
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
Análise Sintática Descendente Analisador Sintático
Geração de Programas
Geração de Programas
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
Análise Sintática Descendente Analisador Sintático
Exemplo
Exemplo
aumentar a gramática:
S → AS |BAA → aB|CB → bA|dC → c
S ′ → S#
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
Análise Sintática Descendente Analisador Sintático
Exemplo
Exemplo
2) Fatorar - Ok.3) Eliminar Recursão Esquerda - Ok.4) Determinar primeiro (Já fizemos).
Primeiro (S) = adbcPrimeiro (A) = acPrimeiro (B) = dbPrimeiro (C) = c
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Exemplo
Exemplo
Gerar uma subrotina por variável:
S ′ → S#
S’ () {PROXIMO(token, simbolo);S();Se (token != #)
erroFatal (Esperado FDA);}
S → AS |BA
S () {caso simbolo for
{a, c} : A(); S(); break;{b, d} : B(); A(); break;outros : erroFatal(Simb inv);
fimCaso;}
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Exemplo
Exemplo
A → aB|C
A () {caso simbolo for
{a} : PROXIMO(token,simbolo);
B(); break;{c} : C(); break;outros : erroFatal(Simb inv);
fimCaso;}
B → bA|d
B () {caso simbolo for
{b} : PROXIMO(token, simbolo);A(); break;
{d} : PROXIMO(token, simbolo);break;
outros : erroFatal(Simb inv);fimCaso;
}Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Exemplo
Exemplo
C → c
C () {caso simbolo for
{c} : PROXIMO(token, simbolo);break;
outros : erroFatal(Simb inv);fimCaso;
}
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente
Análise Sintática Descendente Analisador Sintático
Exercício
Exercício
E → E + T |E − T | + T | − T
T → T ∗ F |T/F |FF → a|b|(E)
Todas as produções do apêndice 1 (livro Tomasz) estão noformato apropriado para a geração de programas. Verifique.
Bruno Müller Junior Departamento de Informática UFPR
Construção de Compiladores Aula 17 - Análise Sintática Descendente