compiladores prof. bruno moreno aula 4 – 11/03/2011
TRANSCRIPT
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 BNFBackus-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
Símbolos terminais (2) Conjunto de não-terminais (3) Conjunto de regras de produção
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
lista lista + dígito lista lista - digito lista dígito dígito 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
lista lista + digito |
lista - digito |
dígito
Símbolos não-terminais
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 endcmd_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 X Y Z
A
X Y Z
Árvores Gramaticais
Árvore gramatical para 9 – 5 + 2
9
lista
lista
dígito
lista dígito
dígito
2–
5
+
lista lista + digito | lista - digito | dígito
Á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 para a direita
9
lista
lista
dígito
lista dígito
dígito
2–
5
+
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
9
cadeia
cadeia
cadeia
cadeia cadeia
cadeia
2–
5
+ cadeia
cadeia
cadeia
9
-
cadeiacadeia
5
+
2
Associatividade dos Operadores
9 + 5 + 2 (9 + 5) + 2 9 + (5 + 2)
Quando um operando recebe operadores à esquerda e à direita 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 = direita | letra 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
9
lista
lista
dígito
lista dígito
dígito
2–
5
+ letra
direita
direita
=a
=
letra
b
direita
letra
c
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
expr expr + termo| expr - termo| termo
fator digito | (expr)
Sintaxe de Expressões
expr expr + termo | expr – termo | termotermo termo * fator | termo / fator | fatorfator 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