Escrever Uma Gramc3a1tica

30
Escrever uma Gramática Análise Sintática Eliminar ambiguidade Eliminar recursão à esquerda FACULDADE ANGLO AMERICANO FOZ DO IGUAÇU Curso de Ciência da Computação 7º Periodo Disciplina: Compiladores Prof. Erinaldo Sanches Nascimento

Transcript of Escrever Uma Gramc3a1tica

Page 1: Escrever Uma Gramc3a1tica

Escrever uma Gramática

Análise Sintática

Eliminar ambiguidade

Eliminar recursão à esquerda

FACULDADE ANGLO AMERICANO – FOZ DO IGUAÇU Curso de Ciência da Computação – 7º Periodo Disciplina: Compiladores Prof. Erinaldo Sanches Nascimento

Page 2: Escrever Uma Gramc3a1tica

Introdução

• Não descreve toda a sintaxe das linguagens de programação.

• Algumas transformações podem ser aplicadas às gramáticas a fim de adequá-las aos diversos métodos de reconhecimento sintático.

– Eliminar ambiguidade

– Eliminar recursão à esquerda

– Fatorar à esquerda

2 http://erinaldosn.wordpress.com

Page 3: Escrever Uma Gramc3a1tica

Tudo o que pode ser descrito por uma expressão regular também pode ser descrito por uma gramática livre de contexto.

3 http://erinaldosn.wordpress.com

Page 4: Escrever Uma Gramc3a1tica

• A expressões regulares são mais adequadas para descrever a estrutura de construções como identificadores, palavras-chave e espaço em branco.

• As gramáticas são mais úteis para descrever estruturas aninhadas como parênteses balanceados, a combinação das construções if-else correspondentes, e assim por diante.

4 http://erinaldosn.wordpress.com

Page 5: Escrever Uma Gramc3a1tica

Gramáticas Ambíguas

• Uma gramática pode permitir que uma cadeia tenha mais de uma árvore de análise sintática.

• Uma gramática que gera uma cadeia com duas árvores de análise sintática distintas é ambígua.

5 http://erinaldosn.wordpress.com

Page 6: Escrever Uma Gramc3a1tica

Tratar ambiguidade

• Estabelecer uma regra que especifique qual árvore sintática é a correta.

• Alterar a gramática para forçar a construção da árvore de análise sintática correta.

6 http://erinaldosn.wordpress.com

Page 7: Escrever Uma Gramc3a1tica

• Considere a gramática aritmética de inteiros:

exp exp op exp | (exp) | numero

op + | - | *

• Considere a cadeia 34-3*42.

7 http://erinaldosn.wordpress.com

Page 8: Escrever Uma Gramc3a1tica

• exp exp op exp

exp op exp op exp

numero op exp op exp

numero – exp op exp

numero – numero op exp

numero – numero * op exp

numero – numero * numero

8 http://erinaldosn.wordpress.com

Page 9: Escrever Uma Gramc3a1tica

exp exp op exp

numero op exp

numero – exp

numero – exp op exp

numero – numero op exp

numero – numero * exp

numero – numero * numero

9 http://erinaldosn.wordpress.com

Page 10: Escrever Uma Gramc3a1tica

• Qual das duas árvores sintáticas anteriores representa a interpretação correta da cadeia?

– A primeira indica que a expressão deve avaliar primeiro a subtração, e depois a multiplicação.

– A segunda indica que a multiplicação deve ser efetuada antes, e depois a subtração.

• A matemática determina como correta a segunda interpretaç ão.

10 http://erinaldosn.wordpress.com

Page 11: Escrever Uma Gramc3a1tica

Precedência e Associatividade

• Agrupar os operadores em classes de igual precedência.

• Para cada precedência escrever uma regra distinta.

11 http://erinaldosn.wordpress.com

Page 12: Escrever Uma Gramc3a1tica

Cascata de precedências

exp exp soma exp | termo

soma + | -

termo termo mult termo | fator

mult *

fator (exp) | numero

12 http://erinaldosn.wordpress.com

Page 13: Escrever Uma Gramc3a1tica

• A multiplicação é agrupada sob a regra termo.

• A adição e a subtração são agrupadas sob a regra exp.

• Como a base para exp é termo, a adição e a subtração aparecerão mais perto da raiz (menor precedência).

13 http://erinaldosn.wordpress.com

Page 14: Escrever Uma Gramc3a1tica

• Não especifica a associatividade dos operadores

• Ainda é ambígua: a recursão nos dois lados do operador possibilita que qualquer um dos lados case com repetições do operador em uma derivação.

• Solução: substituir um das recursões pelo caso base.

exp exp soma termo | termo

14 http://erinaldosn.wordpress.com

Page 15: Escrever Uma Gramc3a1tica

Recursão Associativa

• Uma regra recursiva à esquerda faz os operadores associarem à esquerda.

exp exp soma termo | termo

• Uma regra recursiva à direita os faz associarem à direita.

exp termo soma exp | termo

15 http://erinaldosn.wordpress.com

Page 16: Escrever Uma Gramc3a1tica

• Remoção de ambiguidade nas regas BNF para expressões aritméticas simples.

exp exp soma termo | termo

soma + | -

termo termo mult fator | fator

mult *

fator (exp) | numero

16 http://erinaldosn.wordpress.com

Page 17: Escrever Uma Gramc3a1tica

• Árvore sintática para a expressão 34-3*42.

17 http://erinaldosn.wordpress.com

Page 18: Escrever Uma Gramc3a1tica

• A árvore de análise sintática para a expressão 34-3-42.

18 http://erinaldosn.wordpress.com

Page 19: Escrever Uma Gramc3a1tica

Else vazio (pendente)

• Considere a gramática:

declaracao if-decl | outra

if-decl if (exp) declaracao |

if (exp) declaracao else declaracao

exp 0 | 1

• Considere a cadeia

if (0) if (1) outra else outra

19 http://erinaldosn.wordpress.com

Page 20: Escrever Uma Gramc3a1tica

20 http://erinaldosn.wordpress.com

Page 21: Escrever Uma Gramc3a1tica

21 http://erinaldosn.wordpress.com

Page 22: Escrever Uma Gramc3a1tica

• Essa cadeia tem duas árvores de análise sintática (ambígua).

• A escolha de qual é a correta depende de querermos associar a parte else à primeira ou à segunda declaração if.

22 http://erinaldosn.wordpress.com

Page 23: Escrever Uma Gramc3a1tica

• Observe:

if (x != 0)

if (y == 1/x) ok = TRUE;

else z = 1/x;

if (x != 0)

{if (y == 1/x) ok = TRUE;}

else z = 1/x;

23 http://erinaldosn.wordpress.com

Page 24: Escrever Uma Gramc3a1tica

• Uma solução: declaracao casam-decl | sem-casam-decl

casam-decl if (exp) casam-decl else casam-decl | outra

sem-casam-decl if (exp) declaracao

| if (exp) casam-decl else sem-casam-decl

exp 0 | 1

24 http://erinaldosn.wordpress.com

Page 25: Escrever Uma Gramc3a1tica

• Casam-decl ocorre apenas antes de um else em uma declaraçao if

• Força todas as partes else casar assim que possível.

25 http://erinaldosn.wordpress.com

Page 26: Escrever Uma Gramc3a1tica

26 http://erinaldosn.wordpress.com

Page 27: Escrever Uma Gramc3a1tica

Ambiguidade Não-Essencial

• Uma gramática ambígua, ainda assim, pode produzir árvores de sintaxe abstrata únicas.

• Denominada ambiguidade não-essencial.

• A semântica associada não depende da regra de eliminação de ambiguidade que é utilizada.

27 http://erinaldosn.wordpress.com

Page 28: Escrever Uma Gramc3a1tica

Exercícios

1. Dada a gramática E E soma T | T soma + | - T T mult F | F mult * F (E) | id escreva derivações à esquerda, árvores de análise

sintática e árvores sintáticas para as expressões a seguir: a) 3+4*5-6 b) 3*(4-5+6) c) 3-(4+5*6)

28 http://erinaldosn.wordpress.com

Page 29: Escrever Uma Gramc3a1tica

2. Dada a gramática a seguir declaracao if-decl | outra |

if-decl if (exp) declaracao else-parte

else-parte else declaracao |

a) Desenhe uma árvore de análise sintática para a cadeia

if (0) if (1) outra else else outra

b) Para que servem os dois else’s? c) Algum código similar é admissível em C?

Explique.

29 http://erinaldosn.wordpress.com

Page 30: Escrever Uma Gramc3a1tica

3. Mostre que a seguinte tentativa de resolução da ambiguidade de else pendente ainda é ambigua:

declaracao if (exp) declaracao | casam-decl

casam-decl if (exp) casam-decl else declaracao |

outra

exp 0 | 1

30 http://erinaldosn.wordpress.com