Aula 4 - Bruno Neiva Moreno

Download Report

Transcript Aula 4 - Bruno Neiva Moreno

Compiladores
Prof. Bruno Moreno
Aula 4 – 11/03/2011
Especificação de uma LP

Uma linguagem de programação pode ser
definida pela

Descrição da aparência de seus programas


Sintaxe
Descrição do que os programas significam

Semântica
Para especificar a sintaxe
... utilizamos uma BNF
Backus-Naur Form
Gramática Livre de Contexto
Gramática Livre de Contexto

Utilizada como auxílio para guiar a tradução
de programas


Tradução dirigida por sintaxe
Descreve uma estrutura hierárquica de
muitas construções de linguagens de
programação

Exemplo (C)

Comando if-else
if (expressão) comando else comando
Gramática Livre de Contexto

Comando if-else


if (expressão) comando else comando
cmd
if (expr ) cmd else cmd
Regra de Produção
token
token
Não-terminais
Gramática Livre de Contexto


Possui quatro componentes
(1) Conjunto de tokens



(2) Conjunto de não-terminais
(3) Conjunto de regras de produção


Símbolos terminais
Produção é formada por um não-terminal do lado
esquerdo, uma seta e uma seqüência de tokens
e/ou não terminais no lado direito da seta
(4) Uma designação de um dos não-terminais
como símbolos de partida
Gramática Livre de Contexto

O símbolo de partida figura na frente dos
demais

Símbolos terminais
 Dígitos, sinais (<=, <, +, etc) e cadeias de caracters
em negrito (e.g while, for)

Não-terminais


Itálico
OU

|
Gramática Livre de Contexto

Exemplo 1

Gramática para construir as seguintes expressões



9–5+2
3–1
7
Símbolos não-terminais




lista
lista
lista
dígito
lista + dígito
lista - digito
dígito
lista
lista + digito |
lista - digito |
dígito
0|1|2|3|4|5|6|7|8|9
Símbolos terminais = tokens
Gramática Livre de Contexto

Exemplo 2


A linguagem PASCAL permite definir uma lista
vazia
A gramática abaixo permite a construção de uma
lista em PASCAL
bloco
begin cmd_opcs end
cmd_opcs
lista_cmds |
lista_cmds
lista_cmds ; cmd | cmd
Árvores Gramaticais


Utilizadas para mostrar como um símbolo de
partida, definido em uma gramática, gera
uma cadeia de linguagem (frase)
A
XYZ
A
X
Y
Z
Árvores Gramaticais

Árvore gramatical para 9 – 5 + 2
lista
lista
lista + digito
| lista - digito
| dígito
lista
dígito
9
lista
+
dígito
–
dígito
2
5
Árvores Gramaticais
Uma árvore gramatical possui as seguintes
propriedades
1. A raiz é rotulada pelo símbolo de entrada da
gramática
2. Cada folha é um token ou
3. Cada nó interior é um não-terminal
4. Se A é um não-terminal e X1, X2 e Xn são seus
filhos
A
X1 X2 Xn é uma produção
5. Se A
, então deve possui um único filho:

Árvores Gramaticais

A leitura sempre deve ser feita da esquerda
lista
para a direita
+
lista
lista
dígito
9
–
dígito
5
dígito
2
Ambiguidade


Uma gramática que pode ter mais do que
uma árvore gramatical gerando uma
mesma cadeia de tokens é dita ambígua
Para mostrar que uma gramática é ambigua
é necessário encontrar uma cadeia de
tokens que tenha mais do que uma árvore
gramatical
Ambiguidade

As LPs devem ser definidas de modo a não
permitir amiguidades
cadeia
cadeia + cadeia
| cadeia - cadeia
|0|1|2|3|4
|5|6|7|8|9
Qual seria a árvore sintática para a expressão “9 – 5 + 2”?
Ambiguidade
cadeia
cadeia
+
cadeia – cadeia
cadeia
9
5
cadeia
cadeia
cadeia
2
9
cadeia
-
cadeia
5
+
cadeia
2
Associatividade dos
Operadores

9+5+2



Quando um operando recebe operadores à
esquerda e à direita


(9 + 5) + 2
9 + (5 + 2)
São necessárias convenções para saber que
operador recebe o operando primeiramente
Na maioria das LPs os quatro operadores
aritméticos são associativos a esquerda
Associatividade dos
Operadores

O operador de atribuição em C é associativo
a direita



a=b=c
a=c
Gramática de geração de operador
associativo à direita


direita
letra
letra = direita | letra
a | b | ... | z
Gramática de geração
de operador associativo
à esquerda
Deve ser provado com uma
árvore de decisão
Associatividade dos
Operadores
lista
lista
lista
dígito
–
+
dígito
5
direita
dígito
letra
2
a
= direita
letra =
b
direita
letra
c
9
Precedência de Operadores

9+5*2



(9 + 5) * 2
9 + (5 * 2)
A associatividade de + e de * não resolve
essa ambigüidade pelo fato de que os
operadores da direita e da esquerda dos
operandos são diferentes

Precisamos conhecer a precedência relativa dos
operadores
Precedência de Operadores



Na matemática, * e ÷ têm precedência mais
alta do que + e –
9+5*2
A precedência e a associatividade de
operadores pode ser representada em uma
gramática
Sintaxe de Expressões

São criados dois não-terminais para
representar os dois níveis de precedência


expr e termo
É criado um não-terminal extra para gerar as
unidades básicas das expressões

fator
termo
termo * fator
| termo / fator
| fator
fator
expr
digito | (expr)
expr + termo
| expr - termo
| termo
Sintaxe de Expressões
expr
termo
fator
expr + termo | expr – termo | termo
termo * fator | termo / fator | fator
digito | (expr)
Sintaxe de Comandos
cmd
id := expr
| if expr then cmd
| if expr then cmd else cmd
| while expr do cmd
| begin cmd_opcs end