Title: Constru
1Construção de Compiladores
2Análise Sintática
- Tem a função de combinar a lista de tokens
- Criação de uma estrutura chamada Árvore Sintática
- A analise sintática também deve rejeitar tokens
inválidos - Reportar erros sintáticos
3Análise Sintática
- A análise sintática é mais complexa em natureza
do que a análise léxica - Precisamos de uma linguagem mais avançada
- Hierarquia de Chomsky
4Análise Sintática
- Tente representar as seguintes linguagens com uma
gramática regular - L1 anbn n ? 0
- L2 anbman n ? 0, m ? 1
- Relembrando as regras da gramática regular
- A ? wB
- A ? w
- A ? ?
5Análise Sintática
- Exemplo mais concreto
- Expressões aritméticas
- Num-x/num
- Como representar casamento de parênteses?
- Não é possível contar o número de parênteses não
casados ou abertos - Como estabelecer precedências?
- O string é tratado como uma expressão plana, não
tendo estrutura
Modifique de forma a suportar ( e )
6Análise Sintática
- Linguagens Livre de Contexto
- Constituem um conjunto de linguagens que podem
ser geradas por gramáticas livre de contextos
(GLC), reconhecidas por autômatos de pilha
7Análise Sintática
- Autômato de Pilha
- É uma 7-tupla lt ?, Q, ?, ?, q0, I, Fgt, onde
- ?, alfabeto de símbolos de entrada
- Q, conjunto finito de estados possíveis do
autômato - ?, alfabeto da pilha
- ?, função de transição ? Q x (? ? ?) x ? ? Q x
? - q0, estado inicial tal que q0 ? Q
- I, símbolo inicial da pilha
- F, conjunto de estados finais, tais que F ? Q
8Análise Sintática
- Autômato de Pilha (exemplo)
- Seja A lt ?, Q, ?, ?, q0, I, Fgt
S a, b Q 0, 1, 2 G X, A
q0 0 IX F 2 A
função d0,1,2a,b,eX,A ?
P(0,1,2X,A) é dada por d(0, a, X) ? (0,
AX) d(1, b, A) ? (1, e) d(0, a, A) ? (0,
AA) d(1, e, X) ? (2, X) d(0, b, A) ? (1, e)
Empilhou A
Desempilhou A
Empilhou A
Não fez nada
Desempilhou A
9Análise Sintática
- Autômato de Pilha (exemplo)
- Detalhes da notação
- Símbolo e no resultado da função indica um pop
- d(1, b, A) (1, e)
- Nas operações de push, sempre é representado o
antigo topo da pilha no resultado - d(0, a, X) (0, AX)
- Operações de push podem empilhar mais do que um
elemento - d(0, a, X) (0, XXAX)
A
X
X
A
A
X
X
Antigo topo da pilha
X
X
A
X
X
10Análise Sintática
- Gramáticas livre de contexto
- Quádrupla G (N, T, P, S), onde
- N, conjunto finito de símbolos não-terminais
- T, conjunto finito de símbolos terminais
- P, conjunto finito de regras gramaticais na forma
? ? ? - S, símbolo inicial da gramática pertencente a N
- Regras gramaticais (P) na forma
- ? ? N
- ? ? (N ?T)
11Análise Sintática
- Gramáticas livre de contexto (exemplos)
- A linguagem L1 anbn n ? 0 é gerada por
qual gramática? - A linguagem L2 anbman n ? 0, m ? 1 é gerada
por qual gramática?
12Análise Sintática
- E o balanceamento de parênteses e a precedência
de operadores?
Exp ? Exp Exp Exp ? Exp - Exp Exp ? Exp
Exp Exp ? Exp / Exp Exp ? numero Exp ? (Exp)
Gramática para expressões aritméticas simples
13Análise Sintática
- Outro exemplo em programação
Stat ? Id Exp Stat ? StatStat Stat ? if Exp
then Stat else Stat Stat ? if Exp then Stat
Gramática para statements
14Analise Sintática
- A maioria dos construtores das LPs são expressos
em GLC - Linguagens são projetadas a partir de GLC
- É comum dividir os construtores em categorias
sintáticas que englobam algum conceito particular - Expressões usada no cálculo de valores
- Statements ações que ocorrem em um fluxo
- Declarações propriedades dos nomes usados em
outras partes do programa
15Analise Sintática
- Cada categoria sintática é denotada por um não
terminal principal - Exp
- Sif
- Swh
- Sat
- ...
- Categorias sintáticas podem se referir a não
terminais de outras categorias - Podem também ser recursivas
16Analise Sintática
- Derivações
- Método de reescrever as regras gramaticais
através de substituição dos seus símbolos
não-terminais - As substituições devem ser feitas até que apenas
restes símbolos terminais - A seqüência de terminais restante deve ser
definida pela linguagem
17Analise Sintática
- Definição formal para derivação
- A relação de derivação ? é definida via três
regras - ?N? ? ??? , se existe uma regra N ? ?
- ? ? ?
- ? ? ?, se existe um ? tal que ? ? ? e ? ? ?
- Note que ?, ? e ? ? (T ? N)
18Analise Sintática
- Definição baseada em derivação para uma
linguagem gerada por uma GLC - Dado uma GLC G com símbolo inicial S, símbolos
terminais T e produções P, a linguagem L(G) que G
gera é definida para ser o conjunto de todas as
strings de símbolos terminais que podem ser
obtidas por derivação a partir de S usando as
produções P, ou seja, o conjunto w ? T S ? w
19Analise Sintática
- Exemplo
- Dado a gramática G, verifique se o string aabbbcc
pertence a L(G) - T ? R
- T ? aTc
- R ? ?
- R ? RbR
Reposta? T ?
20Analise Sintática
- Diferentes derivações para a mesma questão
- Qual a diferença?
- Derivação mais a esquerda X Derivação mais a
direita
21Analise Sintática
- Árvore Sintática
- Pode ser representada como uma árvore
- A raiz é o símbolo inicial
- Resultados da produção dos símbolos não terminais
são filhos - As folhas devem conter apenas símbolos terminais
- Lendo as folhas da esquerda para a direita temos
a palavra derivada - Produções que levam ao vazio também devem ser
representadas, apesar de serem ignoradas na
formação da palavra
22Analise Sintática
- Dada uma gramática G, a escolha da produção a ser
derivada influencia na forma da árvore sintática - T ? R
- T ? aTc
- R ? ?
- R ? RbR
- Árvores sintática para a palavra aabbbcc
23Analise Sintática
- Quando uma gramática permite diferentes árvores
sintáticas ela é dita ambígua - Quando usamos gramáticas para impor estrutura
sobre um conjunto de tokens, tal estrutura tem
que ser sempre a mesma
24Analise Sintática
- Exemplo de problema
- Produções
- E ? E E E E Numero
- Como gerar a sentença
- 3 4 5
E ? E E ? Numero E ? 3 E ? 3 E E ? 3
Numero E ? 3 4 E ? 3 4 Numero ? 3 4
5
E ? E E ? E E E ? Numero E E ? 3 E
E ? 3 Numero E ? 3 4 E ? 3 4 Numero ?
3 4 5
25Analise Sintática
E ? E E ? Numero E ? 3 E ? 3 E E ? 3
Numero E ? 3 4 E ? 3 4 Numero ? 3 4
5
E ? E E ? E E E ? Numero E E ? 3 E
E ? 3 Numero E ? 3 4 E ? 3 4 Numero ?
3 4 5
35
23
26Analise Sintática
- Em muitos (mas não todos) os casos, uma gramática
ambígua pode ser reescrita em uma gramática
não-ambígua - Outra opção é o uso de semântica externa para
decidir pela árvore correta
27Analise Sintática
- Precedência de operadores
- Explicitar precedência nas gramáticas
- 2 3 5
- Como tirar essa ambigüidade?
28Analise Sintática
- Alguns conceitos iniciais
- Operador ? pode ser associativo a esquerda
- Operador ? pode ser associativo a direita
- Operador ? pode ser não associativo
- Convenção
- - e / são obrigatoriamente associativos a
esquerda - e são opcionalmente associativos a esquerda
- Exemplo de operador associado a direita
- abc atribuição em C a(bc)
- Exemplo de operador não associativo
- 2 lt 3 lt 4 comparação em Pascal Não permitido
29Analise Sintática
- Reescrevendo expressões gramaticais ambíguas
- Considere a seguinte gramática ambígua
- Como torná-la não ambigua?
- Se ? é associativo a esquerda, devemos forçar a
gramática a ser recursiva a esquerda
E ? E ? E E ? num
E ? E ? E E ? E E ? num
Única árvore que pode se gerada
30Analise Sintática
- Reescrevendo expressões gramaticais ambíguas
- E se for associativa a direita?
- Forçar a gramática a ser recursiva a direita
- E se for não associativa?
- Sem regras recursivas
E ? E ? E E ? E E ? num
E ? E ? E E ? E E ? num
31Analise Sintática
- Reescrevendo expressões gramaticais ambíguas
- Expandindo a idéia...
- Operadores com a mesma precedência
E ? E E E ? E - E E ? E E ? num
32Analise Sintática
- Reescrevendo expressões gramaticais ambíguas
- Expandindo a idéia...
- Operadores com diferentes precedências
Exp ? Exp Exp2 Exp ? Exp - Exp2 Exp ?
Exp2 Exp2 ? Exp2 Exp3 Exp2 ? Exp2 / Exp3 Exp2 ?
Exp3 Exp3 ? num Exp3 ? (Exp)
33Analise Sintática
- Outras fontes de ambigüidade
- Exemplo clássico do else em comandos de decisão
- A convenção é casar o else com o if mais
perto que ainda não tenha sido casado - Como representar isso na gramática?
If p then if q then s1 else s2
34Analise Sintática
- If-the-else podem ser tratados como operadores
associativos a direita - Quando um if e um else casam, todas as
ocorrências entre eles devem estar casadas - Precisamos de dois símbolos não-terminais
- Matched condicionais com o else
- Unmatched condicionais sem o else
35Analise Sintática
- Gramática não ambígua para comandos
Stat ? Stat2 Stat Stat ?
Stat2 Stat2 ? Matched Stat2 ?
Unmatched Matched ? if Exp then Matched else
Matched Matched ? id Exp Unmatched ? if
Exp then Matched else Unmatched Unmatched ? if
Exp then Stat2