construção de compiladores aula 17 - análise sintática ... · análise sintática descendente...

28
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

Upload: lytu

Post on 13-Dec-2018

225 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 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

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

Page 2: 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

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

Page 3: 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

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

Page 4: 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

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

Page 5: 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

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

Page 6: 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

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

Page 7: 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

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

Page 8: 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

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

Page 9: 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

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

Page 10: 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

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

Page 11: 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

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

Page 12: 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

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

Page 13: 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

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

Page 14: 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

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

Page 15: 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

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

Page 16: 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

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

Page 17: 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

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

Page 18: 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

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

Page 19: 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

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

Page 20: 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

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

Page 21: 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

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

Page 22: 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

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

Page 23: 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

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

Page 24: 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

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

Page 25: 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

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

Page 26: 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

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

Page 27: 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

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

Page 28: 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

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