Você está na página 1de 71

UNIVERSIDADE TCNICA DE LISBOA

INSTITUTO SUPERIOR TCNICO

COMPILADORES:
da teoria prtica

Pedro Reis dos Santos


Departamento de Engenharia Informtica
(Fevereiro, 2006)

CAPTULO 1. INTRODUO

18

dados PPP

H
PP
q  HH
H
HH

H
H


programa

interpretador

resultados
dados

programa

executvel

compilador

"

resultados

1.2 Linguagens e gramticas


Foram os matemticos Axel Thue, Emil Post e Stephen Kleene, entre outros, que comearam a estudar as propriedades matemticas das cadeias de caracteres e sequncias
destas. No entanto, foi Noam Chomsky que, em 1956, que procurou caracterizar de
uma forma precisa a estrutura das linguagens naturais. O seu objectivo consistia em
utilizar regras matemticas precisas para especificar a sintaxe das linguagens. Com a
divulgao dos computadores, nos anos seguintes, veio-se a verificar que as linguagens
a utilizar em computadores podiam ser especificadas por um dos modelos gramaticais identificados por Chomsky. Estas linguagens, designadas por livres de contexto,
podem ser linguagens de programao, podem ser linguagens de descrio de dados,
como imagens ou som, ou outro tipo de processos.
Nesta seco abordaremos as propriedades matemticas fundamentais das linguagens
e dos sistemas usados para as gerar, tais como as gramticas. As linguagens de programao, desde o Fortran, podem ser especificadas de uma forma precisa atravs de
uma gramtica. Alm disso, a gramtica permite escrever programas, designados por
analisadores sintcticos, que permitem determinar se a cadeia de caracteres est sintacticamente correcta de acordo com a linguagem. Apesar dos avanos efectuados nos
ltimos anos, a anlise precisa de linguagens naturais, como o portugus ou o ingls,

1.2. LINGUAGENS E GRAMTICAS

19

ainda limitada. O problema reside, principalmente, na inexistncia de um acordo sobre quais as frases sintacticamente correctas, nem foi ainda proposta uma gramtica
suficientemente precisa e consensual.
Nesta seco apresentaremos alguns sistemas formais que permitem definir famlias
de linguagens utilizadas frequentemente em computao. A nossa ateno principal
orienta-se para as linguagens livres de contexto, pois so as mais usadas para descrever
a sintaxe das linguagens de computao.

1.2.1 Terminologia
Antes de introduzir a especificao formal de linguagens apresentam-se algumas definies e terminologia.
alfabeto Um alfabeto, designado por , um conjunto finito no vazio de smbolos
indivisveis. Por exemplo, a lingua inglesa contm as 26 letras alfabticas e alguns sinais
de pontuao. A lingua portuguesa usa apenas 23 letras, mas inclui certos smbolos de
acentuao para algumas letras. O alfabeto ASCII ( American Standard Code for Information Interchange ) utiliza 128 smbolos, sendo utilizado na maioria das comunicaes
entre computadores. O alfabeto UNICODE, mais recente que o ASCII, pretende suportar os smbolos de todas as linguagens utilizadas no planeta e possui, no momento da
escrita deste documento, mais de 38 mil smbolos. No entanto, os aspectos mais importantes das linguagens formais podem ser modelados com apenas duas letras.
cadeia Uma cadeia de um alfabeto uma sequncia finita de smbolos de . O
nmero de smbolos na cadeia x designada por comprimento da cadeia e designado
por |x|. A cadeia vazia, de comprimento 0 ( zero ), designada por .
conjuntos de cadeias O conjunto de todas as possveis cadeias de um alfabeto designaremos por , enquanto + designa todas as cadeias no vazias e o conjunto vazio.
linguagem Uma linguagem sobre um alfabeto o conjunto de cadeias consideradas
vlidas sobre esse alfabeto. Os membros da linguagem so tambm designados por
frases da linguagem.
Uma vez que as linguagens so apenas conjuntos aceitvel aplicar as operaes tradicionais, como a unio, interseco e complemento. Alm disso, existem mais duas
operaes base sobre linguagens: a concatenao e o fecho de Kleene.

CAPTULO 1. INTRODUO

20

concatenao A concatenao de duas linguagens L1 e L2 sobre um alfabeto o


conjunto {xy|x L1 , y L2 }. Onde x = a1 a2 . . . an e y = b1 b2 . . . bn so cadeias do
mesmo alfabeto e a sua concatenao, designada por xy, a cadeia a1 a2 . . . an b1 b2 . . . bn .
fecho de Kleene Seja L0 = {} e Li = LLi para i 1, designa-se por fecho de Kleene
S
de L, representado por L , a linguagem L = i0 Li . O fecho transitivo de L, repreS
sentado por L+ , a linguagem L+ = i1 Li . Por outras palavras, o fecho de Kleene da
linguagem L consiste em todas as cadeias que podem ser formadas pela concatenao
de zero ou mais frases de L.

1.2.2 Representao de linguagens

Uma linguagem , em geral, um subconjunto de sobre alfabeto . Enquanto uma


linguagem finita pode ser definida atravs da enumerao dos seus elementos, uma
linguagem infinita no pode ser exaustivamente enumerada. Algumas linguagens infinitas podem ser definidas por regras que caracterizam todos os seus elementos. Uma
larga gama de linguagens pode ser caracterizada por regras definidas por mtodos sistemticos. De entre estes mtodos, as gramticas so o formalismo mais frequentemente
utilizado.
As gramticas formais foram introduzidas em 1943 por Emil Post, que se baseou no
trabalho de Axel Thue e outros. No entanto, foi Noam Chomsky em 1956 que estudou
a sua utilizao rigorosa na descrio formal e natural das linguagens.
O sistema mais genrico e til para representar linguagens baseado na noo formal
de gramtica. Uma gramtica um qudruplo (, V, S, P ), onde
1. um conjunto finito no vazio designado por alfabeto terminal, onde cada elemento designado por smbolo terminal.
2. V um conjunto finito no vazio disjunto de , cujos elementos so designados
por smbolos no terminais.
3. S V um smbolo no terminal especfico designado por smbolo inicial.
4. P um conjunto finito de regras ( ou produes ) da forma onde
S
S
S
( V ) V ( V ) e ( V ), ou seja, uma cadeia de terminais e no terminais contendo pelo menos um no terminal e uma cadeia de terminais e no
terminais.

1.2. LINGUAGENS E GRAMTICAS

21

Exemplo 1.1 A gramtica G = ({0, 1, 2}, {S, A}, S, P ), onde P constitudo pelas regras
S
S
2A
0A
1A

0SA2

A2
01
11

descreve as frases {0n 1n 2n , n 0}.


Hierarquia de gramticas

As gramticas podem ser divididas em quatro classes de restries gradualmente crescentes forma das regras. Esta classificao designada por hierarquia de Chomsky.
Seja uma gramtica G = (, V, S, P )
1. G tambm designada gramtica tipo-0 ou gramtica sem restries.
2. G tipo-1 ou gramtica dependente do contexto se cada regra de P obedece a || ||. Uma gramtica ainda do tipo-1 se tiver uma regra S , desde
que S no surja no lado direito de nenhuma regra.
3. G tipo-2 ou gramtica livre do contexto se cada regra de P obedece a
|| = 1, ou seja, constitudo por um s no terminal.
4. G tipo-3 ou gramtica regular se cada regra tiver uma das formas A cB, A c
ou A , onde A e B so no terminais ( podendo B = A ) e c um terminal.
Cada classe de linguagens do tipo-i contm a classe de linguagens do tipo-i+1, para
i = 0, 1, 2.
Contudo, as classes de linguagens identificadas por Chomsky no reflectem apenas as
propriedades formais das mesmas mas tambm traduzem as caractersticas fundamentais da sua computao. De facto, cada classe de gramtica processvel por uma classe
de ferramentas,
mquinas de Turing processam gramticas sem restries.
autmatos linearmente limitados processam gramticas dependentes do contexto.
autmatos de pilha processam gramticas livre do contexto.

22

CAPTULO 1. INTRODUO

autmatos finitos processam gramticas regulares.


Destes apenas trataremos os autmatos finitos e autmatos de pilha, bem como os analisadores que realizam esses autmatos.
Propriedades das gramticas

fecho Uma classe de linguagens diz-se fechada numa operao particular se cada aplicao da operao nas linguagens da classe ainda uma linguagem dessa classe. As
operaes designam operaes de unio, interseco, complemento, concatenao e fecho de Kleene. As propriedades de fecho so teis na construo de novas linguagens a
partir de linguagens existentes e para provar muitas propriedades tericas das linguagens e gramticas.
As gramticas sem restries s no so fechadas pela operao de complemento. As
gramticas livres de contexto no so fechadas pelas operaes de complemento e interseco. Finalmente, as linguagens regulares e as linguagens dependentes do contexto
so fechadas em todas as cinco operaes.

Captulo 2
Linguagens regulares
As linguagens regulares, designadas por tipo-3 na hierarquia de Chomsky ( ver 1.2.2 ),
so linguagens muito simples. Assim, a maioria das linguagens utilizadas em computao no so regulares, ou seja, no podem ser completamente descritas por gramticas
regulares. No entanto, como o seu processamento simples e eficiente, as gramticas regulares so frequentemente utilizadas para processar partes, por vezes significativas, de
linguagens mais complexas. Desta separao do processamento da linguagem por uma
gramtica regular e por outra gramtica, em geral livre de contexto, resulta uma maior
eficincia em termos de espao ocupado pelo analisador e do tempo gasto na anlise das
descries. Resulta, ainda, uma simplificao da gramtica livre de contexto, facilitando
a sua descrio, realizao e execuo.
O processamento da parte regular de uma linguagem designa-se por anlise lexical. A
anlise lexical tem a vantagem de ser um processo que podendo ser formalmente descrito atravs de expresses regulares pode produzir uma rotina que realiza essa anlise.
Essa rotina modela um autmato finito derivado matematicamente das expresses regulares especificadas.
A anlise lexical utilizada essencialmente na categorizao dos elementos de uma linguagem em classes de smbolos, em vez de caracteres individuais. Nomeadamente,
permite separar nomes em palavra reservadas, identificadores e literais, bem como classificar outros smbolos como terminadores, separadores e operadores. Permite ainda
encapsular dependncias do sistema operativo, como por exemplo, o carcter ou caracteres de mudana de linha. Localiza a manipulao dos diferentes formatos de representao de caracteres, como o ASCII, UNICODE ou, no caso da lingua portuguesa, o
ISO-LATIN-15 ou a pgina 860. Esconde do restante compilador elementos como comentrios e caracteres brancos ( em geral designam o espao e o tabulador horizontal ).
Realiza a substituio de macros simples. Em resumo, facilita o processamento transformando uma linguagem descrita por uma sequncia de caracteres numa sequncia de
25

CAPTULO 2. LINGUAGENS REGULARES

26

elementos lexicais, designados por tokens. A restante anlise da linguagem pode assim
ser baseada em elementos categorizados.

2.1 Expresses regulares

Expresses regulares foram introduzidas em 1956 por Stephen Kleene para o estudo
das propriedades das redes neuronais. As linguagens representadas por expresses regulares so designadas por linguagens regulares. As expresses regulares apresentam
representaes das linguagens que so frequentemente claras e concisas, contudo, muitas linguagens no so regulares.
Uma expresso regular sobre um alfabeto , e a linguagem regular que a expresso
regular representa, pode ser definida por:
1. o smbolo uma expresso regular e representa a linguagem vazia.
2. o smbolo uma expresso regular e representa a linguagem cujo nico membro
a cadeia vazia, ou seja, {}.
3. para cada c , c uma expresso regular e representa a linguagem {c}, onde o
nico membro a cadeia de um s carcter c.
4. se r e s so expresses regulares e representam as linguagens R e S, ento (r|s), (rs)
S
e (r) so expresses regulares que representam R S, RS e R , respectivamente.
Exemplo 2.1 A expresso regular ((0(0|1))|((0|1) 0)) sobre o alfabeto {0, 1} representa a
linguagem regular que consiste em todas as cadeias de digitos binrios que comeam ou terminam
com 0.

2.1.1 Operadores das expresses regulares

De acordo com a definio acima, as expresses regulares so construdas por operadores com determinadas propriedades. A esses operadores atribuiremos prioridades por
forma a simplificar a escrita das expresses regulares. Considerando as propriedades
algbricas dos operadores base possvel introduzir identidades algbricas para expresses regulares por forma a construir expresses equivalentes. Duas ou mais expresses
regulares que representam a mesma linguagem so designadas por equivalentes.

2.1. EXPRESSES REGULARES

27

Uma expresso regular pode ser formada pelos seguintes operadores, considerando
duas expresses regulares p, q:

unio: designado por p|q comutativo, associativo e idempotente ( p|p = p ), representando a unio das expresses regulares originais. o elemento neutro da unio.
concatenao: designado por p q associativo e distributivo em realo escolha e
mais prioritrio que a escolha. elemento neutro e o elemento absorvente na
concatenao.
fecho de Kleene: designado por p idempotente ( p = p ) e mais prioritrio que
a concatenao. Representa o conjunto de frases constitudas por zero ou mais
repeties das frases de p. Alm disso p = (p|).
parnteses: permite alterar a prioridade dos operadores.

Exemplo 2.2 Atendendo s prioridades dos operadores, a expresso regular a|bca sobre o alfabeto {a, b, c} corresponde a a|(b(c(a))).

Alm dos operadores base ainda usual utilizar outros operadores, construdos a partir
dos anteriores, que simplificam a descrio das linguagens atravs de expresses regulares.

opo: designado por p? designa zero ou uma ocorrncias de p, ou seja, p|.


fecho transitivo: designado por p+ designa uma ou mais ocorrncias de p.
p+ equivalente a p p, e p equivalente a p + |.
parnteses rectos: designado por [pq] ou [p q] designam p|q e os smbolos de ordem
entre p e q (inclusiv), respectivamente.
A ordem depende da representao utilizada ( ASCII, UNICODE, EBCDIC, etc. )
pelo que apenas se garante a ordem das letras maisculas [A Z], minsculas
[a z] e digitos decimais [0 9].
complemento: designado por [pq] ou [pq] designam todos os smbolos de excepto
p|q e todos os smbolos de excepto os smbolos de ordem entre p e q (inclusiv),
respectivamente.

CAPTULO 2. LINGUAGENS REGULARES

28

2.1.2 Gramticas regulares

Uma linguagem regular descrita por uma gramtica regular. Tal como vimos em 1.2.2
uma gramtica regular tem apenas regras da forma A c, A , e A cB ou A Bc,
onde A e B so no terminais ( podendo B = A ) e c um terminal. A gramtica diz-se
linear direita se usar regras da forma A cB ou linear esquerda se usar regras da
forma A Bc, no podendo usar ambas as formas simultaneamente. Alm disso, a
regra A c pode ser deduzida por substituio da regra B numa das outras.
Se L tem uma gramtica regular, ento L uma expresso regular. 1 Se L uma expresso regular, ento L gerado por alguma gramtica linear esquerda e por alguma
gramtica linear direita. 2 Em resumo, gramticas regulares caracterizam expresses
regulares, pois uma linguagem regular se e s se tiver uma gramtica linear esquerda e se e s se tiver uma gramtica linear direita. Ou seja, gramticas regulares e
expresses regulares so representaes equivalentes de linguagens regulares.

2.1.3 Propriedades das expresses regulares


As expresses regulares so apenas uma forma mais concisa de descrever linguagens
regulares que as gramticas regulares. Como as gramticas regulares so fechadas nas
5 operaes base ( ver 1.2.2 ) pode-se combinar livremente as expresses regulares que
ainda se tem uma expresso regular. Como uma expresso regular fechada na concatenao qualquer tcnica aplicada s expresses regulares a e b pode ser aplicada a
ab. Como fechada na unio, o que se pode fazer a uma expresso regular a1|a2|...|an
pode-se fazer individualmente a a1, a a2 etc. Como fechada no fecho de Kleene podese escrever regras concisas sem indicar o limite, por exemplo, criar expresses regulares
para padres de dimenso finita mas arbitrria. Nomeadamente, os identificadores no
tm nmero limite de caracteres em muitas linguagens.

2.2 Autmatos finitos


A modelao de linguagens regulares, quer tenham sido especificadas por expresses
regulares como por gramticas regulares, pode ser efectuada por autmatos finitos. Da
mesma forma, uma linguagem reconhecida por um autmato finito uma linguagem
1

teorema 9.1 de [HU79]

teorema 9.2 de [HU79]

2.2. AUTMATOS FINITOS

29

regular. Existem diversos algoritmos, representados pelas setas da figura seguinte, que
permitem converter expresses regulares de e para diversos tipos de autmatos finitos,
cada um com o seu campo de aplicao.
Thompson

expresses
regulares

H
Y
HH
H
HH Kleene
HH
HH
H

autmato

finito det.
minimizado

Hopcroft

ZZ
}
Z
Z
Z
Z
~

autmato
finito no
determinista
subconjuntos
?

autmato
finito
determinista


gramtica
regular

Nas seces seguintes abordaremos esses autmatos e os algoritmos que permitem obtlos.
Os autmatos finitos so constitudos por um conjunto de estados e por transies dirigidas e etiquetadas entre esses estados. As etiquetas so smbolos da gramtica ou
. Um desses estados designado por inicial, podendo ter um mais estados finais. O
autmato finito pode ser representado graficamente ou por tabela.

2.2.1 Diagrama de transio


Um autmato finito pode ser presentado graficamente por um diagrama de transio,
ou seja, um qudruplo D = (S, , SF , q0 ) onde:
S um conjunto de estados, representados por crculos.
(qi , x) = qj , onde qi S, qj S e x {}, so transies entre estados
representadas por setas etiquetadas por um dos smbolos de entrada ou .
SF S e #S 1, um conjunto constitudo por um ou mais estados finais,
representados por crculos duplos concntricos.
q0 S um estado inicial, indicado por uma seta sem origem em outro estado.

CAPTULO 2. LINGUAGENS REGULARES

30

O reconhecimento de uma frase pode ser efectuado por simulao da rede, comeando
o processamento no estado inicial. Se no fim do processamento nos encontrarmos num
estado final a frase est correcta e faz parte da linguagem em questo. Se o estado
corrente, no fim do processamento, no for um estado final devem-se procurar outros
caminhos.
Exemplo 2.3 A expresso regular (a|b) abb, que designa as frases do alfabeto = { a , b }
que terminam em abb, pode ser representada por
#A a
#


l 
U
lA
a
b
b
I3
I1
I0
I2




b
b b

2.2.2 Tabela de transio


Uma outra representao, menos intuitiva mas mais til do ponto de vista computacional, a tabela de transio. Na tabela de transio os estados representam uma das
dimenses da tabela bidimensional e as etiquetas a outra dimenso. Cada posio da
tabela representa os estados que podem ser atingidos a partir desse estado com esse
smbolo ou etiqueta. Os estados finais so representados dentro de caixas e o estado
inicial assume-se ser o primeiro estado da tabela.
Exemplo 2.4 A expresso regular do exemplo 2.3, pode ser representada por
estado
a
b
0
{0, 1} {0}
1

{2}

{3}
2
0

2.2.3 Autmato finito no determinista


Um autmato finito no determista um quintuplo (S, {}, , SF , s0 ), onde S so os
estados, o alfabeto, uma funo de transio , um estado inicial s0 S e um conjunto
de estados finais SF S. A funo de transio : S
7 2S faz corresponder a cada
par estado e smbolo de entrada um conjunto, eventualmente vazio, de estados. Onde o
conjunto de todos os subconjuntos de S, designado por powerset, representado por 2S .

2.2. AUTMATOS FINITOS

31

A utilizao de transies vazias, que no consomem nenhum smbolo da sequncia de


entrada, facilita a construo do autmato, mas existe sempre um autmato no determinista equivalente sem transies vazias 3 . Quer o exemplo 2.3 como o exemplo 2.4
so duas representaes de um autmato finito no determinista.
Para descobrir se uma frase, ou sequncia de entrada, faz parte da linguagem necessrio procurar um caminho entre o estado inicial e um dos estados finais do autmato.
A procura pode ser efectuada de diversas formas, como por exemplo em profundidade
e em largura. Se a procura for em profundidade segue-se um caminho possvel e, caso
no seja atingido um estado terminal, recua-se e tenta-se outra possvel soluo. Na
procura em largura vo sendo simultaneamente consideradas as diversas opes em
cada estado. Computacionalmente a soluo de procura em profundidade parece mais
simples de realizar mas a sua execuo pesada.
Algoritmo de Thompson
Existe sempre um autmato no determinista, com transies vazias, que aceita a linguagem descrita por uma expresso regular 4 . O algoritmo de Thompson no mais
que a demonstrao da afirmao anterior. Para tal comeamos pela trs expresses
com que definimos as expresses regulares ( ver 2.1 ),



q0




r=




- q
qf
0




r=

 

a
- q
- q
0
f
 


r=a

como as expresses regulares so fechadas nas operaes base ( ver 1.2.2 ), temos que a
operao de unio de duas expresses regulares r e s tambm a unio das linguagens
descritas por cada uma destas expresses regulares L(r|s) = L(r) L(s),



q1
f1 Q
>

QQ





s


L(r)

- q
f0
0




Z


3


ZZ
~ q
f2 
2



L(s)

teorema 2.2 de [HU79]

teorema 2.3 de [HU79]

CAPTULO 2. LINGUAGENS REGULARES

32

a operao de concatenao de duas expresses regulares r e s a concatenao das


linguagens descritas por cada uma destas expresses regulares L(rs) = L(r)L(s),


- q
f1
1



L(r)




- q
f2
2




L(s)

na prtica, o estados f1 e q2 podem ser fundidos num s, poupando um estado e eliminando a transio vazia.
O fecho de Kleene de uma expresso regular s o fecho de Kleene da linguagem descrita
pela expresso regular L(s) = L(s),

 

 
?

- q
- q
f0
f1
0
1
 

 
L(s)
6

Notar o sentido das setas nas transies vazias.


A construo de uma expresso regular complexa resume-se sucessiva aplicao das
diversas ocorrncias das operaes por ordem decrescente de prioridade.

Exemplo 2.5 A expresso regular do exemplo 2.3 representada pelo autmato finito no determinista da figura, construdo pelo algoritmo de thompson,

a2
4 Z

*


? 
~
Z

0
1
6
7
8



HH

>

j
6
b3
5 


a



?
b





13
12
11
10
9



2.2. AUTMATOS FINITOS

33

2.2.4 Autmato finito determinista

Um autmato finito determista um quintuplo (S, , , SF , s0 ), onde S so os estados,


o alfabeto, uma funo de transio , um estado inicial s0 S e um conjunto de estados
finais iSF S. A funo de transio : S
7 S faz corresponder a cada par estado
e smbolo de entrada um conjunto, eventualmente vazio, de estados.
Num autmato finito no determinista as transies a partir de cada estado so disjuntas e no vazias. Ou seja, no podem existir transies vazias e, no mximo, s pode
haver um transio para cada smbolo a partir de um estado.
Do ponto de vista da tabela de transio, a restrio introduzida pelos autmatos finitos determinista, implica que cada posio da tabela s contm um nico estado. Se
cada estado for representado pelo seu nmero, basta representar o conjunto vazio por
um nmero invlido, correspondente a uma situao de erro, por exemplo -1. Assim,
cada expresso regular representada por uma tabela de transio, a que teremos de
acrescentar uma coluna para indicar os estados finais.
Por outro lado, como o autmato determinista, no existe necessidade de tentar diversas transies para encontrar uma soluo vlida. De facto, ou existe uma transio
vlida ou a sequncia de entrada no obedece expresso regular que originou a tabela.
Desta forma, por cada carcter lido da sequncia de entrada, o analisador executa um
passo, consultando a tabela que indica o estado seguinte. Ou seja, em linguagem C,
algo do tipo,

int lexical(int tabela[][256], int final[]) {


int ch, estado = 0;
while ((ch = getchar()) != EOF)
if ((estado = tabela[estado][ch]) == EOF) return FALSE;
return final[estado];
}

onde a tabela suporta todos os 256 caracteres que podem ser devolvidos pela funo de
leitura getchar() e EOF representa quer o fim da sequncia de entrada, quer o estado
de erro na tabela. A tabela final tem tantos elementos quantos os estados, ou seja o
nmero de linhas da tabela, indicando se cada estado final ou no.

CAPTULO 2. LINGUAGENS REGULARES

34

2.2.5 Converso por construo de subconjuntos

Se uma linguagem aceite por um autmato finito no determinista ento existe um


autmato finito determinista que aceita essa mesma linguagem. 5 O algoritmo de construo de subconjuntos permite obter um autmato finitos determinista a partir de um
no determinista, atravs de uma procura em largura.

A construo de subconjuntos inicia-se no estado inicial e, a partir deste estado, calculase todos os restantes estados que se podem atingir a partir deste estado apenas atravs
de transies vazia. Este conjunto de estados, incluindo o estado inicial, designado
por f echo ({q0 }) e passa a representar o estado inicial do autmato finito determinista, que designaremos por I0 . A partir de cada um dos estados que contituem I0
vamos determinar quais os estados que so atingidos atravs de uma s transio para
cada um dos smbolos do alfabeto . Estes novos conjuntos, designados por move(I0 , a),
onde a , formam o ncleo dos novos estados deterministas. O estado determinista
completamente calculado atravs do f echo (move(I0 , a)), para cada smbolo. No
entanto, se o ncleo de um novo estado igual ao ncleo de um estado j existente, no
necessrio calcular o seu fecho, pois trata-se de uma repetio do estado anterior, que
identificaremos colocando o estado entre parnteses e colocaremos ... para designar os
restantes estados do fecho. O processo termina quando no houver mais estados deterministas por calcular. Os estados deterministas considerados finais so todos aqueles
que contenham pelo menos um estado final do autmato no determinista, que representaremos colocando um quadrado volta do estado.

Para construir os subconjuntos utilizaremos uma tabela com 5 colunas, que representam
respectivamente: o estado determinista a calcular, o smbolo de entrada a considerar, o
ncleo no determinista que obtm, o restante f echo e, finalmente, o novo estado
determinista. Notar que o estado determinista indicado na ltima coluna constitudo
pelos estados no deterministas das duas colunas anteriores.

Exemplo 2.6 A tabela de construo de subconjuntos da expresso regular do exemplo 2.3 representada pelo autmato finito no determinista do exemplo 2.5
5

teorema 2.1 de [HU79]

2.2. AUTMATOS FINITOS

35

a
b
a
b
a
b
a
b

move
0
4, 9
5
4, 9
5, 11
4, 9
5
4, 9
5, 13

f echo \move
1, 2, 3, 7, 8
1, 2, 3, 6, 7, 8, 10
1, 2, 3, 6, 7, 8
...
1, 2, 3, 6, 7, 8, 12
...
...
...
1, 2, 3, 6, 7, 8

novo estado
I0
I1
I2
(I1 )
I3
(I1 )
(I2 )
(I1 )
I4

a
b

4, 9
5

...
...

(I1 )
(I2 )

estado

entrada

I0
I1
I2
I3
I4

A partir da tabela, e eliminando as duas colunas referentes aos estados do autmato


no determinista, ficamos com as transies do autmato determinista. O estado da
primeira coluna tem uma transio etiquetada pelo smbolo da segunda coluna para
o estado da ltima coluna. A partir desta informao possvel construir a tabela de
transio ou a representao grfica.
Exemplo 2.7 A tabela do exemplo 2.6 permite determinar o diagrama de transio, de onde
eliminmos o prefixo I pois j no existe confuso com os estados no deterministas,
J
b
J
^
2 



a
0


a

b
3



?/

b
1

a7
 o
SS



4



A correspondente tabela de transies pode ser igualmente deduzida da tabela do exemplo 2.6 ou
do diagrama de transio acima,
estado
0
1
2
3
4

a
1
1
1
1
1

b
2
3
2
4
2

36

CAPTULO 2. LINGUAGENS REGULARES

A representao computacional da tabela directa, contendo apenas duas colunas pois o alfabeto
tem apenas dois elementos.

2.2.6 Minimizao da tabela


O nmero de estados do autmato finito determinista obtido atravs da construo de
subconjuntos no , necessariamente, mnimo. De facto, frequente encontrar estados
absolutamente equivalentes a outros, podendo ser fundidos num s estado. O nmero
destes estados pode ser significativo para tabelas que representam linguagens regulares
de interesse prtico.
O algoritmo de Hopcroft permite determinar os estados equivalentes a partir de sucessivas parties dos estados calculados. A partio inicial constituda por trs grupos,
um contendo os estados finais, outra os estados no finais e uma ltima contendo o
estado de erro, correspondente ao conjunto vazio. De facto, mesmo que existissem estados equivalentes entre esses grupos a sua fuso implicaria a perda da informao sobre
se a sequncia era aceite ( estado final ) ou no.
O algoritmo consiste em fragmentar os grupos iniciais em outros subgrupos, se os respectivos estados no poderem ficar juntos. Para que os estado possam permanecer num
mesmo grupo necessrio que, qualquer que seja o smbolo de entrada, todos esses estados transitem para estados que, tambm eles, pertenam a um mesmo grupo. Como
em cada nova interao, que se designa por partio, vo sendo criados novos grupos,
estados que antes pertenciam ao mesmo grupo podem no poder continuar juntos. O
processo repete-se at que no sejam criados novos subgrupos.
Notar que os grupos criados podem conter vrios estados, desde que estes contenham
todos transies para os mesmos estados da partio anterior. Tambm no se deve
assumir que apenas estados com entradas iguais na tabela que podem ser agrupados,
podendo ter transies para estados distintos de um mesmo grupo para cada smbolo.

Exemplo 2.8 A tabela do exemplo 2.7 no tem estado de erro pelo que a partio inicial contm
apenas dois grupos. Para mais, todos os estados transitam para o estado 1 com o smbolo de
entrada a. Desta forma, e neste caso, apenas o smbolo b pode forar a separao dos estados. Dos
quatro estados no terminais, apenas o estado 3 transita com b para um grupo diferente, ou seja
o grupo dos estados finais. Assim, o estado 3 deve ser separado dos restantes passando a haver 3
grupos na nova partio. Agora o estado 1 que transita tambm com b para um grupo distinto
dos outros dois estados, pois na nova partio o estado 3 j est separado.

2.2. AUTMATOS FINITOS

P0

a,b

P1




0, 1, 2, 3

37


6 7

0, 1, 2







7
6 








a,b

?






P2






 

0, 2


7


a
b
?

1 Z
a 
}
Z

6 @@


b
3 
 

@ 
?
@




Notar que os estados 0, 1, 2, 3 da partio P0 transitam para eles prprio com o smbolo a, mas
divergem quanto s transies com o smbolo b. Conseqeuntemente, na partio P1 o estado 3
separado pois o nico que transita para fora do grupo com o smbolo b. No entanto, os trs
estados restantes ainda no concordam quanto transio com o smbolo b, pois com a sada do
estado 3 do grupo apareceram novas inconsistncias. Desta forma, na partio P2 o estado 1
igualmente isolado, j sendo possvel representar todas as transies do autmato inicial. Assim,
apenas os estados 0 e 2 podem ser agrupados.
Graficamente podemos representar as sucessivas parties, de uma forma mais simples, por uma
rvore,

@

0, 1, 2, 3

@
R4
@
P0

- 0, 1, 2 P
- 0, 2
PP
S
PP
q1
P
S
SS
-3
w 3
-4
P1

-4
P2

A partir do autmato finito determinista, na sua representao grfica ou por tabela,


pode-se obter directamente uma gramtica regular. Para tal basta considerar os tipos
de regras apresentadas em 2.1.2, transformando cada transio (qi , a) = qj numa regra
Si aSj e acrescentando para cada estado final qf uma regra Sf .

CAPTULO 2. LINGUAGENS REGULARES

38

Exemplo 2.9 Considerando a tabela, j minimizada, do exemplo 2.7, obtm-se directamente a


gramtica regular correspondente, que representaremos com 4 smbolos no terminais cujo ndice
reproduz o nmero do estado do autmato,
estado
0
1
3
4

a
1
1
1
1

b
0
3
4
0

S0
S1
S3
S4

a S1 | b S0
a S1 | b S3
a S1 | b S4
a S1 | b S0 |

2.2.7 Construo de Kleene


Se uma linguagem aceite por um autmato finito determinista, ento pode ser descrita
por uma expresso regular 6 . Ou seja, se a partir do autmato finito determinista gerado
possvel produzir a expresso regular inicial, ou uma expresso regular equivalente.
Assim, fecha-se o ciclo e garante-se a correco de todo o processo.
k
Considere-se que Rij
o conjunto de todas as sequncias do autmato entre os estado
qi e qj sem passar por nenhum estado com nmero superior a k. Notar que para passar
por um estado necessrio entrar e sair. Logo i ou j podem ser maiores que k. Uma vez
n
que nenhum estado tem um nmero superior a n, Rij
representa todas as sequncias
entre qi e qj .

O autmato no pode ter entradas no estado inicial, logo caso tais entradas existam
necessrio acrescentar um novo estado inicial com uma transio vazia para o anterior
estado inicial.
0
O algoritmo consiste em introduzir as transies existentes em Rij
= {a|(qi , a) = qj }
0
{|i = j}, ou seja, se i = j ento faz parte de Rij e se existirem transies directas entre
0
os estados qi e qj ento os smbolos dessas transies tambm fazem parte de Rij
.

Os restantes valores so calculados recursivamente com base nos anteriores atravs da


k1
k1
k1
k1
k
expresso Rij
= Rik
(Rkk
) Rkj
|Rij
para k n onde n o estado de maior nmero.
Ou seja, construindo caminhos sucessivamente mais compridos e que passam por mais
estados. As expresso regular final a unio de todas as expresses regulares entre o
n
estado inicial e cada um dos estados finais L = |sj SF R0j
.
Exemplo 2.10 Considerando a tabela do exemplo 2.7, verifica-se que como existe um s estado
4
. A expresses
terminal 4 , uma expresso regular que representa o autmato obtida por R04
0
Rij que representam as todas as transies possveis entre os vrios estados,
6

teorema 2.4 de [HU79]

2.3. ANALISADOR LEXICAL


0
Rij
i=0
i=1
i=2
i=3
i=4

j=0

39
j=1
a
a|
a
a
a

j=2
b

b|

j=3

j=4

4
Calculando apenas as expresses intermdias necessrias ao clculo de R04
, e simplificando
4
3
3
3
3
3
3
R04 = R04 (R44 ) R44 | R04 = R04 (R44 ), temos,
k
Rij
1
R02
1
R03
1
R04
1
R22
1
R23
1
R24
1
R32
1
R33
1
R34
1
R42
1
R43
1
R44
2
R03
2
R04
2
R33
2
R34
2
R43
2
R44
3
R04
3
R44
4
R04

expresso resultante
a(a | ) | b
a(a | ) b |
a(a | ) |
a(a | ) | (b | )
a(a | ) b |
a(a | ) |
a(a | ) |
a(a | ) b |
a(a | ) | b
a(a | ) | b
a(a | ) b |
a(a | ) |
b(b | ) (a + b) | (a + b)
b(b | ) |
(b | ) (a + b) | (a + b | )
(b | ) | b
b(b | ) (a + b) | (a + b)
b(b | ) |
(b a + b)(a + b | ) b |
(b a + b)(a + b | ) b |
(b (a + b) + b)(b (a + b) + b | )

simplificao
b
a+b

b|
a+b

(a + b) |
b
b
a+b

ba+b

a+b|
b
ba+b

b (a + b) + b
b (a + b) + b |
(b (a + b) + b)+

A expresso resultante obtida (b (a + b) + b)+ pode ser convertida em (b (a ab) a abb)+


que equivalente expresso original (a|b) abb.

2.3 Analisador lexical


Saber se uma frase, ou sequncia de entrada, obedece a uma gramtica regular apenas
parte do problema. Na realidade, a anlise lexical de linguagens deve conseguir identi-

CAPTULO 2. LINGUAGENS REGULARES

40

ficar repeties de subconjuntos da linguagem e permitir associar aces identificao


desses conjuntos. S dessa forma possvel produzir resultados como consequncia da
identificao de componentes da linguagem.
A soluo consiste em dividir a linguagem numa unio de expresses regulares L =
(r1 |r2 | . . . |rn ). Devido s propriedades de fecho das expresses regulares sobre a operao de unio, podemos subdividir o problema. Para tal basta considerar um estado
inicial que deriva, atravs de transies vazias, cada uma das expresses regulares. O
autmato resultante considera, simultaneamente, as diversas expresses regulares.
Para determinar qual a expresso regular reconhecida, necessrio associar cada estado
final com a respectiva expresso regular. O processamento de uma frase pode atravessar
diversos estados finais, s parando quando se atinge um estado de erro. Neste ponto
necessrio procurar o ltimo estado final atingido e considerar reconhecida a respectiva
expresso regular. O analisador recomea o processamento no estado inicial e os smbolos lidos aps o ltimo estado final considerado devem ser novamente processados.
Notar que este processamento considera sempre o reconhecimento da sequncia de entrada mais comprida. Convm no confundir com a expresso regular mais comprida.
Caso contrrio, as sequncias de entrada curtas mas vlidas impediriam o reconhecimento das restantes.
A minimizao da tabela segue o mesmo princpio enunciado atrs, mas a partio inicial tem de considerar os estados finais de expresses regulares distintas como pertencendo a grupos iniciais distintos. Assim, alm do grupo de estados no terminais e do
grupo de erro, necessrio considerar tantos grupos de estados finais quantas as expresses regulares existentes. Se o grupo de estados finais de uma expresso regular for
um conjunto vazio, ento essa expresso regular nunca reconhecida.
Exemplo 2.11 O autmato finito no determinista que descreve a linguagem composta pela
unio das expresses regulares aaa e (a|b) pode ser representada por,


 
aaa1
2
3
4
 
r1




a0
6
8 Ze
e
3


Z


~
Z

Z
~
Z
e
5 e
10
r2



e
Q 
>

Q
s
b
7
9


A tabela de anlise resultante

2.3. ANALISADOR LEXICAL

41
estado
0
1
2
3
4

a
1
3
E
4
E

b regra
2
E
2
E
2
E
E
1

Notar que os estados 2 e 4 no podem ser agrupados, embora sejam ambos finais e contenham as
mesmas transies, pois pertencem a grupos finais distintos. Relembra-se que os estados podem
ser agrupados mesmo que no tenham transies iguais, basta que tenham transies para estados
que pertenam ao mesmo grupo.
A anlise da frase aa termina no estado 3, depois de ter passado pelo estado 1. Como este estado
no final necessrio procurar o ltimo estado final, neste caso o estado 1. Caso no exista um
estado final no caminho percorrido a sequncia de entrada incorrecta. No caso da frase aa
necessrio recuar um estado, e consequentemente repor o ltimo smbolo de volta na sequncia
a processar, aceitando a expresso regular (a|b). O analisador depois reiniciado no estado 0 e
processa novamente a letra a, que acabou de repor, aceitando mais uma vez a mesma expresso
regular e terminando o processamento por ter atingido o fim da frase.
No caso de um estado final, do autmato determinista, conter mais de um estado final do autmato no determinista, existe um conflito. O conflito resolvido, em geral,
optando por uma das possveis expresses regulares. A soluo mais frequentemente
adoptada pelas ferramentas consiste em considerar prioritria a expresso regular que
surje em primeiro lugar na especificao da gramtica. Contudo, esta soluo obriga a
uma cuidada escrita das expresses regulares, por forma a garantir que todas so devidamente reconhecidas. Notar que os conflitos surjem apenas entre expresses regulares
que possam reconhecer sequncias de igual comprimento.
Exemplo 2.12 Considere-se a linguagem descritas pela unio das seguintes expresses regulares
identificadas por ordem de prioridade decrescente, bem como a tabela de anlise resultante,

r1

r2

r3

aab
aa
(a|b)*

estado
0
1
2
3
4
5

a
1
3
4
4
4
4

b
2
2
2
5
2
2

regra
3
3
3
2,3
3
1,3

da tabela de anlise conclui-se que caso a expresso regular 3 tivesse prioridade sobre as restantes,
estas nunca seriam reconhecidas.

42

CAPTULO 2. LINGUAGENS REGULARES

2.3.1 Compactao da tabela

Na prtica, na tabela de um linguagem, com um alfabeto constitudos por muitos smbolos distintos, frequente encontrar colunas iguais. Tambm podem existir linhas iguais
se pertencerem a grupos de minimizao distintos, mas tais ocorrncias so escassas.
Notar que a utilizao de digitos decimais em geral indistinto do seu valor, ficando
cada uma das 10 colunas com entradas iguais na tabela. O mesmo pode acontecer com
certas classes de caracteres e operadores ou separadores.
Estes conjuntos de caracteres, cujas entradas na tabela tm os mesmos valores para todos os estados do autmato finito determinista minimizado, so designados por classes
de equivalncia. A compactao da tabela efectuada introduzindo um vector de comprimento igual ao alfabeto da linguagem, onde cada entrada indica a coluna da tabela
a utilizar. Nesta situao podem-se remover todas as colunas duplicadas, apontando
todos os smbolos da mesma classe de equivalncia para a mesma coluna.
Do ponto de vista do analisador lexical desejvel que todos os operadores e separadores constitudos por um nico carcter possam ser reconhecidos por uma s regra, por
exemplo [ + /(); , :], em vez de se reconhecer individualmente cada um. Na grande
maioria dos casos, esta soluo no tem implicaes na restante anlise das linguagens
pois os analisadores sintcticos j reconhecem caracteres individuais. O reconhecimento
individual de cada carcter obriga a considerar expresses regulares distintas, o que
obriga criar mais estados finais distintos.
A tabela de anlise resultante, aps a compresso das colunas iguais, pode ainda ser
mais comprimida atravs de mtodos genricos de compresso de matrizes esparsas.
Estes mtodos, que trataremos mais adiante, permitem tirar partido do facto de certo
valor, por exemplo 0, existir em mais de metade das entradas da tabela. Embora as
tabelas de anlise lexical no apresentem tais caractersticas, ao contrrio das tabelas de
anlise sintctica, pode-se considerar entradas por omisso ( default, em ingls ). Para
tal cria-se uma nova coluna na qual se coloca o valor mais frequente em cada linha.
As ocorrncias desse valor em cada linha so substitudas por uma entrada especial, em
geral codificada com o valor 0, o que significa que quando este valor encontrado devese considerar a entrada por omisso. A tabela resultante passa a conter uma quantidade
significativa de valores por omisso, podendo em casos reais atingir 90% de todas as
entradas da tabela. A tabela pode agora ser compactada por algoritmos genricos de
compresso de matrizes esparsas.

2.3. ANALISADOR LEXICAL

43

2.3.2 Analisadores explicitamente codificados


At ao momento considermos que o autmato finito determinista era codificado como
uma tabela, como a do exemplo 2.7, e que um pequeno programa, como o apresentado
na seco 2.2.4, determina o estado seguinte com base na tabela e carcter lido. Contudo, existem solues que no utilizam tabelas e que se designam por explicitamente
codificados ou hardcoded. Estas solues so em geral mais rpidas custa de um executvel de maiores dimenses, em especial no caso de mquinas RISC.
Consideremos uma abordagem baseada em saltos (gotos) que, contudo, no pode ser
utilizada em linguagens sem essa instruo como o Java. Cada estado identificado
por uma etiqueta, efectuando saltos de acordo com carcter lido logo aps a etiqueta.
Por exemplo, a partir do estado 4 da tabela do exemplo 2.9 obtm-se

state4:
in = *input++;
if (in == a) goto state1;
if (in == b) goto state0;
if (in == 0) return 1; /* s para estados finais */
goto error;
/* termina cada estado */
Outra soluo possvel, sem recurso a saltos, consiste em codificar cada estado como
uma funo, sendo os saltos para as etiquetas subtitudos por chamadas s rotinas que
representam os respectivos estados. No entanto, esta soluo no to eficiente, pois
as chamadas e retorno das rotinas so em geral operaes lentas. Alm disso, utiliza a
pilha do processador para coleccionar os estados por onde vai passando. Assim, a profundidade mxima da pilha limita a maior sequncia a ser reconhecida. Tal limitao
no tem vantagem pois, ao contrrio dos analisadores sintcticos descendentes preditivos que veremos adiante, a informao deixada na pilha no tem interesse prtico
(excepto, eventualmente, para efeitos de backtracking). A partir da gramtica regular do
exemplo 2.9, a regra S4 correspondente ao estado 4 pode ser codificada como

static int state4() {


register char in = *input++;
if (in == a) return s1();
if (in == b) return s0();
return 1;
/* estados no finais retornam 0 */
}

CAPTULO 2. LINGUAGENS REGULARES

44

2.4 Exerccios
Exerccio 2.1 Considere o diagrama de transio do autmato finito no determinista do exemplo 2.3. Determine, atravs do mtodo dos subconjuntos, a tabela de transio do autmato finito
determinista. Compare o resultado que obteve com a tabela do exemplo 2.9.

Exerccio 2.2 Considere a expresso regular (aa|ab|ba|bb) definida sobre o alfabeto = {a, b}:

1. Construa o autmato finito no determinista (NFA) pelo algoritmo de Thompson a que


corresponde expresso regular.
2. Construa algoritmicamente o autmato finito determinista (DFA) equivalente a partir do
NFA da alnea anterior, e represente o seu diagrama de estados.
Explicite quais os estados do NFA realizado em cada estado do DFA.
3. Minimize algoritmicamente o nmero de estados do autmato finito determinista (DFA),
indicando todas as parties intermdias e respectivos grupos.

Exerccio 2.3 Construa o diagrama de estados do autmato finito determinista da expresso


regular (|b)((|a)b) a, indicando em quantos passos analisada a sequncia de entrada bbabba.
Construa a tabela de transio minimizada e justifique quantos passos so agora necessrios para
processar a mesma sequncia de entrada.

Exerccio 2.4 Construa a tabela de transio determinista minimizada das seguintes expresses
regulares:

1. a(a|b) a
2. (a?b)
3. a ba ba
4. (a|b) abb(a|b)
5. a(a|b) + b
6. (aba|bab)

2.4. EXERCCIOS

45

Exerccio 2.5 Construa a tabela de transio determinista minimizada da gramtica regular,


sobre o alfabeto {x, y, z} e onde A smbolo no terminal inicial,
A
B
C
D

xB
yC|zD|
yC|zD|
yC|zD|

Indique em quantos passos processada a sequncia de entrada xxzy.


Exerccio 2.6 Considere a sequncia ordenada de expresses regulares aa, a, a|b definida sobre
o alfabeto = {a, b}:
1. Determine algoritmicamente os subconjuntos do autmato finito determinista (DFA) equivalente a partir do autmato finito no determinista (NFA) construdo pelo algoritmo de
Thompson a que corresponde a sequncia ordenada de expresses regulares.
Explicite quais os estados do NFA realizado em cada estado do DFA.
2. Minimize algoritmicamente o nmero de estados do autmato finito determinista (DFA),
indicando todas as parties intermdias e respectivos grupos.
Represente a tabela de transio de estados resultante.
3. Indique, justificando, em quantos passos processada a sequncia de entrada: aabbaaa.
Exerccio 2.7 Construa a tabela de anlise da linguagem definida pela sequncia ordenada das
seguintes expresses regulares ab, ab, a|b definida sobre o alfabeto = {a, b}. Indique, justificando, em quantos passos processada a sequncia de entrada: abaabb.
Exerccio 2.8
de anlise:
est
0
1
2

Determine uma expresso regular que defina a linguagem descrita pela tabela

a b
1 2
E 2
1 2

Exerccio 2.9 Apresente a tabela de anlise minimizada e compactada que analisa a linguagem
definida pela expresso regular u(a(e|o)) i, definida sobre o alfabeto = {a, e, i, o, u}.

Captulo 5
Anlise sintctica ascendente por tabela
Um analisador ascendente constro a rvore sintctica das folhas para a raiz. Ao contrrio da anlise descendente, que necessita prever qual a regra a utilizar, a anlise
ascendente atrasa a escolha da regra at ter lido todos os smbolos que constituem a
derivao ( lado direito de uma produo ), mais os smbolos de anteviso necessrios.
A principal deciso de um analisador ascendente consiste em determinar quando uma
sequncia de smbolos corresponde a alguma das regras da gramtica. Esta tarefa no
trivial, pois pode haver mais de uma regra com a mesma derivao e casos em que,
apesar da semelhana, no se tratam de derivaes possveis.
Como os analisadores ascendentes substituem uma derivao de uma regra pelo smbolo no terminal que a origina so globalmente designados por LR(k). A anlise LR(k)
efectuada lendo a sequncia de entrada da esquerda para a direita (Left to right), emparelhando as derivaes das regras da direita para esquerda (Right to left), usando no
mximo k smbolos de anteviso. Estes analisadores so os mais utilizados pois so
menos limitativos que os correspondentes analisadores preditivos descentes LL.
Neste captulo estudaremos em detalhe apenas os analisadores mais simples e menos
exigentes, em termos da dimenso das tabelas necessrias. Contudo, a anlise determinista da grande maioria das linguagens usadas em computao pode ser efectuada com
base em gramticas processveis por analisadores LALR(1). Os analisadores LALR(1)
apresentam tabelas da mesma dimenso das formas mais simples SLR(1) e LR(0), mas
permitem analisar um maior nmero de gramticas. Relembra-se que uma mesma linguagem pode ser descrita por diversas gramticas equivalentes, bastando encontrar
uma dessas gramticas que seja pelo menos LALR(1).
O funcionamento de um analisador ascendente baseia-se em duas operaes fundamentais: o deslocamento (shift) de smbolos da sequncia de entrada para a pilha auxiliar e
a reduo (reduce) dos smbolos de derivao de uma regra ao smbolo no terminal que
57

58

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

a origina. Inicialmente a pilha comea vazia, sendo deslocados smbolos at ser encontrada uma derivao vlida. O processamento termina quando se atnge uma operao
de aceitao (accept) ou de erro (error).

5.1 Construo do analisador


Para que a anlise determinista de uma linguagem por um analisador ascendente seja
correcta basta que os deslocamentos e a aceitao sejam permitidos apenas em certas
situaes. A diferena entre os analisadores LR(0), SLR(1) e LALR(1) consiste apenas
na colocao das redues. No entanto, se uma reduo for erradamente executada,
o seu resultado no poder ser deslocado, pelo que as sequncias de entrada erradas
so igualmente detectadas, mas com algum atraso. A determinao dos deslocamentos
efectuada com base num autmato determinista muito semelhante ao utilizado na
anlise das linguagens regulares.

gramtica aumentada Para que a sequncia de entrada seja correctamente detectada


pela gramtica necessrio introduzir uma regra auxiliar que explicite o fim do processamento. Desta forma, no possvel terminar prematuramente o processamento,
deixando smbolos por processar. Esta regra auxiliar contm uma s derivao com o
smbolo inicial da gramtica e o smbolo $, smbolo que utilizaremos para designar o
fim da sequncia de entrada (end of file).

Exemplo 5.1 Considerando uma gramtica com smbolo inicial S,


S
A
|
|

( A )
a
S
A , a

a gramtica aumentada inclui tambm a regra S S $, passando S a ser o novo smbolo inicial
da gramtica aumentada, ou seja,
S S $
S ( A )
A a
| S
| A , a

5.1. CONSTRUO DO ANALISADOR

59

estados do autmato A anlise ascendente baseia-se na construo de um autmato


no determinista e na sua converso em determinista, pelos mesmos processos utilizados para o tratamento de linguagens regulares. Para tal, cada regra dividida nos
diversos estados em que o processamento da regra se pode encontrar, designados por
itens, que correspondem aos estados do autmato no determinista. Assim, uma regra
em que a derivao composta por N smbolos, terminais ou no terminais, composta
por N+1 itens, sendo o primeiro correspondente ao estado antes de iniciar o processamento da regra, o segundo aps consumir o primeiro smbolo e o ltimo aps o processamento de todos os smbolos da derivao da regra. A cada um destes itens atribudo
um nmero nico que destingue cada estado do autmato finito no determinista. Os
diversos itens de cada regra so ligados, pela ordem de processamento, por transies
que consomem os smbolos da derivao da regra.

Exemplo 5.2 Considerando a primeira regra do exemplo 5.1 S ( A ) , so gerados quatro itens, onde o smbolo representa o ponto de processamento da regra no respectivo estado do
autmato no determinista,
S ( A )

S ( A )

S ( A )

S ( A )

Para tornar a leitura mais legvel e compacta representaremos cada estado, do autmato
finito no determinista, pelo seu nmero colocado no ponto de processamento da regra,
ficando a regra do exemplo 5.2 reduzida a S 1 ( 2 A 3 ) 4 .

transies vazias Alm das transies entre os diversos itens de uma regra, etiquetadas pelos smbolos consumidos, necessrio considerar que ao processar um smbolo
no terminal devem ser consideradas todas as regras que esse smbolo pode derivar.
Assim, no item que antecede o processamento de um smbolo no terminal inserem-se
transies vazias para todos os itens iniciais das regras que esse smbolo no terminal
deriva. Na representao que utilizaremos, no etiquetaremos essas transies com o
smbolo , como fizemos nas linguagens regulares, nem representaremos por completo
o arco que une os estados. Desta forma, o item 2 da regra do exemplo 5.2 ser representado por 2 A, significando que no item 2 existem transies vazias para os itens
iniciais das trs regras que o smbolo A deriva. Para posterior referncia, indicaremos
antes de cada regra o seu nmero de ordem, correspondendo r0 ( regra zero ) regra auxiliar da gramtica aumentada. Tal representao pretende apenas simplificar e tornar
mais compacto e legvel o autmato, sendo funcionamente equivalente representao
utilizada nas linguagens regulares.

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

60
Exemplo 5.3

O autmato finito no determinista da gramtica aumentada usada no exemplo 5.1 fica


r0

r1

r2

r3

r4

S
S
A
|
|

S1$
2
( 3 A 4 ) 5
6
a 7
8
S9
10
A 11 , 12 a 13
0

aconselha-se a numerar os itens sequencialmente dentro de cada regra por forma a facilitar a
consistncia das transies, embora apenas se exija que cada item tenha um nmero distinto de
todos os outros do autmato finito no determinista.
Notar que na regra auxiliar da gramtica aumentada existem apenas dois itens, pois no possvel passar alm do fim da sequncia de entrada.

autmato determinista A construo do autmato finito determinista segue exactamente o mesmo processo utilizado nas linguagens regulares. No entanto, como nmero
de smbolos potencialmente grande omitiremos todas as transies que produzam estados deterministas que sejam conjuntos vazios.

Exemplo 5.4
A determinao dos estados do autmato determinista do exemplo 5.3 resume-se a

estado

entrada

I0

S
(
A
a
S
(
)
,
a

I2

I3
I7

move
0
1
3
4, 11
7
9
3
5
12
13

f echo \move novo estado


2
I0
I1
6, 8, 10, 3
I2
I3
I4
I5
...
(I2 )
I6
I7
I8

5.1. CONSTRUO DO ANALISADOR

61

construo da tabela de anlise Tal como no caso das linguagens regulares, tambm
a anlise sintctica ascendente utiliza uma tabela de anlise. No entanto, para o seu
processamento necessria uma pilha de dados auxiliar, onde so colocados temporariamente os smbolos at que uma regra seja identificada e a sua derivao substituda
pelo smbolo no terminal que lhe d origem. Neste caso, a tabela inclui cinco tipos de
operaes distintas:
deslocamento (shift) : corresponde a retirar o smbolo da sequncia de entrada e co-loc-lo no topo da pilha, seguido do estado indicado na operao de deslocamento.
Por exemplo s2 ( ou seja, shift 2 ), corresponde a deslocar o smbolo que estiver
cabea da sequncia de entrada e mover para o estado 2 ( do autmato finito
determinista ).
movimento (goto) : corresponde a mover para o estado indicado, colocando-o no topo
da pilha, representado por g2 ( ou seja, goto 2 ).
erro (error) : no representado na tabela de anlise, correspondendo s posies deixadas em branco.
reduo (reduce) : corresponde a substituir os smbolos de derivao de uma regra existente no topo da pilha pelo smbolo no terminal que deriva essa mesma regra.
representado por r2 ( ou seja, reduce 2 ), mas apenas neste caso o nmero 2 no
representa um estado do autmato mas sim o nmero da regra
aceitao (accept) : corresponde reduo da regra auxiliar da gramtica aumentada,
representando o fim do processamente, podendo apenas existir na coluna correspondente ao fim do processamento ( representado por $ ).
A tabela de anlise constituda por todos smbolos terminais, incluindo o fim de processamento $ ( que pode ser lido de um ficheiro ), e todos os smbolos no terminais
da gramtica inicial ( exclui-se a regra auxiliar da gramtica aumentada ). Muita da
literatura separa a tabela de deslocamentos da tabela de movimentos pelo que, embora
utilizaremos uma nica tabela, explicitaremos a sua individualizao por uma dupla
barra.
O autmato finito determinista permite preencher as operaes de deslocamento e movimento da tabela de anlise. O preenchimento idntico, diferindo apenas no facto
de se tratar de um deslocamento para smbolo terminais ( aqueles que podem ser obtidos da sequncia de entrada ) e de um movimento para os smbolos no terminais.
Com base no clculo do autmato finito determinista, e ignorando as duas colunas que
contm os estados no deterministas, ficamos com os valores a preencher

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

62
Exemplo 5.5

Eliminando os estados do autmato finito no determinista da tabela do exemplo 5.4, o preenchimento das operaes de deslocamento e movimento na tabela de anlise directo. As duas
primeiras colunas designam, por ordem, a linha e a coluna da tabela do autmato finito determinista e a ltima designa o valor a preencher nessa posio.
estado
I0
I2

I3
I7

entrada

novo estado
I0
S I1
( I2
A I3
a I4
S I5
( (I2 )
) I6
, I7
a I8

( a
0 s2
1
2 s2 s4
3
4
5
6
7
s8
8

S A
g1
g5 g3

s6 s7

5.1.1 Gramticas LR(0)


O autmato LR(0) anterior permite construir tabelas para analisadores LR(0), SLR(1) e
LALR(1), diferindo apenas na forma como as redues so inseridas na tabela. Como
j foi referido, so os deslocamentos e movimentos que determinam se a sequncia de
entrada est correcta ou no, pelo que mesmo que sejam colocadas redues desnecessrias, mais tarde ou mais cedo a falha ser detectada.
O analisador mais simples o analisador LR(0), que como o nome sugere no usa smbolos de anteviso ( representado pelo nmero entre parenteses, ou seja 0 smbolos de
anteviso ). Para compreender o seu funcionamento basta representar graficamente o
autmato finito determinista, considerando que uma vez atingido o ltimo estado de
uma regra esta fica pronta a ser reduzida.
Tal como no processamento de expresses regulares, a determinao de quais os estados
do autmato finito determinista em que as diversas regras so reduzidas baseia-se na
identificao dos estados finais de cada regra no autmato finito no determinista. Assim, todos os estados deterministas, que incluam esse estado no determinista, reduzem
a regra.
Exemplo 5.6 A representao grfica do autmato finito determinista clculado no exemplo 5.4
pode ser representado pela figura abaixo.

5.1. CONSTRUO DO ANALISADOR

63

acc (r0)
)

I1
S
A

I0

I2

I3

I7

I4
(

r1

I6
a

I8

r4

r2

I5

r3

Como nos analisadores LR(0) no existem smbolos de anteviso, a reduo ser efectuada para todos os smbolos terminais da linguagem em questo. Excepo feita regra
auxiliar da gramtica aumentada, que apenas pode ser reduzida para o smbolo de fim
de processamento $, pois para qualquer outro smbolo significaria que a sequncia no
estava completamente processada.

Exemplo 5.7 A tabela de anlise LR(0) para a gramtica do exemplo 5.1 fica concluda com
o preenchimento das redues das regras e da operao de aceitao para a regra auxiliar da
gramtica aumentada. Todas as posies deixadas em branco representam situaes de erro.

(
0 s2
1
2 s2
3
4 r2
5 r3
6 r1
7
8 r4

S A
g1

acc
s4
r2
r3
r1
s8
r4

g5 g3
s6
r2
r3
r1

s7
r2 r2
r3 r3
r1 r1

r4 r4 r4

Notar que nenhuma linha da tabela pode ficar totalmente em branco, pois esse estado no seria
necessrio. Da mesma forma, nenhuma coluna da tabela pode ficar totalmente em branco por
esse smbolo nunca seria processado. No caso de um smbolo terminal, significa que esse smbolo
nunca pode ser lido, enquanto no caso de um smbolo no terminal, significa que nenhuma das
regras que ele deriva alguma vez reduzida ( uma vez que aps uma reduo existe sempre um
movimento, excepto para a regra auxiliar ).

64

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

5.1.2 Anlise ascendente por tabela


O processamento de uma sequncia de entrada por um analisador ascendente por tabela
utiliza as operaes atrs referidas. Tal como no caso da anlise preditiva descendente
por tabela, recorre-se a uma pilha. Neste caso, a pilha ir conter alternadamente estados
do autmato finito determinista e smbolos, terminais e no terminais, da gramtica.
Inicialmente a pilha contm apenas o estado inicial ( sempre designado por 0 nos exemplos aqui apresentados ). A determinao da operao a realizar utiliza o elemento no
topo da pilha e o smbolo cabea da sequncia de entrada, correspondendo respectivamente s linha e coluna da tabela de anlise. Aps uma reduo, o topo da pilha
fica com o smbolo no terminal que deriva a regra reduzida, utilizando-se neste caso
os dois elementos do topo da pilha para determinar a operao a realizar.
Exemplo 5.8 Considere-se a anlise da sequncia de entrada (a,a) atravs da tabela do exemplo 5.7 para a gramtica do exemplo 5.1:
entrada
pilha
0
(a, a)$
a, a)$
0(2
0(2a4
, a)$
, a)$
0(2A
0(2A3
, a)$
0(2A3, 7
a)$
)$
0(2A3, 7a8
0(2A
)$
)$
0(2A3
0(2A3)6
$
$
0S
0S1
$

aco
shift-2
shift-4
reduce-2
goto-3
shift-7
shift-8
reduce-4
goto-3
shift-6
reduce-1
goto-1
accept

No primeiro passo da anlise procura-se na tabela o estado 0 ( topo da pilha ), correspondente


primeira linha, e na coluna ( a operao a executar, ou seja s2 ( shift-2 ). No terceiro passo, para
efectuar a reduo da regra 2 necessitamos retirar do topo da pilha todos os smbolo que derivam a
regra e respectivos estados colocando em seu lugar o smbolo no terminal que deriva essa regra.
Neste caso apenas a 4 retirado da pilha, sendo colocado o smbolo A, pois a regra 2 apenas
A a. Para as restantes redues do exemplo acima o processo idntico, mas para as regras 4
e 1, ou seja, A A , a e S ( A ) , respectivamente. Notar que, ao contrrio dos analisadores
preditivos descendentes, a pilha cresce da esquerda para a direita para que as derivaes da regra

5.1. CONSTRUO DO ANALISADOR

65

apaream na pilha pela mesma ordem que so escritas na gramtica, apenas contendo os nmeros
dos estados entre os smbolos.
Aps cada reduo existe sempre uma operao de movimento, utilizando-se os dois elementos
do topo da pilha para determinar as linha e coluna na tabela. Assim, no quarto passo, o topo da
pilha indica linha 2 e coluna A, ou seja, g3 ( goto-3 ).

5.1.3 Gramticas SLR(1)


As gramticas LR(0), ou seja aquelas que podem produzem tabelas LR(0) sem gerar
conflitos ( mais de uma operao por posio na tabela de anlise ), so bastante restritivas. Embora no tenha as limitaes de recursividade ou factorizao dos analisadores
preditivos descendentes, o mtodo de construo LR(0) produz frequentemente conflitos. Para uma sequncia de entrada correcta, uma regra s pode ser seguida pelos
seus smbolos de FOLLOW, todas as restantes redues esto erradas. Assim, em vez
de efectuar a reduo e vir a detectar o erro no prximo deslocamento, o mtodo de
construo SLR(1) apenas preenche as redues para os smbolos de FOLLOW.
Exemplo 5.9 Considerando o exemplo 5.1 temos que FOLLOW(S) = {$ , ) , , } e FOLLOW(A) = { ) , , } logo a regra 1 reduz apenas nos trs smbolos de FOLLOW e as regras
2, 3 e 4 nos dois smbolos atrs calculados, ficando a tabela

( a
0 s2
1
2 s2 s4
3
4
5
6
7
s8
8

S A
g1

acc
g5 g3
s6
r2
r3
r1

s7
r2
r3
r1 r1

r4 r4

Notar que a anlise da tabela gerada pelo mtodo SLR(1) igual anlise da tabela
LR(0), apenas em caso de reduo com smbolo de anteviso que no pertena ao conjunto FOLLOW imediatamente gerado um erro e parado o processamento. Alm
disso, caso existam operaes de deslocamento nessas posies, deixa de haver conflitos, sendo essas gramticas SLR(1) mas no LR(0).

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

66

5.2 Gramticas LALR(1)


O mtodo de construo LALR(1) leva o princpio do SLR(1) um passo mais adiante.
Nomeadamente, nem todos os smbolos de FOLLOW so utilizados em todas as regras,
mas apenas um subconjunto destes, ou seja os smbolos de anteviso ( LOOKAHEAD ).
Cada ocorrncia da regra, e no apenas a regra em si, pode apresentar smbolos de
anteviso distintos. Determinando caso a caso, quais so efectivamente os smbolos
de anteviso na activao regra, permite-se que em cada reduo se possa restringir
ainda mais o nmero de posies preenchidas com redues. Tal facto permite, em
primeiro lugar evitar conflitos com outras redues ou com deslocamentos, tornando
as gramticas LALR(1) mais gerais que as que vimos at ao momento. Em segundo
lugar, torna a tabela mais esparsa, ou seja contm mais posies vazias, o que acelera a
determinao de erros e permite uma maior compresso da tabela resultante.
Exemplo 5.10 Considere-se a gramtica seguinte e o respectivo autmato finito no determinista LR(0)
r0

S
|
|
A

A b b
a a b
b A a
a

r1

r2

r3

r4

S
S
|
|
A

S1$
2
A 3 b 4 b 5
6 a 7 a 8 b 9
10
b 11 A 12 a 13
14
a 15
0

a converso em autmato finito determinista LR(0)


estado

entrada

I0

S
A
a
b
b
a
A
a
b
b
a

I2
I3
I4
I5
I6
I7

move f echo \move


0
2, 6, 10, 14
1
3
7, 15
11
14
4
8
12
15
5
9
13

a que corresponde a tabela de anlise SLR(1), sabendo que

novo estado
I0
I1
I2
I3
I4
I5
I6
I7
I8
I9
I10
I11

FOLLOW(S) =
FOLLOW(A) =

{$}
{ a , b }

5.2. GRAMTICAS LALR(1)

67

0
1
2
3
4
5
6
7
8
9
10
11

a
s3

b
s4

S A
g1 g2

acc
s6/r4
s8

s5
r4
g7
s9
s10

s11
r4

r4
r1
r2
r3

Pode-se verificar que no estado 3 para o smbolo a existe um conflito deslocamento-reduo. No


entanto, fazendo o processamento mental, verificamos que ao ler o primeiro carcter a, ficamos
no fim da regra 4 vindo da regra 1, bem como no segundo estado da regra 2. Porm, dependendo
do carcter seguinte podemos determinar qual das duas opes efectivamente a correcta. Tal
deve-se ao facto de quando se processa a regra 4 vindo da regra 1 apenas o smbolo b se pode
seguir, embora quer a como b serem FOLLOW do smbolo no terminal A.
O mtodo de construo de tabelas de anlise LALR(1) produz autmatos de igual dimenso que o LR(0), mas onde cada ocorrncia do estado no determinista transporta
o conjunto de smbolos de anteviso necessrios. A reduo efectuada apenas para os
smbolos de anteviso associados a cada ocorrncia do estado no determinista, correspondente ao final da regra.
Notar que o estado 14 da regra 4 do exemplo 5.10 ter smbolos de anteviso distintos
consoante tm origem na regra 1 ou na regra 3, respectivamente b e a. Os smbolos
de anteviso devem ser depois ser sucessivamente transportados at ao ltimo item
da regra, o estado 15 no exemplo, por forma a poderem ser utilizados na sua reduo.
Desta forma, os smbolos de anteviso necessitam apenas ser calculados nas transies
vazias, coorespondendo anteviso aps o no terminal que lhe est associado. Caso
esse no terminal seja o ltimo smbolo da regra, ento so smbolos de anteviso todos
os smbolos de anteviso do estado anterior transio vazia.
O estado inicial tem por anteviso o fim do ficheiro, representado por 0$ .
Exemplo 5.11 Associando os smbolos de anteviso s transies vazias ficamos com um autmato finito no determinista semelhante ao do exemplo 5.10

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

68
r0

r1

r2

S
|

r3

r4

S1$

A 3 b 4 b 5
6
a 7 a 8 b 9
2

b 11
14
a 15
10

A 12 a 13

o primeiro passo no clculo do autmato determinista tem presente que o estado 0 transporta o
smbolo de anteviso $ para os estados 2, 6, 10, mas que o estado 2 apenas transporta o smbolo
de anteviso b para o estado 14, pois quando a regra A a reduzir s poder ter a seguir o
smbolo b ,
estado

entrada

move f echo \move novo estado



0$
2$ , 6$ , 10$ , 14 b
I0

no segundo passo todos os smbolos de anteviso so transportados para o respectivo estado seguinte da regra, que de acordo com a sequncia de numerao utilizada corresponde tambm ao
nmero seguinte. Apenas a transio vazia do estado 11 para o estado 14 necessita calcular novos
smbolos de anteviso,
estado
I0

entrada

move
0$
S 1$
A 3$

a 7$ , 15 b
b 11$

f echo \move novo estado



2$ , 6$ , 10$ , 14 b
I0
I1
I2
I3
a
14
I4

a tabela fica completa transportando os restantes smbolos de anteviso,


estado

entrada

I0

S
A
a
b
b
a
A
a
b
b
a

I2
I3
I4
I5
I6
I7

move
0$
1$
3$

7$ , 15 b
11$
4$
8$
12$

15 a
5$
9$
13$

f echo \move novo estado



2$ , 6$ , 10$ , 14 b
I0
I1
I2
I3
a
14
I4
I5
I6
I7
I8
I9
I10
I11

5.2. GRAMTICAS LALR(1)

69

Notar que agora o estado 15 aparece com o smbolo de anteviso b em I3 , mas com a em I8 .
Desta forma, a reduo da regra 4 apenas colocada na coluna b para o estado I3 e apenas na
coluna a para o estado I8 . Podemos verificar, atravs de uma observao cuidada da gramtica do exemplo que este efectivamente o caso, ficando a tabela de anlise gerada pelo mtodo
LALR(1)

0
1
2
3
4
5
6
7
8
9
10
11

a
s3

b
s4

S
g1

A
g2

acc
s6
s8

s5
r4
g7
s9
s10

s11
r4
r1
r2
r3

Quando os smbolos de anteviso no podem ser identificados no autmato no determinista, quando o no terminal o ltimo smbolo da regra, utilizaremos o smbolo
para indicar o transporte dos smbolos de anteviso anteriores para os estados atingidos

pela transio vazia. Por exemplo, S 25 A 26 .


Como foi referido, os autmatos no determinista e determinista LALR(1) so iguais
aos LR(0), com a excepo da anotao dos smbolos de anteviso a cada ocorrncia do
estado no determinista. Assim, quando se repete um conjunto de estados no determinista porque se est na presena do mesmo estado determinista. Contudo, o clculo
dos smbolos de anteviso tem de ser completamente calculada, pois pode diferir da
ocorrncia inicial. Sempre que existe discrepncia entre os smbolos de anteviso dos
diversos estados no determinista, de um mesmo estado determinista, estes devem ser
fundidos. No entanto, caso j tenham sido calculados novos estados, os smbolos de
anteviso devem ser propagados a esses estados.
Exemplo 5.12 Considere-se uma simplificao da instruo if com e sem else da linguagem C
r0

r1

r2

r3

S
S
|
|

S1$

2 i 3
S4
0

i 6
10 x 11

S 7 e 8 S 9

70

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

o clculo do autmato finito determinista at repetio do estado I2 idntica ao exemplo 5.11

estado entrada
I0

I0

S
i
x
S
i

move
0$
1$
3$ , 6$
11$
4$ , 7$
3$ , 6$

f echo \move novo estado


2$ , 5$ , 10$
I0
I1
2$ , 5$ , 10$
I2
I3
I4
e
e
e
2 , 5 , 10
(I2 )

neste ponto surje uma nova ocorrncia do estado I2 = {3, 6, 2, 5, 10} mas com smbolos de
anteviso distintos nos estados 2, 5, 10. Para que os smbolos de anteviso das duas ocorrncias
fiquem coerentes necessrio que esses trs estados passem a ter ambos os smbolos de anteviso,



passando I2 = {3$ , 6$ , 2$, e , 5$, e , 10$, e } em ambas as ocorrncias. No entanto, os estados I3
e I4 j foram entretanto calculados com base nos anteriores smbolos de anteviso de I2 , embora
haja situaes em os novos smbolos de anteviso de I2 no afectam I3 e I4 este no o caso.
Assim, o processo deve ser repetido a partir da primeira ocorrncia de I2 , mas agora com os novos
smbolos de anteviso

estado

entrada

I0

S
i
x
S
i

I0

move
0$
1$
3$ , 6$

11$, e


4$, e , 7$, e


3$, e , 6$, e

f echo \move
2$ , 5$ , 10$

2$, e , 5$, e , 10$, e

2$, e , 5$, e , 10$, e

novo estado
I0
I1
I2
I3
I4
(I2 )

notar que mais uma vez a segunda ocorrncia de I2 ficou com smbolos de anteviso distintos da
primeira ocorrncia, mas desta vez nos estados 3 e 6. O processo repete-se, mas desta vez sem
consequncias para os estados entretanto j re-calculados, ficando a tabela completa

5.3. ELIMINAO DE CONFLITOS


estado

entrada

I0

S
i
x
S
i
x
e
S
i
x

I0

I4
I5

71

move
0$
1$


3$, e , 6$, e

11$, e


4$, e , 7$, e


3$, e , 6$, e

11$, e


8$, e , 7$, e

9$, e


3$, e , 6$, e

11$, e

f echo \move
2$ , 5$ , 10$

2$, e , 5$, e , 10$, e

2$, e , 5$, e , 10$, e


2$, e , 5$, e , 10$, e
2$, e , 5$, e , 10$, e

novo estado
I0
I1
I2
I3
I4
(I2 )
(I3 )
I5
I6
(I2 )
(I3 )

finalmente a tabela de anlise apresenta, como seria de esperar, um conflito deslocamento-reduo,


i
0 s2
1
2 s2
3
4
5 s2
6

x
s3

S
g1

acc
s3
r3
s5/r1

g4
r3
r1

s3
r2

g6
r2

5.3 Eliminao de conflitos


Se surjem conflitos na construo de tabelas de anlise pelo mtodo LALR(1) necessrio determinar a origem desses conflitos. Uma gramtica ambgua produz sempre
conflitos e, muito provavelemente, no reflecte a linguagem que pretende modelar. De
facto, as linguagens utilizadas em computadores, sejam linguagens de programao
ou outras, no so ambguas, excepto em casos muitos particulares. Noutras situaes
apenas, um smbolo de anteviso pode no ser suficiente, sendo necessrio resolver o
problema noutras fases do processamento, como a anlise lexical ou a anlise semntica.
No entanto, a maioria das linguagens utilizadas pelos computadores no s no ambgua como pode ser processada com apenas um smbolo de anteviso. Tal deve-se ao
facto de quem criou a linguagem ter tido presente as ferramentas de anlise existentes, salvo poucas excepes. O problema reside no facto de encontrar uma gramtica
LALR(1) que descreva a linguagem em questo. De facto, mesmo que tal gramtica, ou

72

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

gramticas, existam nada me garante que a minha anlise da linguagem produza uma
dessas gramticas.
Nesta seco tentaremos ver alguns procedimentos simples que permitem modificar a
gramtica por forma a evitar conflitos desnecessrios e que resultam, em geral, de vcios
do utilizador ou de descries que dirigem o utilizador para solues menos conflituosas.
Os conflitos tm sempre origem em redues, sendo estas efectuadas quando se atnge o
ltimo estado de uma regra, para certos smbolos de anteviso. Se o estado determinista
contiver outros estados no deterministas em posio de reduo ou deslocamento, para
o mesmo smbolo de anteviso, ento esse estado tem um conflito. Desta forma a primeira regra para evitar conflitos criar regras compridas, ou seja com muitos smbolos,
face a muitas regras curtas, pois cada regra usada necessita ser reduzida. Existe ainda
uma vantagem no desempenho do analisador j que cada regra usada consome dois
passos de processamento, um para a reduo e outro para o movimento, e provavelmente necessitar de mais estados na tabela de anlise. Alm disso cada novo smbolo
no terminal acrescenta mais uma coluna tabela.

5.3.1 Conflitos deslocamento-reduo


Um conflito deslocamento-reduo tem origem numa regra estar em condies de ser
reduzida para o smbolo de anteviso em questo, enquanto outra regra ou regras podem deslocar esse smbolo.
Exemplo 5.13 Considere-se a gramtica
S
|
|
A

x y z
A y
A z
x

onde a sequncia xy pode ser reconhecida pela primeira regra ou pela segunda regra seguida da
quarta. Aps a leitura do carcter x, quando o carcter de anteviso y, a primeira regra pode
deslocar-se mais um smbolo, mas a quarta regra pode reduzir para processar o y na segunda
regra.
A reduo do nmero de regras, nomeadamente com a aplicao da propriedade distributiva, enumera as diversas solues e elimina as redues problemticas.
A utilizao de regras vazias, por transportarem todos os smbolos de anteviso, est na
origem de muitos conflitos deslocamento-reduo. Estas regras tm em geral origem no

5.3. ELIMINAO DE CONFLITOS

73

facto de certa entidade poder ocorrer zero ou mais vezes. No entanto, tal facto pode ser
descrito com duas regras idnticas: uma das regras contm a entidade como obrigatria
e a outra no contm a entidade. As duas regras representam uma ou mais ocorrncias
da entidade e a sua no ocrrncia, ou seja, no seu conjunto zero ou mais ocorrncias da
entidade.
Exemplo 5.14 Na linguagem C um bloco pode conter zero ou mais declaraes seguida de zero
ou mais instrues, qualquer delas terminada em ;. Assim, em vez de indicar
bloco { decl_opt instr_opt }
decl_opt
| decl
instr_opt
| instr
enumeram-se a quatro possibilidades, ou seja,
bloco
|
|
|

{ decl instr }
{ decl }
{ instr }
{ }

Quando a gramtica apresenta um conflito deslocamento-reduo no admissvel na


linguagem, pode-se criar dois novos smbolos no terminais. Um deles trata a situao
genrica, enquanto o outro enumera as regras anteriormente em conflito, mas referindo
agora os novos smbolos no terminais.
Exemplo 5.15 No caso do problema if then else j abordado no exemplo 5.12
instr if expr then instr else instr
| if expr then instr
| outras
pode ser reescrito resolvendo a ambiguidade, garantindo que no pode aparecer um bloco com
apenas if then entre um then e um else,
instr
|
genrica
|
anterior
|

genrica
anterior
if expr then genrica else genrica
outras
if expr then genrica else anterior
if expr then instr

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

74

Finalmente, caso no se consiga encontrar uma soluo vivel, pode-se sempre manter
o conflito e assumir que o deslocamento a soluo adoptada. No entanto, isto significa que tabela de anlise gerada no corresponde gramtica inicial, atendendo ao
mtodo de gerao utilizado. Para evitar estar dependente do comportamento da ferramenta, o utilizador pode indicar prioridades e associatividades das regras como forma
de controlar o processamento de gramticas ambguas ( ver 5.4 ). No caso de conflitos
reduo-reduo esta perspectiva j no se aplica.

5.3.2 Conflitos reduo-reduo


Um conflito reduo-reduo surje quando duas regras se encontram simultaneamente
em posio de reduo para o mesmo smbolo de anteviso. Tal acontece quando duas
regras, total ou parcialmente, idnticas podem ser utilizadas no mesmo contexto.
Exemplo 5.16 Considere-se a gramtica
S
|
A
|
B
|

A
B
x
y
x
z

onde aps a leitura do smbolo x quer a regra A x como a regra B x podem podem ser
reduzidas para o smbolo de anteviso $.
Uma soluo consiste em considerar que ambas as ocorrncias da parte comum da regra podem ser tratadas sintacticamente como a mesma, sendo quaisquer distines ser
efectuadas semnticamente. Ou seja, embora fosse desejvel separar o processamento,
as tcnicas existentes no permitem faz-lo atravs de regras sintcticas. Assim, criase uma nica regra, com a parte comum, e trata-se as possveis diferenas atravs de
atributos.
Exemplo 5.17 Na gramtica do exemplo 5.16 transporta-se a parte comum das regras em conflito para a regra comum que as deriva,
S
|
|
A
B

A
B
x
y
z

5.4. UTILIZAO DETERMINISTA DE GRAMTICAS AMBGUAS

75

A soluo de atrasar, para a anlise semntica, as diferenas no contexto de utilizao da


parte comum das regras em conflito permite eliminar conflitos reduo-reduo. Uma
situao comum consiste na utilizao de regras idnticas para manipular diversos tipos de dados, por exemplo em operaes polimrifcas. A utilizao de uma s regra,
permite reduzir a gramtica, em especial se houver muitos tipos de dados possveis, e
tornar a anlise sintctica mais rpida. No entanto, a escolha da operao a realizar ter
de ser efectuada pela anlise semntica, podendo recorrer para tal a tcnicas especficas,
a estudar na devida altura.
Uma outra soluo consiste em permitir ao analisador lexical, atravs de informao
semntica como a tabela smbolos ou informao de tipos, possa separar um elemento
lexical em dois ou mais. Por exemplo, um identificador pode ser caracterizado
como tipo, varivel, constante ou funo, permitindo criar regras especficas que no
dependam todas de um identificador comum. Na mesma perspectiva, o analisador
lexical pode procurar agrupar um maior nmero de elementos, de tal forma que no
tenha de ser a capacidade de anteviso limitada do analisador sintctico a desenvolver
esse esforo.
Exemplo 5.18 Considerando o exemplo 5.16, basta contextualizar a utilizao do carcter x
por forma a diferenci-lo em x e w
S
|
A
|
B
|

A
B
w
y
x
z

5.4 Utilizao determinista de gramticas ambguas

Quando a gramtica em questo no LALR(1), a sua transformao em LALR(1) ,


em geral, acessvel. Para mais, muitos dos conflitos encontrados ao fazer uma anlise
LALR(1) devem-se a ambiguidades na prpria gramtica ( no podendo ser analisada
por mtodos deterministas ) e no necessariamente falta de anteviso da gramtica.
Muitas destas ambiguidades podem ser removidas atravs de directivas que produzem
tabelas deterministas. Notar que embora a tabela resultante no contenha conflitos, a
gramtica utilizada ainda ambgua, ou seja, a tabela no reflecte apenas da aplicao
do mtodo.

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

76

Quando a gramtica produzida contm conflitos, mas o utilizador sabe qual o comportamento que pretende em cada conflito, deve indic-lo explcitamente. Tal evita dvidas
futuras e documenta claramente o comportamento desejado.

5.4.1 Atribuio de associatividades e prioridades

A manuteno de conflitos deslocamento-reduo traduz, para ferramentas como o gerador yacc, na opo pelo deslocamento. Embora esta possa ser, de uma forma geral,
a opo mais desejada, tal no necessariamente o caso. A utilizao de prioridades e
associatividades nas regras permite remover conflitos deslocamento-reduo, optando
explicitamente pelo deslocamento ou pela reduo. Claro que a utilizao destas tcnicas de forma cega, embora removendo os conflitos, pode traduzir-se numa gramtica
completamente distinta da especificada e, por vezes, no reflectindo a linguagem que
pretende efectivamente processar. Desta forma, a utilizao de prioridades e associatividades para eliminar conflitos deve ser utilizada conscientemente.
A determinao de prioridades e associatividades num analisador sintctico ascendente
est associada a regras e a operadores. Embora algumas ferramentas, como o gerador
yacc, permitam indicar a prioridade e associatividade de um operador, na realidade o
utilizador est a indicar a prioridade e associatividade todas as regras que usam esse
smbolo. Notar que quando se pretende atribuir prioridades distintas regras que usam
o mesmo operador, como o operador - unrio e binrio, torna-se necessrio identificar
a regra atravs de uma etiqueta nica.
Num conflito deslocamento-reduo, ao optar pela reduo estamos a obrigar a aplicar
imediatamente a regra, antes de ver o que se segue, ou seja estamos a ser associativos
esquerda. Da mesma forma, ao optar pelo deslocamento vamos acumulando na pilha
as diversas ocorrncias, sendo posteriormente obrigados a reduzir as regras pela ordem
inversa, pois trata-se de uma pilha. Finalmente, caso uma regra no seja associativa,
no podemos permitir nem a reduo nem o deslocamente, limitando-nos a remover
ambos e deixar em seu lugar uma situao de erro.
Exemplo 5.19 Considermos um exemplo apenas com o operador subtrao. Este operador tem a
vantagem de produzir resultados distintos consoante usado associativo esquerda ou direita,
mas do ponto de vista gramatical o problema subsiste para operadores comutativos, como por
exemplo a soma.
E
|

E - E
id

a tabela de anlise LALR(1) apresenta um conflito deslocamento-reduo

5.4. UTILIZAO DETERMINISTA DE GRAMTICAS AMBGUAS

0
1 s3
2 r2
3
4 s3/r1

id
s2

77

E
g1

acc
r2
s2

g4
r1

Considerando a sequncia de entrada x - y - z, o estado 4 que contm o conflito atingido duas


vezes, correspondentes s posies na sequncia de entrada x - y - z e x - y - z . Na ltima
posio, o smbolo de anteviso $, a que no corresponde o conflito. O conflito atingido em x
- y - z, onde se optarmos pela reduo obtemos ( x - y ) - z, pois ao reduzir aplicamos a regra
e efectuamos a operao de subtrao indicada. Por outro lado, se optarmos pelo deslocamento
obtemos x - (y - z) pois quando chegarmos ao fim da sequncia reduzimos os smbolos no topo da
pilha, e s depois este resultado subtrado de x.

A determinao de prioridades envolve a interao entre regras distintas, ou seja, qual


a aco a realizar no estado associado regra em questo na presena do smbolo de
anteviso associado outra regra. Se o smbolo de anteviso mais prioritrio somos
obrigados a deslocar por forma a atrasar a reduo do actual, o menos prioritrio. Inversamente, necessrio reduzir na presena de um smbolo de anteviso menos prioritrio. Quando se tratam de situaes de igual prioridade, como entre as operaes de
soma e subtrao, aplicam-se as regras da associatividade atrs descritas.
A identificao dos estados associados regras simples, pois como se trata de um
conflito deslocamento-reduo, a regra em causa aquela pode ser reduzida.

Exemplo 5.20 Consideremos uma gramtica, deliberandamente ambgua, mas onde a linguagem a processar apresenta, por ordem crescente de prioridades, operaes de soma, multiplicao,
potncia, e valor simtrico. Do ponto de vista de associatividade pretende-se que quer a soma
como a multiplicao sejam associativas esquerda, a potncia pretende-se associativa direita
e, finalmente, o valor simtrico no seja associativo.
E
|
|
|
|

E + E
E * E
E E
- E
id

a que corresponde a tabela de anlise LALR(1)

78

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

0
1
2
3
4
5
6
7
8
9
10

s4

s5

s6

s2

r5

s5/r4
s5/r1
s5/r2
s5/r3

s3

r5

E
g1
g7

r5
s2
s2
s2

s4/r4
s4/r1
s4/r2
s4/r3

id
s3

acc
s2

r5

s3
s3
s3

s6/r4
s6/r1
s6/r2
s6/r3

g8
g9
g10
r4
r1
r2
r3

se nos concentrarmos na sub-tabela constituda pelos 12 conflitos e pelo smbolo de anteviso -


estado da regra
E - E
E E + E
E E * E
E E E

+
r4
r1
r2
r3

7
8
9
10

r4
s5
r2
r3


r4
s6 r1
s6 r2
s6 r3

Notar que a atribuio de prioridades no se aplica exclusivamente a operadores, mas


a qualquer tipo de regras.
Exemplo 5.21 Ao atribuir maior prioridade instruo if com else que quela sem o else,
estamos a fazer o conjunto else ficar associado ao if mais prximo. Tal o comportamente usual
nas linguagens de programao, como a linguagem C por exemplo.
Na tabela de anlise do exemplo 5.12 devemos optar pelo deslocamento ficando,

i e
0 s2
1
2 s2
3
r3
4
s5
5 s2
r2
6

x
s3

S
g1

acc
s3

g4
r3
r1

s3

g6
r2

Embora seja esse o comportamento por omisso das ferramentas, a indicao explcita das prioridades evita mensagens desnecessrias e afirma inequivocamente a opo do utilizador.

5.4. UTILIZAO DETERMINISTA DE GRAMTICAS AMBGUAS

79

Finalmente convm referir que a atribuio de prioridades e associatividades a gramticas ambguas apresenta ganhos significativos na dimenso das tabelas de anlise e
no nmero de passos de processamento, quando comparado com gramticas no ambguas que resolvem explicitam essas prioridades e associatividades gramaticalmente.
De facto, numa linguagem com 10 nveis de prioridade tm de existir 9 regras adicionais para transitar entre prioridades, na presena de smbolos de anteviso associados
a regras de menor prioridade. Tais regras aumentam, necessariamente, a dimenso das
tabelas. Por outro lado, cada vez que o operador menos prioritrio utilizado, as 9 regras de transio tm de ser reduzidas, e aps cada reduo ainda necessrio efectuar
a movimentao para o novo estado. Esta situao mais frequente que se pode supor
e justifica tcnicas especfcas para obviar esta sobrecarga ( ver 5.5.3 ).

5.4.2 Conflitos reduo-reduo


A manuteno de conflitos reduo-reduo, obriga a ferramenta a optar por usar uma
das redues, sendo em geral escolhida a regra de nmero mais baixo. Nesta situao,
a ordem pela qual as regras so enumeradas na gramtica crtica. De qualquer forma,
no de mais repetir, que a tabela de anlise resultante no reflecte a gramtica especificada. Notar que uma escolha criteriosa da ordem das regras permite que duas regras
em conflito possam ambas ser reduzidas para smbolos de anteviso distintos. Uma
vez que o conflito deve-se apenas a certos smbolos de anteviso, todos os restantes so
correctamente tratados. A escolha da ordem de enumerao das regras na gramtica
permite apenas que uma das regras se sobreponha a outra para os smbolos de anteviso em conflito. Em geral, a regra mais longa, ou seja com maior nmero de smbolos,
deve ser preferida, e consequentemente colocada primeiro na gramtica, que uma mais
curta.

Exemplo 5.22 Considere-se o exemplo, onde os operadores e _ permitem elevar o indiciar


uma varivel. As trs primeiras regras permitem, respectivamente, representar Xzy , X y e Xz . No
entanto, a composio das segunda e terceira regra apenas permite obter situaes do tipo Xz y ou
X yz , dependendo da ordem com que so aplicadas.
E
|
|
|
|

E E _ E
E E
E _ E
( E )
id

80

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

0
1
2
3
4
5
6
7
8
9
10
11

s4

s5

(
s2

r5

r5

E
g1

s5
s10/r2
s5/r3
r4

g6
r5

s3
s3
s9
r2
r3
r4

s2
s4/r1/r3

s3

s2
s2
s4
s4/r2
s4/r3
r4

id
s3

acc
s2

r5

s5/r1/r3

g7
g8
r2
r3
r4

s3
r1/r3

g11
r1/r3

a tabela contm 8 conflitos deslocamento-reduo e 2 conflitos reduo-reduo. Notar que os dois


estados com um conflito triplo representam apenas dois conflitos deslocamento-reduo, sendo
ignorados os conflitos entre redues, pois existe um deslocamento nesse estado.
Notar que se impusermos uma associatividade esquerda aos operadores e _ ficamos com
4 conflitos reduo-reduo, pois optamos por redues em detrimento dos deslocamentos nos
estados de conflito triplo. Por outro lado, ao impor uma associatividade direita a esses mesmos
operadores sobram apenas os 2 conflitos reduo-reduo anteriormente existentes. Contudo, a
alterao das associatividades altera a interpretao das sequncias de entrada quando no se
utilizam parnteses.

5.5 Compactao de tabelas LR


Embora os mtodos estudados, quer descendente como ascendentes, produzam tabelas
de anlise de dimenses aceitveis, para linguagens reais, possvel compactar as tabelas com reduzido custo de acesso. Nesta seco abordaremos alguns mtodos que tiram
partido das caractersticas especficas das tabelas geradas por analisadores ascendentes.
Um dos mtodos genricos consiste na possibilidade de fuso de linhas iguais, com a
criao de um nvel de indireco no acesso. Este mtodo frequentemente utilizado
em tabelas de analisadores ascendentes quando se separa as colunas dos elementos terminais dos no terminais. Notar que este processo idntico ao utilizado nas tabelas de
anlise de expresses regulares, mas neste ltimo caso para colunas e no para linhas.

5.5. COMPACTAO DE TABELAS LR

81

5.5.1 Tabelas esparsas


As tabelas de anlise ascendente estudadas produzem muitas situaes de erro, representadas por posies em branco nas tabelas. Em geral, mais de metade das posies, e
em muitos casos quase 90%, das entradas da tabela de anlise so situaes de erro. Os
mtodos de compactao de tabelas permitem reduzir significativamente a dimenso
destas.
Embora existam mtodos genricos de compactao de tabelas esparsas, nesta seco
trataremos apenas mtodos especficos para tabelas de anlise ascendente. Depois da
aplicao destes mtodos sempre possvel aplicar um mtodo genrico para aumentar
ainda mais a compactao.
Um desses mtodos genricos j referido, no caso das tabelas para analisadores preditivos descendentes, designado por double-offset indexing ( ver 4.3.1 ). Neste mtodo
procura-se sobrepor as diversas linhas, por qualquer ordem e no necessariamente alinhadas umas com as outras, por forma a que o nmero de posies vazias seja mnimo.

5.5.2 Propagao de redues


Como vimos atrs, as tabelas de anlise geradas pelos mtodos LR(0), SLR(1) e LALR(1)
apenas diferem no nmero de redues. Caso no originem conflitos, o mtodo LR(0)
tem maior nmero de redues que os outros mas no compromete a correco da
sequncia em anlise. De facto, se em vez de reportar um erro, efectuarmos uma reduo possvel nesse estado, o resultado produzido no consiguir ser posteriormente
deslocado. Assim, parte de atrasar a deteco de erros, a propagao de uma reduo
para outros smbolos de anteviso desse estado no afecta a correco da anlise, desde
que no introduza conflitos.

Propagao de redues unitrias


Se um estado da tabela de anlise inclui apenas redues de uma regra e situaes de
erro designa-se por uma reduo unitria. Nesta situao, podemos propagar a reduo
da regra em questo por todos os smbolos de anteviso, como o caso das tabelas
geradas pelo mtodo LR(0), sem produzir conflitos. Assim, ao atingir este estado, quer
seja atravs de um deslocamento ou de um movimento, iremos reduzir a regra.
Na prtica no existe necessidade de o analisador se mover para esse estado, pois a reduo pode ser efectuada em substituio do salto. Este estado pode pois ser eliminado,
desde que os movimentos para ele sejam substitudos pela reduo que ele representa.

82

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

Por exemplo em vez de g7 ser colocado r4 assumindo que o estado 7 apenas contm
redues da regra 4.
As operaes de deslocamento so na realidade duas operaes em sequncia, um deslocamento do smbolo cabea da sequncia de entrada para o topo da pilha, seguido de
um movimento para o estado indicado. Se for criada uma nova operao que mantm
o deslocamento mas substitui o movimento pela reduo, o estado contendo a reduo
unitria pode ser removido da tabela. Assim, na tabela uma operao designada por
L4 representa um deslocamento seguido da reduo da regra 4 e substitui um deslocamento para estado que continha a reduo unitria, por exemplo s7.

Exemplo 5.23 A tabela do exemplo 5.7 foi criada pelo mtodo LR(0) pelo que as redues j
esto propagadas para todos os smbolos de anteviso. Neste caso so eliminados 4 estados e
substitudos os saltos, resultando uma tabela com quase metade da dimenso original,

( a
0 s2
1
2 s2 L2
3
7
L4

S A
g1

acc
r3
L1

g3

s7

os nmeros dos estados originais foi mantido para referncia com o exemplo 5.7.

Exemplo 5.24 No exemplo 5.11 apenas os 4 ltimos estados podem ser eliminados, depois de
propagadas as redues, j que o estado 3 inclui um deslocamento alm de uma reduo

a
0 s3
1
2
3 s6
4 L4
5
6
7 L3

b
s4

S
g1

A
g2

acc
s5
r4
g7
L1
L2

5.5. COMPACTAO DE TABELAS LR

83

Propagao de redues quase unitrias


Caso um estado inclua deslocamentos ou redues de mais de uma regra j no possvel elimin-lo, como no caso da propagao de redues unitrias. No entanto, se um
estado contiver apenas redues de uma s regra e deslocamentos, as redues ainda
podem ser propagadas para todos os smbolos de anteviso que representem situaes
de erro. A propagao de redues para situaes de erro do mesmo estado, s por si
no torna a tabelas mais esparsas, antes pelo contrrio.
Podemos considerar que as posies vazias de um estado, correspondentes a situaes
de erro, representam o comportamento por omisso ( default, em ingls ) do estado.
Nos estados em que se deu a propagao das redues quase unitrias, desaparecendo
as situaes de erro existentes, a reduo propagada passa a ser o seu comportamento
por omisso.
Criando uma nova coluna na tabela para o comportamento por omisso ( que designaremos por def ) e transportando para esta coluna a operao por omisso do estado,
pode-se remover das restantes colunas os valores de omisso. Nesta situao, as posies vazias da tabela indicam a necessidade de consultar a coluna de omisso. Como
resultado, em gramticas de linguagens reais, a tabela resultante fica mais esparsa. O resultado s vantajoso se o aumento de uma coluna ( a de omisso ) for compensada por
uma significativa reduo no nmero de redues. Tal facto s se verifica em gramticas
com muitos smbolos de anteviso.
Exemplo 5.25 No exemplo 5.24, logo depois de removidos os estados de redues unitrias, o
estado 3 inclui uma reduo quase unitria.

a
0 s3
1
2
3 s6
4 L4
5
6
7 L3

b
s4

def

S
g1

A
g2

acc
s5
r4
g7
L1
L2

Notar que neste exemplo, em que existe uma nica reduo quase unitria, limitamo-nos a deslocar a reduo de uma coluna para outra, embora a tabela passe a ter mais uma coluna. No
entanto, como as operaes por omisso so quase todas situaes de erro, e consequentemente
representadas por posies vazias, a tabela igualmente esparsa. De facto, utilizando o mtodo

84

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

de compresso double-offset indexing ambas as solues ocupam 13 posies. Como a tabela


pequena a reduo pelo mtodo genrico de double-offset indexing de apenas 30%, ou seja
cerca de metade da tabela original do exemplo 5.11.

5.5.3 Redues unitrias

Regras unitrias, cuja derivao tem um nico smbolo, esto frequentemente associadas a restries de prioridade entre operadores. Atendendo a que uma linguagem de
programao pode ter mais de 10 nveis de prioridade, podemos ter sequncias de 11
redues consecutivas e respectivos movimentos.
A compactao de redues unitrias pretende, com base no smbolo de anteviso reduzir directamente para a regra associada a esse smbolo, poupando todas as redues
intermdias. De um ponto de vista prtico, isto s pode ser efectuado se no houver
aces semnticas associadas a essas regras intermdias, pois seriam ignoradas. Tal ,
geralmente, o caso.
Note-se que este expediente no diminui a dimenso das tabelas, muito pelo contrrio. De facto, cada estado em vez de conter redues de uma s regra, possibilitando
a propagao de redues unitrias ou quase unitrias, vamos passar a ter diversas redues distintas, consoante o smbolo de anteviso. A vantagem reside no facto de o
processamento ser mais eficiente, pois efectuado em menos passos.
Uma soluo mais compacta e igualmente eficiente, consiste em especificar uma gramtica ambgua e atribuir prioridades e associatividades aos operadores ( ver 5.4.1 ). Este
expediente reduz efectivamente o nmero de regras e consequentemente o nmero de
estados da tabela de anlise, mas a sua especificao depende da ferramenta utilizada e
das suas capacidades.

5.6 Recuperao de erros


At aqui temos considerado que ao encontrar uma posio de erro, o erro reportado
e, o processamento termina. De facto, aps ser encontrado um erro sintctico deixa de
ser possvel produzir resultados teis, pois a sequncia de entrada no vlida. No
entanto, pode ser til continuar o processamento procura de mais erros. Notar que
tal procedimento pode ser, e muitas vezes , contraproducente j que os restantes erros
so consequncia do primeiro. Nestes casos, aps a correco do primeiro erro, todos

5.6. RECUPERAO DE ERROS

85

os restantes desaparecem. Desta forma, embora a recuperao de erros seja desejvel, a


sua utilidade limitada.

5.6.1 Recuperao por smbolo de erro


Uma soluo para a recuperao de erros consiste em introduzir regras especficas para
o efeito, permitindo que o processamento recomece em locais especficos da gramtica.
Estas novas regras incluem um smbolo terminal reservado para a recuperao de erro.
Em caso de erro, o analisador considera o smbolo de erro como smbolo de anteviso.
Se o estado actual no permite a deslocao deste smbolo, o analisador vai retirando
sucessivamente elementos da pilha at atingir um estado que o permita. Descoberto
o estado, o analisador vai removendo smbolos da sequncia de entrada at que exista
uma aco vlida nesse estado.
Exemplo 5.26 Considerando a gramtica com smbolo inicial S, onde error o smbolo de
recuperao de erro,
S
A
|
|
|

( A )
a
S
A , S
error

e a tabela LALR(1) resultante


( a
0 s2
1
2 s2 s4
3
4
5
6
7
8 s2
9

error

S
g1

g5

g3

acc
s6
s7
r2
r3
r5
r1

s8
r2
r3
r5
r1

r1
g9

r4 r4

onde o estado 6 o estado de recuperao de erro. Considere-se a anlise da sequncia de entrada


(a a), no pertencente linguagem descrita pela gramtica,

86

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA


pilha
entrada
0
(aa)$
aa)$
0(2
a)$
0(2a4
0(2a4
error a)$
0(2
error a)$
0(2error6
a)$
)$
0(2error6
0(2A
)$
)$
0(2A3
0(2A3)7
$
$
0S
0S1
$

aco
shift-2
shift-4
error
discard-4
shift-6
discard-a
reduce-5
goto-3
shift-7
reduce-1
goto-1
accept

Ao compactar a tabela de anlise acima obtm-se


(
0 s2
1
2 s2
3
8 s2

error

def

S A
g1

acc
L2

L5
L1

r3

g3

s8
r4

no havendo agora um estado de recuperao de erro explcito, devendo a recuperao do smbolo


de anteviso ser efectuada na primeira utilizao do smbolo de anteviso, aps o deslocamento
do smbolo de erro, error.
entrada aco
pilha
0
(aa)$ shift-2
aa)$ L-2
0(2
0(2A
a)$ goto-3
a)$ error
0(2A3
0(2A3 error a)$ discard-3
error a)$ L-5
0(2
0(2A
a)$ goto-3
0(2A3
a)$ discard-a
)$ L-1
0(2A3
$ goto-1
0S
0S1
$ accept

5.6. RECUPERAO DE ERROS

87

No entanto, a anlise da sequncia de entrada ((a), tambm no pertencente linguagem descrita


pela gramtica, mas entra em ciclo na recuperao de erro, pelo que a recuperao no possvel.
pilha
entrada
0
((a)$
(a)$
0(2
0(2(2
a)$
)$
0(2(2a4
0(2(2A
)$
0(2(2A3
)$
$
0(2(2A3)7
0(2S
$
$
0(2S5
0(2S5
error$
error$
0(2
0(2error6
$
0(2error6 error$
0(2
error$

aco
shift-2
shift-2
shift-4
reduce-2
goto-3
shift-7
reduce-1
goto-5
error
discard-5
shift-6
error
discard-6
shift-6

Se a primeira aco vlida, aps a descoberta do estado de erro, for um deslocamento, o


analisador conseguiu recuperar. Contudo, se a aco for uma reduo, quando a regra
de recuperao de erro termina com o smbolo de erro, esta reduo pode ser falsa pois
s no deslocamento seguinte teremos a certeza. Desta forma, as regras de recuperao
de erro devem ter, preferencialmente, um smbolo terminal aps o smbolo de erro.
Exemplo 5.27 A gramtica do exemplo 5.26 pode ser alterada para recuperar explicitamente
no parnteses de fechar em S. No entanto, tais alteraes no evitam que possam aparecer ciclos
na recuperao de erros, pois estes evidenciam a incapacidade de recuperar de alguns erros com
este mtodo.
S
|
A
|
|

( A )
error )
a
S
A , S

A colocao de regras de erro deve ser cuidada pois, em primeiro lugar a introduo
de novas regras pode sempre gerar conflitos, alm disso o excesso destas regras pode
dificultar a determinao de qual a regra que ser activada em cada situao, a menos
que se tenha presente o contedo da pilha do analisador. Assim, nas linguagens de

88

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

programao aconselha-se a recuperar de declaraes e instrues, sendo a declarao


ou instruo errada ignorada pelo processamento do erro.
A deteco de um erro interrompe o normal processamento das regras, nomeadamente
das aces semnticas a elas associadas. No caso destas aces terem efeitos secundrios, isto , modificarem variveis globais, a recuperao dos erros pode conduzir a
inconsistncias. Por exemplo, ao recuperar da declarao de uma funo, qualquer aco que necessitasse ser executada no fim da identificao da mesma no o ser. Da
mesma forma, se as aces semnticas influenciam a forma como os smbolos terminais
so enviados por um analisador lexical, por exemplo a definio de um novo tipo de
dados ( typedef, na linguagem C ), os resultados podem ficar incorrectos aps o primeiro
erro.
Para evitar comportamentos inesperados na recuperao de erros teremos de ter apenas
aces semnticas sem efeitos secundrios. A construo de rvore sintcticas uma
soluo que permite obviar os efeitos secundrios indesejveis, entre outras vantagens
que abordaremos mais adiante.

5.6.2 Recuperao automtica


Nos processos automticos o prprio analisador que vai manipulando os smbolos
na pilha e na sequncia de entrada at encontrar uma derivao vlida. Estes mtodos
embora complexos no exigem alteraes na gramtica.
A recuperao global de erros procura o menor conjunto de inseres e remoes de
smbolos que transforma a sequncia de entrada numa sequncia correcta, mesmo que
essas inseres e remoes no sejam no ponto onde o erro foi detectado.
O mtodo, designado por panic-mode, um mtodo de recuperao automtica simples
que se resume a:
1. guardar uma cpia da pilha do analisador;
2. retirar o elemento do topo e verificar se existe uma entrada vlida na tabela. Se
existir a recuperao est concluda;
3. se no existir entrada vlida voltar a 2. at esvaziar a pilha;
4. quando a pilha fica vazia, avanar um elemento lexical, repor uma cpia da pilha
inicial (antes do erro) e voltar a 2.;
5. se se atingiu o fim do ficheiro (ltimo elemento lexical), no foi possvel recuperar
do erro.

5.7. OUTRAS GRAMTICAS LR

89

Devido ao risco de erros em cascata, no devem ser impressas mensagens nos 4 a 5


passos (deslocamentos ou redues) que se seguem ao erro.

5.7 Outras gramticas LR


Existem outros mtodos de anlise LR alm dos atrs apresentados. Na prtica estas
tcnicas so de pouca utilidade pois a dimenso das tabelas cresce rapidamente. Por
outro lado, estas tcnicas no so de facto necessrias, pois todas as linguagens processveis deterministicamente tm gramticas SLR(1). Nesta linha, at o mtodo LALR(1)
no seria necessrio, mas como produz tabelas da mesma dimenso e suporta um maior
nmero de gramticas torna-se na escolha mais frequente.

5.7.1 Gramticas LR(1)


O mtodo LR(1), tambm designado por LR cannico, o mtodo ascendente mais geral com um s smbolo de anteviso. O autmato LR(1) replica todos os estados de
cada regra para todos os smbolos de FOLLOW. Assim, uma regra com 3 smbolos de
FOLLOW e que derive 4 smbolos ter 15 estados no autmato finito no determinista
LR(1), ao contrrio dos 5 estados do autmato LR(0). Cada estado no determinista tem
associado um dos smbolos de FOLLOW. As transies vazias, no autmato no determinista LR(1), so efectuadas apenas para os primeiros estados do no terminal que
tm associado o smbolo de FOLLOW que anteviso da transio vazia. Na realidade,
o smbolo de FOLLOW apenas utilizado quando a regra termina num smbolo no
terminal. Neste caso, em vez de utilizar os smbolos de anteviso precedentes, como no
mtodo LALR(1), cada transio vazia atinge apenas os estados iniciais do no terminal
com mesmo smbolo de anteviso. As redues so apenas efectuadas para o smbolo
de anteviso associado ao estado que reduz.
Se atendermos que as regras das gramticas de linguagens reais podem ter dezenas
de smbolos de FOLLOW, o autmato no determinista LR(1) fica muito extenso e,
comparativamente, tambm o respectivo autmato determinista.

Exemplo 5.28 Como no mtodo LR(1) o smbolo de anteviso apenas utilizado no ltimo
estado, este ser colocado aps os restantes smbolos da regra. Alis, este j era o expediente para
introduzir o smbolo de fim de sequncia utilizado na regra auxiliar da gramtica aumentada.

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

90
r0

r1

r2

S1$

c , d

c 6

A3 A4$
c

A 7 c

c 9 A 10 d
$
11
c 12 A 13 $
14
d 15 c
16
d 17 d
18
d 19 $
8

r3

Agora, os smbolos associados s transies vazias no representam, como no caso do mtodo


LALR(1), os smbolos de anteviso a transportar mas os smbolos de anteviso associados aos
estados no terminais atingidos. Por exemplo, a transio vazia do estado 2 dirige-se apenas
para os estado iniciais do no terminal A com os caracteres de anteviso c e d, ou seja, os
estados 5, 8, 14 e 16. A determinao dos estados do autmato determinista , a partir deste
ponto, a mesma j utilizada nos restantes mtodos ascendentes, no necessitando de indicar os
smbolos de anteviso por estado no terminal, tal como no mtodo LR(0) e SLR(1).

estado

entrada

I0

S
A
c
d
A
c
d
A
c
A
c
d

I2

I3
I6

move
0
1
3
6, 9
15, 17
4
12
19
7, 10
6, 9
13
12
19

f echo \move novo estado


2, 5, 8, 14, 16
I0
I1
11, 18
I2
5, 8
I3
I4
I5
I6
I7
I8
...
(I3 )
I9
(I6 )
(I7 )

a tabela de anlise construda da mesma forma utilizada nos mtodos anteriores, tendo o cuidado
de utilizar apenas o smbolo de anteviso associado ao estado a reduzir. Por exemplo, o estado 10
reduz apenas para o smbolo d.

5.7. OUTRAS GRAMTICAS LR

91

c
0 s3
1
2 s6
3 s3
4 r3
5
6 s6
7
8 r2
9

d
s4

S A
g1 g2

acc
s7

g5
g8

r3
r1
s7

g9
r3

r2
r2

A tabela resultante, com 10 estados, apenas 43% maior que utilizando os mtodos anteriores,
mas a gramtica muito pequena e usa muito poucos smbolos de anteviso. De facto esta
gramtica tambm LALR(1) e at LR(0), embora a tabela LR(1) resultante seja distinta.
O mtodo LR(1) produz tabelas de grandes dimenses para gramticas de linguagens
usadas na prtica. Por exemplo, linguagens como a linguagem C necessitam de pouco
mais de 200 regras ( correspondendo a quase 400 estados pelo mtodo LALR(1) ), enquanto a linguagem Java requer quase 400 regras e a linguagem C++ mais de 600 regras.
Se atendermos a que o mtodo LR(1), gera cerca de dez vezes mais estados que o correspondente LALR(1), a sua utilizao torna-se bastante limitativa. Na realidade, a maioria
das ferramentas de software existentes geram analisadores ascendentes LALR(1).

5.7.2 LALR(1) por agrupamento de estados LR(1)


A duplicao dos estados por smbolos de anteviso, utilizada pelo mtodo LR(1), no
se justifica quando alguns desses smbolos so frequentemente utilizados em conjunto.
Nestes casos, em que a gramtica LALR(1), as tabelas de anlise resultantes ficam
desnecessariamente maiores. O mtodo de agrupamento de estados permite obter tabelas de anlise LALR(1) a partir de estados LR(1). Caso a gramtica no seja LALR(1)
resultaram conflitos e o processo de agrupamento dever ser abandonado.
O agrupamento baseia-se em procurar outros estados deterministas que contenham estados no deterministas, ou itens, distintos apenas nos respectivos smbolos de anteviso. Diz-se que estes estados tm o mesmo ncleo, ou seja, se no se utilizassem
smbolos de anteviso associados aos itens, como no caso do mtodo SLR(1), os estados com o mesmo ncleo seriam exactamente iguais. Notar que cada item tem de ter
um item equivalente ( que difere apenas nos smbolos de anteviso ) no outro estado
determinista. No se trata de relaes de contm ou est contido, pois basta que

92

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

um item no tenha equivalente para no se poder efectuar o agrupamento, mesmo que


todos os outros tenham.
Exemplo 5.29 No exemplo 5.28, os estados 15, 17 e 19 diferem apenas no smbolo de anteviso.
Como o estado I4 = {15, 17} e o estado I7 = {19} contm estados que diferem apenas nos
smbolos de anteviso pode ser agrupados num estado I4,7 = {15, 17, 19}, ou seja o estado no
determinista LR(0) A c , com os trs smbolos de anteviso { c , d , $}.
Tambm os estados I3 e I6 se podem agrupar em I3,6 = {5, 8, 11, 6, 9, 12, 14, 16, 18} {A
c A, A c A, A d , { c , d , $}}, tal como I8 e I9 em I8,9 = {7, 10, 13} {A

c A, {c , d , $}}, ficando a tabela de anlise reduzida a


c
d
0 s3,6 s4,7
1
2 s3,6 s4,7
3,6 s3,6
r3
4,7 r3
5
8,9 r2
r2

S
g1

A
g2

acc
g5
g8,9
r3
r1
r2

indicamos os estados com os seus nmeros originais para facilitar a compreenso do processo de
agrupamento, mas atravs da renumerao dos estados obtemos uma tabela igual gerada pelo
mtodo LALR(1), pois a gramtica LALR(1).
O processo de agrupamento pesado, pois tem de ser construdo um autmato no determinista LR(1), efectuada a sua converso em determinista, o que s por si pesado,
como ainda necessrio descobrir quais os estados a grupar. Identificar quais os estados a agrupar computacionalmente pesado, pois temos de comparar cada estado com
todos os restantes, mesmo os j entretanto agrupados. Quando realizado mentalmente
o processo simplifica-se pois podemos identificar os itens equivalentes e testar apenas
os estados deterministas que contm pelo menos um desses estados como possveis
candidatos.

5.7.3 Gramticas quase LALR(1)


A ideia que est na base das gramticas quase LALR(1) consiste agrupar apenas os estados que no geram conflitos, podendo no chegar a obter uma tabela LALR(1). No
entanto, ao agrupar dois estados compatveis podemos forar outros estados no compatveis a serem agrupados, provocando um conflito reduo-reduo. Caso seja gerado

5.7. OUTRAS GRAMTICAS LR

93

um conflito devemos recuar ( backtrack, em ingls ) e tentar outros agrupamentos. Para


mais, a ordem de agrupamento pode influir no nmero final de estados, s podendo ser
obtido o nmero mnimo depois de tentadas todas as ordenaes possveis.
Para tornar o algoritmo mais acessvel, possvel ir agrupando os estados medida que
vo sendo criados, nunca chegando a construir todos os estados do autmato LR(1).
Nesta aproximao, designada por algoritmo de Pager, em vez de agrupar os estados
e verificar os resultados obtidos, definem-se critrios que garantem um agrupamento
seguro.
O critrio mais simples, designado por compatibilidade fraca, baseia-se em dois conjuntos de smbolos de anteviso L1 e L2 de estados do ncleo de s e outros dois L1 e L2 do
ncleo de s, onde os estados deterministas s e s so compatveis. Os estados s e s so
fracamente compatveis, e podem ser agrupados com segurana, se e s se garantirem
comulativamente as condies: L1 L2 = , L1 L2 = , L1 L2 6= e L1 L2 6= .
O algoritmo, embora gere um analisador correcto, no produz necessariamente o nmero mnimo de estados. Os estados que no so fracamente compatveis podem ainda
ser agrupados se o potencial conflito nunca atingido, ou seja se os estados so fortemente compatveis. De facto, os smbolos de anteviso podem nem chegar a ser utilizados, como vimos em alguns exemplos de exerccios anteriores. O agrupamento ainda
possvel depois de verificar se as regras, cujos itens incluem os smbolos que geram o
potencial conflito, fazem parte dos mesmos estados at respectiva reduo.

5.7.4 Gramticas LR(k), k > 1


As tcnicas de anlise SLR(1), LALR(1) e LR(1) podem ser extendidas para utilizar mais
um smbolo de anteviso. As gramticas processveis por estes mtodos tambm vo
sendo cada vez mais gerais, ou seja, para k > 0 temos que LR(k 1) SLR(k)
LALR(k) LR(k) SLR(k + 1). Para tal necessrio calcular os conjuntos de FIRST
e FOLLOW para k-simo smbolo, designados por FIRSTk e FOLLOWk . Os diversos
mtodos podem ser resumidos por:
LR(k) : ao processar a B, x, antever B , y, onde y F irstk (x). Reduzir a
regra A para o smbolo de anteviso x se o estado corrente contiver A , x.
Deslocar para o smbolo de anteviso x se o estado corrente contiver A a, y,
onde a Vt e x F irst(ay).
SLR(k) : uma produo reduzida para o smbolo x se x F OLLOWk .
LALR(k) : agrupar os estados do autmato LR(k) com o mesmo ncleo.

94

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

Exemplo 5.30 Dois exemplos de gramticas que so LR(2), mas no so LR(1),


S
|
A
B

S
|
X
Y

A x
B c
a c
a

X a b
Y a c

a gramtica da esquerda apresenta um conflito deslocamento-reduo para o smbolo c , que


s pode ser resolvido com o segundo smbolo de anteviso: x ou $. A gramtica da direita
apresenta um conflito reduo-reduo pois quer X ou Y so seguidos do smbolo a , s podendo
ser efectuada a distino no segundo smbolo de anteviso: b ou c .
As tabelas LR(2) apresentam 2 smbolos de anteviso, estando apenas representadas as sequncias
com pelo menos uma aco vlida,

a, c
0 s4
1
2
3
4
5
6
7

0
1
2
3
4
5
6
7

a, b
r3

c , x

x ,$

c , $ $, $

S A
g1 g2

B
g3

acc
s5
s6
s7

r4
r1
r2
r3

b ,$

a, c

c , $ $, $
r4
acc

S X Y
g1 g2 g3

s4
s5
s6
s7
r1
r2

5.8 Propriedades da anlise ascendente


Todos os mtodos de anlise ascendente LR que referimos partilham caractersticas comuns importantes. Nomeadamente, o facto de uma gramtica ambgua nunca ser LR,
embora nenhum dos mtodos LR consiga processar todas as gramticas livre de contexto. Contudo, um analisador LR :

5.8. PROPRIEDADES DA ANLISE ASCENDENTE

95

eficiente : o processamento proporcional dimenso da entrada.


correcto : detecta todas as entradas no vlidas e produz resultados correctos para entradas vlidas.
no ambguo : produz resultados deterministas.
linear : no espao e no tempo face ao nmero de smbolo na sequncia de entrada.

5.8.1 Recurso em analisadores LR


Exceptuando o casos em que os operadores, ou outras regras gramaticais, tm associatividades definidas na prpria linguagem, o utilizador pode optar por efectuar as
repeties atravs de recursividades direita ou esquerda. Como sabemos, as gramticas descendentes no podem ter recursividades esquerda, necessitando ser construda uma gramtica equivalente de onde foram retiradas da todas as recursividades
esquerda. As gramticas LR tornam-se mais apelativas pois no apresentam tais limitaes. De facto, possvel construir tabelas de anlise LR para gramticas que tenham
quer recursividades direita como esquerda.
lista

lista term
| term

lista

term lista
| term

No entanto, os dois exemplos de recursividade acima apresentam comportamentos


muitos distintos ao derivar listas. Por exemplo, uma sequncia de 5 elementos terminais
produz sucessivamente as seguintes derivaes
lista
lista term5
lista term4 term5
lista term3 term4 term5
lista term2 term3 term4 term5
term1 term2 term3 term4 term5

lista
term1 lista
term1 term2 lista
term1 term2 term3 lista
term1 term2 term3 term4 lista
term1 term2 term3 term4 term5

Um analisador ascendente constroi a estas sequncias por ordem inversa, de baixo para
cima.
recurso esquerda Ao recorrer recurso do lado esquerdo o analisador desloca o
primeiro terminal term1 para a pilha e de seguida aplica a segunda regra, reduzindo-o a
lista. Seguidamente, desloca term2 e, novamente, reduz o conjunto a lista. Desta forma,
em mdia.
a pilha contm no mximo dois elementos e 10
6

96

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

recurso direita Na recurso direita todos os cinco terminais so deslocados para


a pilha, antes da primeira reduo. Depois temos uma sucesso de cinco redues,
a comear no term5 e a terminar no term1 . Assim, a pilha contm no mximo cinco
.
elementos e em mdia 20
6
Em resumo, a recurso direita requer uma pilha auxiliar maior que a recurso esquerda e efectua as redues pela ordem inversa da sequncia de entrada. A dimenso
da pilha pois funo da maior sequncia de entrada possvel, no caso da recurso
direita, e funo da gramtica, no caso da recurso esquerda. Consequentemente,
aconselha-se a utilizar, sempre que possvel, recurso esquerda em gramticas LR,
pois podemos controlar as regras da gramtica, mas no a sequncia de entrada.

associatividade Como acabamos de ver, em analisadores LR a recurso esquerda


produz associatividade esquerda e recurso direita produz associatividade direita.
Quando se pretende que o operador tenha associatividade direita somos levados a
utilizar recurso direita. Para poder ter associatividade direita com recurso esquerda podemos alterar as regras gramaticais de tal forma que as aces semnticas a
elas associadas possam construir uma rvore sintctica inversa.
lista
inverte

lista term
|
lista

criar a lista
adicionar ao fim da lista
verificar se uma lista vazia

Num analisador ascendente a primeira reduo efectuada para a derivao vazia (),
que cria a lista. Cada novo elemento adicionado a essa lista pela ordem inversa, permitindo o seu posterior processamento pela ordem correcta, a que corresponde a associatividade direita. No fim, como com a gramtica alterada passmos a permitir
listas vazia, necessitamos de verificar se a lista no contm elementos e, caso seja o caso,
reportar um erro.
Notar que o processo no estritamente gramatical, requerendo que as aces associadas a cada regra colaborem no processo. O mesmo processo tambm pode ser utilizado
para permitir associatividade esquerda com recursividade direita. No entanto, muitos compiladores no recorrem a este processo, apresentando um limite de recurso no
processamento de operadores associativos direita. Embora a maioria das linguagens
no tenha muitos operadores associativos direita, um teste pode ser realizado repetindo sucessivamente, em geral 5000 vezes suficiente, tal operador. Por exemplo, na
linguagem C pode-se repetir sucessivas atribuies de uma varivel a ela prpria.

5.9. EXERCCIOS

97

5.8.2 Anlise ascendente versus descendente


As duas tcnicas de anlise sintcticas mais utilizadas nas escrita de compiladores so
o mtodo descendente LL(1) e o mtodo ascendente LALR(1). O mtodo LL(1) mais intuitivo pela forma como as regras so derivadas. Por outro lado, as gramticas LALR(1)
so, em geral, mais fceis de obter e menos limitativas em termos de recursividades e
factorizaes. A colocao de aces mais permissiva em analisadores LL(1) alm de,
como veremos mais adiante, permite a utilizao de atributos sintetizados e herdados.
A recuperao de erros tambm mais simples nos analisadores LL(1) pois a pilha contm informao sobre o que falta processar, ao contrrio dos ascendentes que contm a
informao lida.
A dimenso das tabelas nos analisadores ascendentes pode ser, no pior caso, exponencial com a dimenso da gramtica. Contudo, as tabelas LL(1) contm 10% de entradas
no nulas enquanto as tabelas LALR(1) apenas 5%, permitindo maiores compresses.
Mesmo assim, as tabelas LALR(1) resultam cerca de 50% maiores que as tabelas LL(1),
para algumas das linguagens de programao mais conhecidas.
Em resumo, o mtodo LL(1) mais vantanjaso em todos os aspectos excepto nas limitaes da gramtica. Contudo, como a maioria dos esforo desenvolvido pelo utilizador
na anlise sintctica reside na escrita da gramtica, o mtodo LALR(1) acaba por ser
mais utilizado, excepto se j existir um gramtica LL(1) disponvel.

5.9 Exerccios
Exerccio 5.1 Desconhecendo a gramtica e o mtodo ascendente utilizado para gerar a tabela
seguinte, justifique se a gramtica LR(1), LALR(1), SLR(1) ou LR(0):

0
1
2
3
4
5

a
s3

S A B
g1 g2

acc
s5
r2

g4
r1
r3

Exerccio 5.2 Diga, justificadamente, porque a gramtica seguinte no SLR(1):


S Y b
Y a
| a b

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

98

Exerccio 5.3 Construa a tabela de anlise SLR(1) da gramtica


M
|
|
Y
|

MN
a

1. Atravs da anlise da tabela produzida justifique porque a gramtica no LR(0).


2. Diga justificadamente se a gramtica LALR(1)
Exerccio 5.4 Diga, justificadamente, porque a gramtica seguinte LALR(1), mas no SLR(1):
X
|
|
|
M

M a
b M c
d c
b d a
a

Exerccio 5.5 Apresente a tabela de anlise, pelo mtodo LALR(1), da gramtica


E
|
L
|

[ E ; L ]
id
E
E ; L

Exerccio 5.6 Pretende-se desenvolver um analisador sintctico ascendente para a gramtica


seguinte:
A
B

y|z
BAx|ABzy|By|x

Onde B o smbolo inicial e { x, y, z } o conjunto de smbolos terminais da gramtica.


1. Construa a tabela de parsing para um analisador sintctico ascendente LALR(1) para processar a gramtica acima, indicando o conjunto de estados do parser, e os smbolos de
anteviso.
2. Compacte a tabela de anlise que obteve, eliminando as redues unitrias e quase unitrias, bem como propagar as redues que permitam compactar a tabela.

5.9. EXERCCIOS

99

3. Apresente uma tabela com o contedo da pilha, a entrada e a aco realizada em cada
passo da anlise, quando a sequncia de entrada : x y z x . Indique em quantos passos
processada a sequncia indicada.
(em caso de conflito assuma o mesmo comportamento da ferramenta YACC)
Exerccio 5.7 Considere a gramtica,
S
|
|
L
|

a
( L )
( error )
S
L , S

Construa uma tabela de anlise, pelo mtodo SLR(1), e apresente os passos necessrios para a
anlise das sequncias:
1. (a, (a, , a, ), (a))
2. (a, , (a), a)
3. (a, a, (a, (a, a)
Exerccio 5.8 Construa a tabela de anlise para a gramtica seguinte, resolvendo os conflitos
que encontrar por forma a que as operaes tenham a precedncia usual,
E
|
|
|

while E do E
id := E
E + E
id

Exerccio 5.9 Considere a gramtica onde se pretende que os operadores tenham a prioridade e
associatividade usado na linguagem C.
E
|
|
|
bin
una

E bin E
una E
( E )
id
= | + | - | * | / | %
- | *

1. Justifique porque so necessrias alteraes gramtica, no bastando resolver os conflitos


de acordo com as prioridades.

100

CAPTULO 5. ANLISE SINTCTICA ASCENDENTE POR TABELA

2. Apresente a tabela de anlise de uma gramtica ambgua equivalente, mas que j permita
definir as prioridades e associatidades por resoluo dos conflitos criados.
3. Apresente a tabela de anlise de uma gramtica no ambgua equivalente, onde as prioridades e associatidades foram resolvidas gramaticalmente
4. Indique em quantos passos analisada a sequncia x = a + b (c d), por ambas as
tabelas de anlise. Compare as duas solues quanto dimenso da tabela e nmero de
passos necessrios.
5. Construa a tabela de anlise para a gramtica no ambgua aplicando as redues unitrias existentes e compare o nmero de passos agora necessrios para processar a mesma
sequncia.

Você também pode gostar