You are on page 1of 50

Análise Sintática

Thierson Couto Rosa

Instituto de Informática
Universidade Federal de Goiás

6 de outubro de 2009

Thierson Couto Rosa Análise Sintática


Análise Ascendente

Tenta construir uma árvore gramátical para uma cadeia de


entrada iniciando pelos nós folhas da árvore e montando a
árvore em direção à raiz.
Neste sentido, há uma redução da cadeia de entrada ao
símbolo inicial da gramática.
A cada passo de redução, um lado direito de alguma produção
é substituido pelo não terminal à esquerda da produção.

Thierson Couto Rosa Análise Sintática


Redução da Cadeia de Entrada

A redução da cadeia de entrada ao símbolo inicial corresponde


ao inverso de uma derivação mais à direita da cadeia a partir
de S.
Exemplo:
S → aABe, A → Abc | b, B → d
cadeia de entrada: abbcde

Thierson Couto Rosa Análise Sintática


Redução da Cadeia de Entrada

A cadeia pode ser reduzida a S nos seguintes passos:


1 abbcde (A → b)
2 aAbcde (A → Abc)
3 aAde (B → d)
4 aABe (S → aABe)
5 S
Inverso da derivação mais à direita:
S ⇒ aABe ⇒ aAde ⇒ aAbcde ⇒ abbcde

Thierson Couto Rosa Análise Sintática


Redução de Alavanca

Alavanca
As formas sentenciais sublinhadas que aparecem em uma
redução são denominadas alavancas, pois elas “alavancam” um
nível acima na árvore devido à substituição delas por um
não-terminal colocado no nível superior da árvore.
Uma alavanca é uma forma sentencial que corresponde a um
lado direito de uma produção e que aparece na derivação mais
à direita de alguma forma sentencial.
No exemplo anterior, b, Abc, d, aABe são alavancas.

Thierson Couto Rosa Análise Sintática


Redução de Alavanca

Alavanca
Formalmente, uma alavanca de uma forma sentencial mais à
direita γ é uma produção A →β e uma posição dentro de γ
onde a cadeia β pode ser encontrada e substituida por A de
forma a produzir a forma sentencial à direita anterior numa
derivação mais à direita de γ.
No exemplo anterior: dado γ = aAbcde, β = Abc é uma
alavanca de γ, mas β = b não é.

Thierson Couto Rosa Análise Sintática


Redução de Alavanca

Exemplo
Considere a gramática: E → E + E, E → E ∗ E, E → (E),
E → id,
e a cadeia: Id1 + id2 ∗ id3
e a derivação mais à direita:
E ⇒ E+E ⇒ E+E∗E ⇒ E+E∗id ⇒ E+id∗id ⇒ id+id∗id

Thierson Couto Rosa Análise Sintática


Redução de Alavanca

Exemplo

Figura: Exemplo de Alavanca

Thierson Couto Rosa Análise Sintática


Analisador ascendente com Pilha

Repare que a cadeia à direita de uma alavanca é formada


apenas por terminais
As formas sentenciais contendo não terminais vão se formando
à esquerda.
Uma pilha pode ser utilizada para ir armazenando símbolos
que constituem uma alavanca. Analisadores podem ser
construídos de tal forma que a alavanca é formada no topo da
pilha e o restante da cadeia fica no buffer de entrada.

Thierson Couto Rosa Análise Sintática


Analisador ascendente com Pilha

A Pilha
Um $ é usado para marcar o fundo da pilha e o fim da cadeia
de entrada. Inicialmente:
Pilha: $
Buffer: w$, onde w é a cadeia de entrada.
Se a cadeia for aceita:
Pilha: S$
Buffer: $

Thierson Couto Rosa Análise Sintática


Analisador Ascendente com Pilha

Ações do Analisador Ascendente

Figura: Ações do Analisador Ascendente

Thierson Couto Rosa Análise Sintática


Analisador Ascendente com Pilha

Ações Possíveis
Empilhar (shift): desloca o próximo símbolo da entrada para
o topo da pilha.
Reduzir: substitui a alavanca no topo da pilha pelo lado
esquerdo (não-terminal) de alguma produção.
Detectar erro: erro sintático ocorrido.
Aceitar: o símbolo inicial é o único na pilha e o buffer de
entrada se encontra vazio.

Thierson Couto Rosa Análise Sintática


Analisador Ascendente com Pilha

O Funcionamento do Analisador
Repare na última tabela que é possível ver o reverso de uma
derivação mais à direita lendo-se a tabela de baixo para cima,
e em cada linha, começando a leitura na pilha e continuando
no buffer de entrada.
O método utilizado deve garantir que a alavanca apareça no
topo da pilha.

Thierson Couto Rosa Análise Sintática


Métodos de Análise Ascendente

Parsers LR
Podem ser construídos para reconhecer qualquer estrutura
sintática de linguagens de programação que podem ser geradas
por uma gramática livre de contexto.
A classe de gramáticas que podem ser analisadas com o
método LR é um superconjuto próprio das gramáticas LL(k).
Podem detectar erros no início, em uma varredura da entrada
a partir da esquerda.

Thierson Couto Rosa Análise Sintática


Métodos de Análise Ascendente

Parsers LR
Devem ser automatizados (muito difícil implementar um
analisador manualmente).

Figura: Ações do Analisador Ascendente

Thierson Couto Rosa Análise Sintática


Métodos de Análise Ascendente

LR Parser
Possui um programa que usa o estado no topo da pilha e o
próximo símbolo(lookahead symbol) da entrada como índices
para a tabela de ação.
A pilha contém dois tipos de símbolos: símbolos gramaticais e
estados. Cada estado representa o prefixo de uma alavanca
que está na pillha abaixo dele. Estes prefixos são denominados
prefixos viáveis

Thierson Couto Rosa Análise Sintática


Métodos de Análise Ascendente

Tabela de ação A
É indexada por um par <estado, terminal>
Se A[sm , ai ] = shif t s - o parser desloca ai para o topo da
pilha e empilha o estado s. O próximo símbolo na entrada
passa a ser ai+1 .
Se A[sm , ai ]= acc - a cadeia de entrada é valida e deve ser
aceita
Se A[sm , ai ] = error - ocorreu um erro sintático. Iniciar a
recuperação de erro.

Thierson Couto Rosa Análise Sintática


Métodos de Análise Ascendente

Tabela de ação A
Se A[sm , ai ] = reduz(B → β) - o parser desemplilha 2 × |β|
elementos da pilha (estados e símbolos de β). Utiliza o estado
s que aparece no topo da pilha e o não terminal B para
indexar a tabela de desvio D, então, empilha B e, em seguida,
o estado indicado por D[s, B]. Neste caso, o próximo símbolo
na entrada não é modificado.

Thierson Couto Rosa Análise Sintática


Métodos de Análise Ascendente

Exemplo
Considere a gramática:
G = {VN , VT , P, E 0 }, onde VN = {E 0 , E, T, F },
VT = {id, +, ×, (, )},
P = { E 0 → E,
E → E + T,
E → T,
T → T × F,
T → F,
F → (E),
F → id
}

Thierson Couto Rosa Análise Sintática


Métodos de Análise Ascendente

Exemplo - Tabela de ação A e desvio D para a Gramática G

Figura: Tabela de ação e desvio

Thierson Couto Rosa Análise Sintática


Análise Ascendente

Simulação do Analisador do Exemplo

Figura: Analisador LR

Thierson Couto Rosa Análise Sintática


Métodos de Análise Ascendente

Estados na Pilha
O estado no topo da pilha contém a informação sobre um
prefixo viável na pilha. Ele indica o prefixo de uma alanca que
está sendo formada (ou que já se formou) na pilha e pode ser
interpretado como estado de um autômato finito capaz de
reconhecer prefixos viáveis na pilha.
Um estado representa um conjunto de itens gramaticais que
mostram para cada produção, o que já foi reconhecido e o que
falta reconhecer da produção.

Thierson Couto Rosa Análise Sintática


Métodos de Análise Ascendente

Itens LR(0)
Um item LR(0), ou simplesmente item, de uma gramática é
uma produção da com um ponto (•) em alguma posição do
lado direito da produção.
O ponto colocado à direita de um símbolo indica que foi
reconhecida na entrada uma subcadeia derivada daquele
símbolo.
Colocado à esquerda, indica que esperamos reconhecer uma
subcadeia derivada do símbolo.

Thierson Couto Rosa Análise Sintática


Métodos de Análise Ascendente

Exemplo de Item
Ex.: F → (•E) - significa que o analisador sintático está em um
estado em que ele já reconheceu um “(” e que espera reconhecer na
entrada uma subcadeia derivada de E e, após reconhecer está
subcadeia, ele espera reconhecer um “)”. Um item corresponde a
um estado que mostra o tanto de um prefixo viável que já foi
reconhecido e o tanto que falta reconhecer.

Thierson Couto Rosa Análise Sintática


Autômato LR(0)

Gramática Estendida
Para a construção dos estados do Autômato formado por itens
LR(0) utiliza-se uma gramática estendida, acrescentando-se a
produção S 0 → S.
O objetivo é caracterizar duas situações através dos itens:
S 0 → •S - indica o estado inicial do analisador sintático em
que ele espera reconhecer uma cadeia derivada de S.
S 0 → S• - indica uma situação de aceitação da cadeia.

Thierson Couto Rosa Análise Sintática


Autômato LR(0)

Construção do Estado Inicial para a Gramática do Exemplo


O primeiro item do estado inicial é E → •E, que indica que o
analisador espera que a cadeia no buffer de entrada seja
derivada de E.
Intuitivamente, esperar uma cadeia derivada de E na entrada
significa esperar reconhecer uma das cadeias deriváveis das
produções que possuem E do lado esquerdo. Logo, incluimos
no estado inicial os seguintes itens: E → •E + T e E → •T ,

Thierson Couto Rosa Análise Sintática


Autômato LR(0)

Construção do Estado Inicial - Continuação


Esperar reconhecer uma cadeia derivada de T é esperar
reconhecer uma das cadeias deriváveis de produções que
possuem T como lado esquerdo. Logo devemos incluir no
estado inicial os seguintes itens: T → •T × F e T → •F .
Por analogia, devemos incluir também os seguintes itens:
F → •(E) e F → •id
O estado inicial é, então, definido por: I0 = { E → •E,
E → •E + T , E → •T , T → •T × F , T → •F , F → •(E),
F → •id }

Thierson Couto Rosa Análise Sintática


Autômato LR(0)

Operação de Fechamento de Itens


O conjunto de ações intuitivas que foram tomadas para se obter o
conjuntos de itens que formam o estado inicial é denominado
operação de fenchamento de itens.
A operação de fenchamento de itens pode ser definida como segue:
Se I é um conjunto de itens para uma dada gramática G, então
f echamento(I) é o conjunto de itens constituídos a partir de I
pelas seguintes regras:
1 Inicialmente, acrescente todo item de I em f echamento(I).
2 Se A → α • Bβ está em f echamento(I) e B → γ é uma
produção, então adicione o item B → •γ em f echamento(I),
se ele ainda não estiver lá.
3 Aplique a regra anterior até que nenhum outro item possa ser
incluído em f echamento(I).

Thierson Couto Rosa Análise Sintática


Autômato LR(0)

f echamento({E 0 → •E})
O que fizemos para construir o estado inicial I0 foi aplicar
intuitivamente a operação fechamento no conjunto inicial de itens
{E 0 → •E }:
f echamento({E 0 → •E}) = {E 0 → •E,

Thierson Couto Rosa Análise Sintática


Autômato LR(0)

f echamento({E 0 → •E})
O que fizemos para construir o estado inicial I0 foi aplicar
intuitivamente a operação fechamento no conjunto inicial de itens
{E 0 → •E }:
f echamento({E 0 → •E}) = {E 0 → •E,
E → •E + T , E → •T

Thierson Couto Rosa Análise Sintática


Autômato LR(0)

f echamento({E 0 → •E})
O que fizemos para construir o estado inicial I0 foi aplicar
intuitivamente a operação fechamento no conjunto inicial de itens
{E 0 → •E }:
f echamento({E 0 → •E}) = {E 0 → •E,
E → •E + T , E → •T
T → •T × F , T → •F

Thierson Couto Rosa Análise Sintática


Autômato LR(0)

f echamento({E 0 → •E})
O que fizemos para construir o estado inicial I0 foi aplicar
intuitivamente a operação fechamento no conjunto inicial de itens
{E 0 → •E }:
f echamento({E 0 → •E}) = {E 0 → •E,
E → •E + T , E → •T
T → •T × F , T → •F
F → •(E), F → •id
}

Thierson Couto Rosa Análise Sintática


Autômato LR(0)

Estado 0: resultado do fechamento de E 0 → •E

Thierson Couto Rosa Análise Sintática


Autômato LR(0)

Obtendo Novos Estados a partir de um Estado


Para cada item i de I0 que possui a forma: X → α • Y β
criamos um novo estado Ii (caso não exista) que conterá o
item X → αY • β. Em seguida, incluimos em Ii o
f echamento({X → αY • β}).
O passo anterior corresponde à operação desvio(I0 , Y ).
Repetimos a operação desvio(Ii , X) para cada item de cada
estado Ii , até que nenhum novo estado possa ser criado.

Thierson Couto Rosa Análise Sintática


Autômato LR(0)

Exemplos de Aplicação da Operação desvio sobre o Estado I0

Thierson Couto Rosa Análise Sintática


Método SLR

Tabelas SLR
SLR (Simple LR) o método mais simples da classe LR e
também o menos poderoso (pode ser utilizado com um
número reduzido de gramáticas.
A tabela sintática (de ação e desvio) criada por esse método é
denominada tabela SLR.
A tabela sintática é construída tomando como base o
autômato LR(0) de uma gramática SLR.

Thierson Couto Rosa Análise Sintática


Construção de Tabelas SLR

Definições Preliminares
O analisador SLR utiliza o autômato LR(0) para derivar as
ações da tabela sintática.
Duas definições preliminares são necessárias para descrever
como a tabela pode ser criada a partir dos estados do
autômato:
Conjunto Primeiro de um símbolo.
Conjunto Seguinte de um símbolo.

Thierson Couto Rosa Análise Sintática


Construção de Tabelas SLR

Conjunto Primeiro
O conjunto primeiro de um símbolo X é utilizado para se
saber todos os terminais a que iniciam cadeias de terminais
derivadas de X.
Construção:
Se X é um terminal (token) então X está em primeiro(X).

Se X ⇒ ε, então ε está em primeiro(X).
Se X for não-terminal e X → Y1 Y2 . . . Yn , para algun n ≥ 1
então:
se para algum i, a ∈ primeiro(Yi ) e  ∈ primeiro(Yj ) para
todo j < i, inclua a em primeiro(X);
se  ∈ primeiro(Yi ), para 1 ≤ i ≤ n, inclua  em
primeiro(X).

Thierson Couto Rosa Análise Sintática


Construção de Tabelas SLR

Conjunto Primeiro - Exemplo:


Dada a gramática:
E → T E0
E 0 → +T E 0 | ε
T → FT0
T 0 → ∗F T 0 |ε
F → (E) | id
primeiro(E) =

Thierson Couto Rosa Análise Sintática


Construção de Tabelas SLR

Conjunto Primeiro - Exemplo:


Dada a gramática:
E → T E0
E 0 → +T E 0 | ε
T → FT0
T 0 → ∗F T 0 |ε
F → (E) | id
primeiro(E) = primeiro(T ) =

Thierson Couto Rosa Análise Sintática


Construção de Tabelas SLR

Conjunto Primeiro - Exemplo:


Dada a gramática:
E → T E0
E 0 → +T E 0 | ε
T → FT0
T 0 → ∗F T 0 |ε
F → (E) | id
primeiro(E) = primeiro(T ) = primeiro(F ) = {(, id}
primeiro(E 0 ) = {

Thierson Couto Rosa Análise Sintática


Construção de Tabelas SLR

Conjunto Primeiro - Exemplo:


Dada a gramática:
E → T E0
E 0 → +T E 0 | ε
T → FT0
T 0 → ∗F T 0 |ε
F → (E) | id
primeiro(E) = primeiro(T ) = primeiro(F ) = {(, id}
primeiro(E 0 ) = {+,

Thierson Couto Rosa Análise Sintática


Construção de Tabelas SLR

Conjunto Primeiro - Exemplo:


Dada a gramática:
E → T E0
E 0 → +T E 0 | ε
T → FT0
T 0 → ∗F T 0 |ε
F → (E) | id
primeiro(E) = primeiro(T ) = primeiro(F ) = {(, id}
primeiro(E 0 ) = {+, ε}
primeiro(T 0 ) = {

Thierson Couto Rosa Análise Sintática


Construção de Tabelas SLR

Conjunto Primeiro - Exemplo:


Dada a gramática:
E → T E0
E 0 → +T E 0 | ε
T → FT0
T 0 → ∗F T 0 |ε
F → (E) | id
primeiro(E) = primeiro(T ) = primeiro(F ) = {(, id}
primeiro(E 0 ) = {+, ε}
primeiro(T 0 ) = {∗,

Thierson Couto Rosa Análise Sintática


Construção de Tabelas SLR

Conjunto Primeiro - Exemplo:


Dada a gramática:
E → T E0
E 0 → +T E 0 | ε
T → FT0
T 0 → ∗F T 0 |ε
F → (E) | id
primeiro(E) = primeiro(T ) = primeiro(F ) = {(, id}
primeiro(E 0 ) = {+, ε}
primeiro(T 0 ) = {∗, ε}

Thierson Couto Rosa Análise Sintática


Construção de Tabelas SLR

Conjunto Primeiro de uma Forma Sentencial


Dada a gramática G = (VN , VT , P, S) e uma forma sentencial
α = Y1 , Y2 · · · Yn , primeiro(α) é obtido do seguinte modo:
se para algum i, a ∈ primeiro(Yi ) e  ∈ primeiro(Yj ) para
todo j < i, inclua a em primeiro(α);
se  ∈ primeiro(Yi ), para 1 ≤ i ≤ n, inclua  em
primeiro(α).

Thierson Couto Rosa Análise Sintática


Construção de Tabelas SLR

Conjunto Seguinte
O cojunto seguinte de um não-terminal A é formado pelo
conjunto de terminais a que aparecem à direita de A em
alguma forma sentencial derivada pela gramática, isto é, se

existir αAaβ, tal que S ⇒ αAaβ para algum α e β.

Thierson Couto Rosa Análise Sintática


Construção de Tabelas SLR

Conjunto Seguinte
Construção:
Inserir o token terminador de cadeia ($) em seguinte(S), onde
S é o símbolo inicial.
Se existe A → αBβ, então todo token em primeiro(β),
exceto ε deve ser inserido em seguinte(B).
Se existir uma produção A → αB ou uma produção
A → αBβ, onde primeiro(β) contém ε, então tudo em
seguinte(A) deve ser inserido em seguinte(B).

Thierson Couto Rosa Análise Sintática


Construção de Tabelas SLR

Algoritmo para Inserir Ações e Desvios na Tabela


1 Construir C = {I0 , I1 , I2 , ...In }, a coleção de itens LR(0)
2 O estado i é obtido do item Ii . As ações para o estado i:
1 Se A → α • aβ está em Ii e desvio(Ii , a) = Ij , então
ação[i, a] = “shiftf j”.
2 Se A → α• está em Ii então ação[i, a] = “reduce A → α”,
para todo a em seguinte(A).
3 Se S 0 → S• está em Ii então ação[i, $] =“aceitar’.
3 Cada entrada da [i, A] da tabela Desvio, onde Ii é um estado
do analisador e A é um não-terminal, corresponde ao resultado
da operação desvio(i, A).

Thierson Couto Rosa Análise Sintática


Construção de Tabelas SLR

Erros e Conflitos
1 Todas as entradas que ficaram vazias ao fim do processo

anteriror correspondem a erros sintáticos. Por exemplo, um


erro sintático ocorre quanto o analisador sintático está no
estado I4 e o próximo token na entrada é um "(", pois a
entrada coresspondente na tabela de ação é vazia.
2 Se uma entrada da tabela de ações contiver mais de uma
ação, temos o que é denominado de conflito e, neste caso, a
gramática não é SLR.
3 Há os seguintes tipos de conflito:
1 Conflito shift-reduce
2 Conflito reduce-reduce

Thierson Couto Rosa Análise Sintática

You might also like