Análise Sintática Ascendente
Ilustração por um exemplo
Considere a gramática
D -> T L ; T -> i | r L -> v | L , v
que representa uma declaração de variáveis a la C
Como reconhecer a palavra "u = i v , v ;" como pertencente à linguagem definida pela gramática dada ?
Se u pertence à linguagem definida pela gramática, então D => + u.
Gerando uma derivação á direita tem-se:
D => T L ; => T L , v => T v , v => T v , v ; => i v , v ;
Tente-se agora fazer a derivação no sentido contrário, isto é, indo de u para D.
Considere a gramática
D -> T L ; T -> i | r L -> v | L , v
e reduza-se a palavra "u = i v , v ;" ao símbolo inicial D.

Colocando ao contrário, tem-se
D => T L ; => T L , v => T v , v => i v , v
que corresponde à derivação à direita da palavra "u = i v , v ;".
A tabela seguinte mostra como, na prática, se a realiza esta (retro)derivação.
i v , v ; $
deslocamento
i
v , v ; $
redução por T -> i
T
v , v ; $
deslocamento
T v
, v ; $
redução por L -> v
T L
, v ; $
deslocamento
T L ,
v ; $
deslocamento
T L , v
; $
redução por L -> L . v
T L
; $
deslocamento
T L ;
$
redução por D -> T L ;
D
$
deslocamento / aceitação
D $
aceitação
A palavra à entrada foi reduzida ao símbolo inicial pelo que é aceite como pertencendo à linguagem.
A aceitação pode ser antes de consumir o $ ou depois.
Ilustração de um erro sintático
Veja-se a reação deste procedimento a uma entrada errada, por exemplo a palavra i v v ; .
i v v ; $
deslocamento
i
v v ; $
redução por T -> i
T
v v ; $
deslocamento
T v
v ; $
redução por L -> v
T L
v ; $
deslocamento
T L v
; $
rejeição
Rejeita porque Lv não corresponde ao prefixo de uma produção da gramática.
Na realidade, o erro poderia ter sido detetado dois passos antes, aquando da segunda redução, porque
v corresponde ao símbolo à entrada.
L é o símbolo que iria aparecer no topo da pilha se se fizess a redução por L -> v.
Considere a gramática
S -> i c S | i c S e S | a
e aplique-se o procedimento anterior à palavra i c i c a e a.
i c i c a e a $
deslocamento
i
c i c a e a $
deslocamento
i c
i c a e a $
deslocamento
i c i
c a e a $
deslocamento
i c i c
a e a $
deslocamento
i c i c a
e a $
redução por S -> a
Que gramática representa uma estrutura típica em linguagens de programação. Qual ?
Ilustração de conflito entre reduções
Considere a gramática
S -> A | B A -> c | A a B -> c | B b
e aplique-se o procedimento anterior à palavra c
c $
deslocamento
c
$
conflito:
redução usando A -> c
redução usando B -> c
Ilustração de falso conflito
Considere a gramática
S -> a | < S > | a P | < S > S P -> < S > | < S > S
e aplique-se o procedimento de reconhecimento à palavra "a < a > a"
a < a > a $
deslocamento
a
< a > a $
falso conflito:
redução usando S -> a
deslocamento para tentar S -> a P
Deslocamento, porque se se optasse pela redução no topo da pilha ficaria um S e
Optando pelo deslocamento e continuando...
a < a > a $
deslocamento
a
< a > a $
deslocamento, porque
a <
a > a $
deslocamento
a < a
> a $
redução por S -> a
a < S
> a $
deslocamento
a < S >
a $
deslocamento, porque
a < S > a
$
redução por S -> a
a < S > S
$
redução por P -> < S > S
a P
$
reduções por S -> a P
S
$
deslocamento
S $
aceitação
Eliminação de conflito
Pode ser possível alterar uma gramática de modo a eliminar a fonte de conflito.
Considerando que se pretendia optar pelo deslocamento, a gramática da esquerda gera a mesma linguagem que a da direita e está isenta de conflitos

if ... then ... else sem conflitos
Considere a gramática seguinte e processe-se a palavra "i c i c a e a"
S -> a | i c S | i c S' e S S´-> a | i c S' e S'

Last updated