Você está na página 1de 35

Prof. Ricardo P.

Mesquita
 Constitui a segunda fase do tradutor
 Sua função é verificar se as construções
usadas no programa são gramaticalmente
corretas
◦ Isto é, verifica se as sentenças podem ter sido
geradas pela gramática da linguagem.
 Nas linguagens de programação, a Gramática
usada é do tipo Livre de Contexto (GLC)

Prof. Ricardo Mesquita 02/34


 Dada uma gramática livre de contexto G e
uma sentença s (código fonte), o objetivo do
analisador sintático (parser) é verificar se a
sentença s pertence à linguagem gerada por
G.

Prof. Ricardo Mesquita 03/34


 A análise sintática é mais complexa do que a
análise léxica
◦ Trabalha com uma linguagem mais avançada

 Hierarquia de Chomsky

Prof. Ricardo Mesquita 04/34


 Exemplo:
◦ Expressões aritméticas
Modifique de forma a suportar “(“ e “)”
 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 é tratada como uma expressão plana, não
tendo estrutura

Prof. Ricardo Mesquita 05/34


 Linguagens Livre de Contexto
◦ “Constituem um conjunto de linguagens que podem
ser geradas por gramáticas livre de contextos
(GLC), e reconhecidas por autômatos de pilha”

Prof. Ricardo Mesquita 06/34


 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
 F, conjunto de estados finais, tais que F  Q

Prof. Ricardo Mesquita 07/34


 Autômato de Pilha (algumas considerações)
◦ Detalhes da notação: A
 Símbolo ε no resultado da função indica um pop X X
 δ(1, b, A) = {(1, ε)} A A
X X

 Nas operações de push, sempre é representado o


antigo topo da pilha no resultado
 δ(0, a, X) = {(0, AX)} Antigo topo da pilha

 Operações de push podem empilhar mais do que um


elemento
X
 δ(0, a, X) = {(0, XXAX)}
X
A
X X

Prof. Ricardo Mesquita 08/34


 Gramáticas livres 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)*

Prof. Ricardo Mesquita 09/34


 Gramáticas livre de contexto (exemplos)
◦ A linguagem L1 = {anbn | n  0 } é gerada por qual
gramática?

◦ G = ({S}, {a, b}, {S  aSb | }, S)

◦ A linguagem L2 = {anbman | n  0, m  1} é gerada


por qual gramática?

◦ G = ({S, R}, {a, b}, {S  aSa | bR, R  bR | }, S)

Prof. Ricardo Mesquita 10/34


 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

Prof. Ricardo Mesquita 11/34


 Outro exemplo em programação

Stat  Id := Exp
Stat  Stat;Stat
Stat  if Exp then Stat else Stat
Stat  if Exp then Stat

Gramática para statements

Prof. Ricardo Mesquita 12/34


 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
◦ Declarações: propriedades dos nomes usados em
outras partes do programa

Prof. Ricardo Mesquita 13/34


 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!

Prof. Ricardo Mesquita 14/34


 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
restem símbolos terminais
◦ A sequência de terminais restante deve ser definida
pela linguagem

Prof. Ricardo Mesquita 15/34


 Definição (informal) de 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)*

Prof. Ricardo Mesquita 16/34


 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
cadeias 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 }

Prof. Ricardo Mesquita 17/34


 Exemplo
◦ Dada a gramática G, definida a seguir por suas
produções, verifique se a cadeia aabbbcc
pertence a L(G)
 TR
 T  aTc
 R
 R  RbR
Resposta: uma solução possível é

T  aTc  aaTcc  aaRcc  aaRbRcc  aabbbcc

Prof. Ricardo Mesquita 18/34


 Diferentes derivações para a mesma questão:

Qual a diferença?
• Derivação mais à direita X derivação
mais à esquerda
Prof. Ricardo Mesquita 19/34
 Árvore de Derivação
 A raiz é o símbolo inicial
 Os 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

Prof. Ricardo Mesquita 20/34


 Dada uma gramática G, a escolha da produção a ser
derivada influencia na forma da árvore de derivação
◦ T  R
◦ T  aTc
◦ R  
◦ R  RbR
Árvores de derivação para a
palavra aabbbcc

Observe que podemos obter


mais de uma árvore de
derivação para a mesma
sentença, logo, essa
gramática é ambígua!

Prof. Ricardo Mesquita 21/34


 Quando uma gramática permite diferentes
árvores de derivação ela é dita ambígua

 Quando usamos gramáticas para impor


estrutura sobre um conjunto de tokens, tal
estrutura tem que ser sempre a mesma!

Prof. Ricardo Mesquita 22/34


 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

Prof. Ricardo Mesquita 23/34


 Veja o problema
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
23 35

Representam
operações distintas!!
Prof. Ricardo Mesquita 24/34
 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
 Ou seja, podemos resolver qual a derivação correta
aplicando uma heurística baseada em nosso
conhecimento da operação!

Prof. Ricardo Mesquita 25/34


 Precedência de operadores
◦ Explicitar precedência nas gramáticas
 2+3*5

◦ Como tirar essa ambigüidade?

Prof. Ricardo Mesquita 26/34


 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
 2 < 3 < 4 {comparação em Pascal} Não permitido

Prof. Ricardo Mesquita 27/34


 Reescrevendo expressões gramaticais
ambíguas
◦ Considere a seguinte gramática ambígua:
EEE
E  num

◦ 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  E’
Única árvore que E’  num
pode se gerada

Prof. Ricardo Mesquita 28/34


 Reescrevendo expressões gramaticais
ambíguas
◦ E se for associativa a direita?
 Forçar a gramática a ser recursiva a direita
E  E’  E
E  E’
E’  num

◦ E se for não associativa?


 Sem regras recursivas E  E’  E’
E  E’
E’  num

Prof. Ricardo Mesquita 29/34


 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

Prof. Ricardo Mesquita 30/34


 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)

Prof. Ricardo Mesquita 31/34


 Outras fontes de ambiguidade
◦ Exemplo clássico do “else” em comandos de decisão

Considere uma gramática com


as seguintes regras de
produção:

S  if C then S S’ | q Entrada:
S’  else S | 
Cp if p then if p then q else q

◦ Gere a árvore. O que se observa?

Prof. Ricardo Mesquita 32/34


 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”

Prof. Ricardo Mesquita 33/34


 Exemplo:
Gramática não ambígua
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

Prof. Ricardo Mesquita 34/34

Você também pode gostar