Compiladores –
Análise Sintática
Rayol de Mendonça Neto
rayol.neto@gmail.com
Aná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
atribuição identificador identificador expressão expressão expressão número := 35 SOMA SOMA +
Aná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
Análise Sintática
Relembrando as regras da gramática regular
A wB A w
Aná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?
A string é tratado como uma expressão plana, não tendo estrutura
Aná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”
Análise Sintática
• Autômato de Pilha
É uma 7-tupla < , Q, , , q0, I, F>, 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
Aná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
Aná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?
Aná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)
Análise Sintática
• A maioria dos construtores das LP´s 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
Análise Sintática
• Cada categoria sintática é denotada por um não terminal principal
Exp Sif Swh ...
• Categorias sintáticas podem se referir a não terminais de outras
categorias
Análise 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
Análise 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}
Análise 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
Análise Sintática
• Diferentes derivações para a mesma questão
Qual a diferença?
Análise Sintática
• Árvore Sintática
Pode ser representada como uma árvore
A raiz é a variável de partida da gramática
Os vértices interiores obrigatoriamente são variáveis
Se A é um vértice interior e X1, X2,..., Xn são os filhos de A, então A → X1X2...Xn é uma derivação da gramática
Um vértice folha é um símbolo terminal ou a palavra vazia λ (neste caso, λ é filho único)
Análise Sintática
• Considere as regras
• E → E+E | E-E | (E) | C • C → CC | 0 | 1 | 2 | 3 | 4
| 5 | 6 | 7 | 9
• Qual a árvore de derivação
ara (10-2)+3?
Análise Sintática
• Considere as regras
• E → E+E | E-E | (E) | C • C → CC | 0 | 1 | 2 | 3 | 4
| 5 | 6 | 7 | 9
• Qual a árvore de derivação
ara (10-2)+3?
E
Análise Sintática
• Considere as regras
• E → E+E | E-E | (E) | C • C → CC | 0 | 1 | 2 | 3 | 4
| 5 | 6 | 7 | 9
• Qual a árvore de derivação
ara (10-2)+3? E E E ) ( E + C
Análise Sintática
• Considere as regras
• E → E+E | E-E | (E) | C • C → CC | 0 | 1 | 2 | 3 | 4
| 5 | 6 | 7 | 9
• Qual a árvore de derivação
ara (10-2)+3? E E E ) ( E E - E + C 3
Análise Sintática
• Considere as regras
• E → E+E | E-E | (E) | C • C → CC | 0 | 1 | 2 | 3 | 4
| 5 | 6 | 7 | 9
• Qual a árvore de derivação
ara (10-2)+3? E E E ) ( E E - E C C + C 3
Análise Sintática
• Considere as regras
• E → E+E | E-E | (E) | C • C → CC | 0 | 1 | 2 | 3 | 4
| 5 | 6 | 7 | 9
• Qual a árvore de derivação
ara (10-2)+3? E E E ) ( E E - E C C CC + 2 C 3
Análise Sintática
• Considere as regras
• E → E+E | E-E | (E) | C • C → CC | 0 | 1 | 2 | 3 | 4
| 5 | 6 | 7 | 9
• Qual a árvore de derivação
ara (10-2)+3? E E E ) ( E E - E C C CC 1 0 + 2 C 3
Análise Sintática
• Considere as regras
• E → E+E | E-E | (E) | C • C → CC | 0 | 1 | 2 | 3 | 4
| 5 | 6 | 7 | 9
• Qual a árvore de derivação
ara (10-2)+3? E E E ) ( E E - E C C CC 1 0 ( 1 0 - 2 ) + 3 + 2 C 3
Análise Sintática
• Considere as regras
• E → E+E | E-E | (E) | C • C → CC | 0 | 1 | 2 | 3 | 4
| 5 | 6 | 7 | 9
• Qual a árvore de derivação
ara (10-2)+3? E E E ) ( E E - E C C CC 1 0 ( 1 0 - 2 ) + 3 + 2 C 3 Raiz é a variável de partida
Vértices Internos são sempre variáveis
E – E (filhos) é Uma derivação de E (pai)
Toda folha é um terminal (ou λ)
Analise Sintática
• Uma Gramática Livre do Contexto é dita uma Gramática Ambígua,
se existe uma palavra que possua duas ou mais árvores de derivação
• Uma forma equivalente de definir ambiguidade de uma gramática
é a existência de uma palavra com duas ou mais derivações mais à esquerda (direita)
• Quando usamos gramáticas para impor estrutura sobre um
Analise Sintática
• Exemplo de problema Produções E E + E | E * E | C C→ 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 Como gerar a sentença
3 + 4 * 5 E E + E C + E 3 + E 3 + E * E 3 + C * E 3 + 4 * E 3 + 4 * C 3 + 4 * 5 E E * E E + E * E C + E * E 3 + E * E 3 + C * E 3 + 4 * E 3 + 4 * C 3 + 4 * 5
Analise Sintática
• Exemplo de problema 35 23 E E + E C + E 3 + E 3 + E * E 3 + C * E 3 + 4 * E 3 + 4 * C 3 + 4 * 5 E E * E E + E * E C + E * E 3 + E * E 3 + C * E 3 + 4 * E 3 + 4 * C 3 + 4 * 5 E E + E E * E C 3 C 4 C 5 E E E * E + E C 5 C 3 C 4Analise 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
Analise Sintática
• Precedência de operadores
Explicitar precedência nas gramáticas
2 + 3 * 5
Analise 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
a=b=c {atribuição em C} a=(b=c)
Exemplo de operador não associativo
Analise 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
Analise 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
Analise 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
Analise 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)
Analise 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?
Analise Sintática
• If-then-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”
Analise 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
Exercícios
• Utilizando a gramática abaixo, desenhe a árvore
sintática mais a esquerda e mais a direita para a palavra 0011122
• P → Q • P → 0P2 • Q → λ • Q → 1Q