Upload
kandreaborges
View
40
Download
0
Embed Size (px)
Citation preview
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
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
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
• 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
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
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
• 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
• 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
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
• 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
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
Cascata de precedências
exp exp soma exp | termo
soma + | -
termo termo mult termo | fator
mult *
fator (exp) | numero
12 http://erinaldosn.wordpress.com
• 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
• 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
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
• 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
• Árvore sintática para a expressão 34-3*42.
17 http://erinaldosn.wordpress.com
• A árvore de análise sintática para a expressão 34-3-42.
18 http://erinaldosn.wordpress.com
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
20 http://erinaldosn.wordpress.com
21 http://erinaldosn.wordpress.com
• 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
• 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
• 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
• 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
26 http://erinaldosn.wordpress.com
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
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
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
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