Você está na página 1de 34

Teoria da Computao Cap.

5 Linguagens Livres de Contexto


LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
179
CAPTULO 5
LINGUAGENS LIVRES DE CONTEXTO
5.1. Introduo 181
5.2 Gramticas livres de contexto 181
5.2.1. Definio e exemplos 183
5.2.2 Derivao pela extrema direita e pela extrema esquerda 188
5.2.3.rvores de derivao (parse trees) 190
5.3. Parsing 194
5.3.1.Parsing e ambiguidade 194
5.3.2 Ambiguidade nas gramticas e nas linguagens 203
5.4. Gramticas livres de contexto e linguagens de programao 210
Biliografia 211
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
180
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
181
5.1. Introduo
Conclumos o captulo anterior provando que h algumas linguagens que no so regulares.
De facto h muitas linguagens no regulares, e so tantas que se podem classificar em vrias
famlias, como veremos posteriormente.
As linguagens livres de contexto constituem a famlia mais importante de linguagens, a ela
pertencendo as linguagens de programao. As linguagens regulares so um caso particular de
linguagens livres de contexto, constituindo uma sub-famlia destas.
Figura 5.1.1. Relao entre as linguagens regulares e as linguagens livres de contexto.
Neste captulo estudaremos as linguagens livres de contexto usando sobretudo as
gramticas (livres de contexto) e suas propriedades. Como veremos no Captulo 6 os
autmatos finitos no so capazes de reconhecer linguagens livres de contexto no-regulares
por no terem memria.
5.2. Gramticas livres de contexto
Nas gramticas lineares que estudmos anteriormente existem duas restries fundamentais:
- na parte esquerda das produes existe apenas uma varivel
- na parte direita existe apenas uma varivel na posio mais esquerda ou mais
direita.
Relaxando a segunda restrio, e permitindo que a existam diversas variveis em qualquer
posio, obtm-se as gramticas livres de contexto.
Linguagens livres de contexto
Linguagens
regulares
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
182
5.2.1. Definio e exemplos
Definio 5.2.1. Gramtica livre de contexto e linguagem livre de contexto.
Uma gramtica G = ( V, T, S, P ) chamada livre de contexto se todas as produes em P tm
a forma
A x
em que AeV e xe(VT)*, isto , x uma expresso qualquer composta por variveis e/ou
caracteres terminais ambos em nmero arbitrrio.
Uma linguagem livre de contexto se e s se existir uma gramtica livre de contexto tal
que L = L(G).
Note-se que toda a gramtica regular tambm livre de contexto, e portanto toda a
linguagem regular tambm livre de contexto.
O nome de livre de contexto advm do seguinte facto: a substituio de uma varivel na
parte esquerda de uma produo pode fazer-se em qualquer altura em que essa varivel
aparea numa forma sentencial. Essa substituio no depende dos smbolos do resto da
forma sentencial, ou seja, no depende do seu contexto. Esta caracterstica resulta da
existncia de uma s varivel na parte esquerda das produes. Se existissem duas como por
exemplo em
AB x
a produo s se poderia aplicar quando aparecesse o par AB ou seja, quando fosse esse o
contexto de A e de B. Esta gramtica diz-se por isso dependente do contexto.
Exemplo 5.2.1.
A gramtica G=({S}, {a,b}, S, P} com produes
S aSa
S bSb
S
livre de contexto.
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
183
Uma derivao possvel,
S aSa aaSaa aabSbaa aabbaa
Cada S introduz ou um par de as ou um par de bs, sempre no meio da forma sentencial, e
por isso no final a cadeia obtida par e simtrica em relao ao seu centro.
A linguagem desta gramtica L(G) ={ww
R
: we {a,b}*}, uma linguagem livre de
contexto no regular. Tente o leitor desenhar para ela um autmato finito.
Exemplo 5.2.2.
A gramtica G com produes
S abB
A aaBb
B bbAa
A
livre de contexto.
Uma derivao dela:
S abB abbbAa abbbaaBba abbbaabbAaba abbbaabbaaBbaba
abbbaabbaabbAababa abbbaabbaabbaaBbababa abbbaabbaabbaabbAabababa
abbbaabbaabbaabbaaBbabababa abbbaabbaabbaabbaabbAababababa
abbbaabbaabbaabbaabbababababa
No fcil, olhando para as produes, generalizar a forma das cadeias obtidas pela
gramtica. No entanto, fazendo uma anlise experimental, produzindo cadeias de vrios
comprimentos, verifica-se que L(G) = { ab(bbaa)
n
bba(ba)
n
: n> 0 }.
Exemplo 5.2.3.
Mostrar que a linguagem L = {a
n
b
m
: n= m } livre de contexto. Note-se que pela definio
da linguagem o nmero de as tem que ser diferente do nmero de bs.
Para isso tem que se encontrar uma gramtica livre de contexto que a produza. Para o caso
n = m viu-se no exemplo 1.3.2 do Cap. 1, obtendo-se
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
184
G =({S}, {a,b}, S, P)
S aSb|
Seja agora o caso n > m.
Primeiro forma-se uma cadeia com um nmero igual de as e de bs; de seguida
acrescente-se um a adicional esquerda. Para isso usam-se aquelas produes do caso n=m e
alm disso uma para introduzir um ou mais as adicionais:
S AS
1
,
S
1
aS
1
b | ,
A aA | a
Note-se que a segunda produo gera um nmero igual de as e de bs. A ltima acrescenta
as esquerda. A primeira, ao criara o A logo de incio, torna possvel a ltima.
Esta gramtica no linear porque na primeira produo aparecem duas variveis no lado
direito. Mas livre de contexto porque do lado esquerdo aparece s uma varivel.
Tomemos agora o caso n < m. Aqui temos uma situao contrria anterior: introduzem-
se tantos as como bs e depois introduzem-se direita um ou mias bs. Teremos as produes
S S
1
B,
S
1
aS
1
b | ,
B Bb | b.
Para o caso n = m, juntam-se os dois conjuntos de produes, obtendo-se:
S AS
1
| S
1
B,
S
1
aS
1
b | ,
A aA | a,
B Bb | b.
Note-se que para juntar os dois conjuntos de produes basta pr as duas primeiras
alternativas a partir de S.
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
185
Exemplo 5.2.4
Considere-se a gramtica com produes
S aSb | SS |
Trata-se de uma gramtica livre de contexto e no linear (porqu?).
Algumas cadeias geradas:
S SS SSSS aSbaSbaSbaSbabababab
S aSb aSSbaaSbSb aaaSbbaSbb aaaSSbbaaSbbb
aaaaSbaSbbbaaSbbb aaaababbbaabb.
Gera cadeias com um nmero de as igual ao nmero de bs (porqu ?) e em que o nmero
de as em qualquer prefixo de qualquer cadeia maior ou igual ao n de bs, i.e.
L = {w e {a,b}* : n
a
(w) = n
b
(w) e n
a
(v) > n
b
(v), v um prefixo qualquer de w}
e em que o nmero de bs em qualquer sufixo de qualquer cadeia maior ou igual ao n de
as, i.e.
L = {w e {a,b}* : n
a
(w) = n
b
(w) e n
a
(u) n
b
(u), u um sufixo qualquer de w}
Substituindo a por parntese esquerda e b por parntese direita, obtm-se a linguagem
para descrever a regra dos parnteses nas linguagens de programao. Ela contm por
exemplo os casos (), (()), ((()())), ()()()(); etc. Esta situao dada pela gramtica
G=({S}, {(,)}, S, P)
com produes
S (S) | SS |
Uma derivao ser
S (S) (SS) ((S)S) (( )S) (( ))
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
186
Neste exemplo os parnteses fazem parte do alfabeto da linguagem. J no captulo 1 vimos
que um alfabeto pode ser composto por qualquer tipo de objectos.
Exemplo 5.2.5
Palndromos em {0, 1}, (Hopcroft, 170).
A linguagem dos palndromos pode-se definir por induo:
Base da induo: , 0 e 1 so palndromos (palndromos elementares)
Induo: se w um palndromo, tambm o so 0w0 e 1w1.
Nenhuma cadeia um palndromo de 0s e 1s a menos que seja formada a partir destas
regras, que se podem traduzir pelas produes seguintes:
1. P
2. P 0
3. P 1
4. P 0P0
5. P 1P1
Exemplo 5.2.6
Seja o alfabeto E={x, y, z, +, - , ( , )}. Encontrar uma gramtica que gere todas as expresses
aritmticas possveis com este alfabeto, com por exemplo { x, y, z, x+y, x-y, x+(y-z), }.
Uma soluo possvel:
G=({E,V}, { x, y ,z, +, - , (, ), E, P)
Em que o conjunto P composto pelas seguintes 7 produes
1. E E + E
2. E E - E
3. E (E)
4. E V
5. V x
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
187
6. V y
7. V z
Como se poder gerar x+(y-z) ?
E E + E (prod. 1)
V + E (prod. 4)
x + E (prod. 5) x + (E)
(prod. 3)
x + (E - E) (prod. 2)
x + (V - E) (prod. 4)
x + (y - E) (prod. 6)
x + (y - V) (prod. 4)
x + (y - z) (prod. 7)
Exerccio 5.2.1.
Considere a gramtica com as produes
S 0B | 1A
A 0 | 0S | 1AA
B 1 | 1S | 0BB
Gere cinco cadeias com a gramtica. Que linguagem lhe est associada?
5.2.2. Derivao pela extrema direita e pela extrema esquerda
Nas gramticas livres de contexto no lineares aparece mais do que uma varivel na parte
direita das produes. Tem-se por isso uma escolha na ordem pela qual se substituem as
variveis. Por exemplo,
G=({A,B,S}, {a,b}, S, P} com produes
1. S AB
2. A aaA
3. A
4. BBb
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
188
5. B
Exemplo de derivao (o nmero da produo aplicada est indicado sobre a seta):
S
1
AB
2
aaAB
3
aaB
4
aaBb
5
aab
S
1
AB
4
ABb
2
aaABb
5
aaAb
3
aab
A linguagem correspondente L(G) = {a
2n
b
m
: n>0, m> 0 }
Nestas duas derivaes obtm-se o mesmo resultado, usando precisamente as mesmas
derivaes mas por ordem diferente. Ser sempre assim? Se se usam as mesmas derivaes,
ainda que por diferente ordem, introduzem-se os mesmos caracteres nas formas sentenciais e
na sentena final, mas pode acontecer de diferentes ordens de aplicao das produes
resultem em cadeias diferentes. Por exemplo as produes
1. S aSb
2. S bSa
3. S
A produo 1-2-3 d
S
1
aSb
2
abSab
3
abab
e a produo 2-1-3
S
2
bSa
1
baSba
3
baba
d uma cadeia diferente. Portanto a ordem das produes importa. Neste caso aplicando a
produo 1 em primeiro lugar produzem-se cadeias que comeam por a, e aplicando a 2 em
primeiro lugar cadeias que comeam por b.
Definio 5.2.2
Uma derivao diz-se pela extrema esquerda se em cada passo se substitui a varivel mais
esquerda na forma sentencial.
Se se substituiu a varivel mais direita, a derivao diz-se pela extrema direita.
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
189
Exemplo 5.2.7
Seja a gramtica com as produes
S aAB,
A bBb,
B A |
Ento
S aAB aA abBb abAb abbBbb abbbb
uma derivao pela direita e
S aAB abBbB abAbB abbBbbB abbbbB abbbb
uma derivao pela esquerda.
5.2.3.rvores de derivao (parse trees)
As rvores de derivao so uma alternativa escrita das produes, permitindo uma
visualizao grfica do processo de gerao de cadeias. Por outro lado, lidas de forma inversa,
permitem reconstruir as produes a partir da cadeia.
Um rvore de derivao uma rvore ordenada em que
- os vrtices iniciais e intermdios so as variveis da gramtica, etiquetados pelo
lado esquerdo das produes
- os filhos de um vrtice representam os lados direito correspondente ao n pai.
Por exemplo a rvore da Fig. 5.2.1corresponde s produes:
S abABc
A
B c
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
190
A partir da raiz aplica-se a primeira produo, dando 5 filhos, dos quais 3 so folhas e 2
so vrtices interiores (variveis). Depois do vrtice A resulta a folha c pela segunda produo
e do vrtice B a folha pela terceira produo. Na rvore nada indica a ordem de aplicao
das segunda e terceira produes.
Uma rvore de derivao inicia-se na raiz, com o smbolo inicial (em geral S), e termina
em folhas que so terminais (smbolos do alfabeto). Em cada nvel mostra como se substitui
cada varivel nas derivaes. Quando um vrtice contm um smbolo terminal, dele no parte
qualquer aresta. Apenas dos vrtices com variveis, chamados vrtices interiores (no raiz),
partem arestas.
Vejamos a definio formal.
Definio 5.2.3. rvore de derivao
Seja G = (V, T, S, P) uma gramtica livre de contexto. Uma rvore ordenada uma rvore de
derivao para a gramtica G se e s se tiver as seguintes propriedades:
1. A raiz etiquetada pelo smbolo inicial, em geral S.
2. Todas as folhas tm uma etiqueta de T {}, isto , um smbolo terminal
3. Todos os vrtices interiores (vrtices que no so folhas) tm uma etiqueta de V,
i.e., uma varivel.
4. Se um vrtice tem uma etiqueta A e V, e se os seus filhos so etiquetados (da
esquerda para a direita) a
1
, a
2
,..., a
n
ento P deve conter a produo da forma
S
a b B c A

c
vrtice raiz
5 filhos da
raiz
folha
vrtice interior
Figura 5.2.1. Uma rvore de derivao.
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
191
A a
1
a
2
..., a
n
em que a
i
pode ser um smbolo terminal ou uma varivel.
5. Uma folha etiquetada no tem irms, i.e., um vrtice com um filho no pode
ter outros filhos.
Se uma rvore verifica as propriedades 3, 4 e 5, mas a propriedade 1 no se verifica
necessariamente e a propriedade 2 substituda por
2a. Todas as folhas tm etiquetas de V T {}, i.e., uma varivel ou um smbolo
terminal,
diz-se uma rvore de derivao parcial, sendo parte de uma rvore maior. Isto , se
extrairmos de uma rvore de derivao uma sub-rvore interior, esta ser uma rvore de
derivao parcial, podendo ter variveis nas folhas. Uma rvore de derivao parcial deriva
formas sentenciais e pode no derivar cadeias terminais. Pelo contrrio uma rvore de
derivao total d sempre cadeias terminais. Uma rvore de derivao por defeito total, e
portanto no necessrio adjectiv-la.
Lendo as folhas da rvore, da esquerda para a direita, omitindo quaisquer que se
encontrem, obtm-se o fruto (yield) da rvore. O fruto a cadeia de terminais obtida quando
se percorre a rvore de cima para baixo, tomando sempre o ramo inexplorado mais
esquerda.
Exemplo 5.2.8
Seja a gramtica G=({S,A,B}, {a,b}, S, P} com produes
S aAB,
A bBb,
B A |
A rvore de derivao parcial da Fig. 5.2.2 corresponde a
S aABabBbB
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
192
A rvore de derivao Fig. 5.2.3 corresponde derivao pela esquerda
S aABabBbBabbAabbbBbabbbb
ou derivao pela direita
S aABaAAaAbBb aAbbabBbbbabbbb
Uma outra rvore de derivao Fig 5.2.4 corresponde a (pela esquerda)
S aABabBbBabbBabb
ou a (pela direita)
S aABaAabBbabb
S
a B
b
A
B b
b
A
B b
b
A
B b
S
a B

Figura 5.2.2. rvore


de derivao parcial
Figura 5.2.3. rvore de derivao total
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
193
Podemos ver que uma rvore de derivao est ligada a uma derivao particular e no
um esquema geral de derivaes para uma dada gramtica. Cada cadeia ter a sua rvore de
derivao prpria. Alm disso a rvore exprime uma derivao pela direita ou uma derivao
pela esquerda.
Dada uma gramtica livre de contexto G=(V, T, S, P), para toda a cadeia we L(G), existe
uma rvore de derivao de G cujo fruto w. Basta desenh-la aplicando as produes que
geraram w.
Inversamente, o fruto de qualquer rvore de derivao, desenhada de acordo com as
produes de P, pertence L(G).
Por outro lado se t
G
alguma rvore de derivao parcial de G cuja raiz est etiquetada por
S, ento o fruto de t
G
uma forma sentencial da gramtica G.
O leitor pode ver uma prova formal por induo destas afirmaes em Linz p. 132.
As rvores de derivao evidenciam as produes usadas na obteno de uma qualquer
cadeia, mas no explicitam a ordem da sua aplicao. Qualquer cadeia weL(G) tem uma
derivao pela extrema esquerda e uma derivao pela extrema direita. Este facto interessante
constata-se observando que a rvore tanto pode ser desenhada da esquerda para a direita
(produes pela esquerda) como da direita para a esquerda (produes pela direita).
As rvores de derivao, na literatura de lngua inglesa (por exemplo em Hopcroft, ou em
Sipser), so chamadas parse trees. Elas mostram como os smbolos terminais de uma cadeia
se agrupam em sub-cadeias, cada uma das quais pertence linguagem de uma das variveis
da gramtica, isto , ao conjunto das cadeias gerveis a partir de uma varivel da gramtica
b
A
B b
S
a
B

Figura 5.2.4. Outra rvore de derivao


Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
194
num vrtice interior. Nos compiladores as rvores de parsing so a estrutura de dados
escolhida para representar o cdigo fonte de um programa. essa estrutura de dados assim
definida que facilita a traduo do cdigo fonte em cdigo executvel, ao permitir que sejam
usadas funes recursivas para o processo de traduo. Na disciplina de compiladores ter o
leitor oportunidade de aprofundar esta questo. A palavra derivao pode, at certo ponto, ser
usada como traduo de parsing. No entanto parsing no a derivao em si mesma mas a
sua procura e por isso mantm-se o termo parsing original, falta de melhor traduo.
5.3. Parsing
Dada uma gramtica qualquer, sabemos gerar cadeias da sua linguagem, aplicando as suas
produes. As cadeias geradas pertencem linguagem da gramtica.
Mas podemos agora considerar a questo inversa. Dada uma cadeia w, como saber se ela
pertence a uma certa linguagem L(G) ? Este o problema da pertena, que j conhecemos
das linguagens regulares.
E se a cadeia pertence linguagem, qual a sequncia de produes que a gerou? Este o
problema de parsing : encontrar uma sequncia de produes pelas quais se deriva weL(G).
O conceito de parsing, uma palavra difcil de traduzir, aplica-se no estudo das linguagens
naturais (ver por exemplo em http://nltk.sourceforge.net/doc/en/parse.html) e nas linguagens de
computador. Os compiladores quando analisam um programa escrito numa dada linguagem,
fazem precisamente isso: procuram a sequncia de produes da gramtica da linguagem que
levou ao programa concreto. Se no a encontram, indicam erro. Se a encontram, a compilao
bem sucedida.
5.3.1. Parsing e ambiguidade
O parsing uma operao delicada, que tem absorvido uma parte significativa da investigao
em computao a nvel mundial. Se imaginarmos que os programas de computador so cada
vez maiores, fazer o seu parsing em tempo til (para o compilar depois) um desafio para o
qual ainda hoje se procuram respostas melhoradas. As tcnicas de parsing baseiam-se na
teoria de grafos e seus algoritmos (por isso a teoria de grafos um dos mais importantes
temas matemticos das cincias da computao).
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
195
Dada uma cadeia w em L(G) pode-se fazer o seu parsing por procura exaustiva,
construindo sistematicamente todas as derivaes possveis (pela esquerda, por exemplo) e
verificando se se obtm a procurada w ou no. Esta tcnica executa-se por voltas sucessivas,
at que se encontre uma resposta. Procede-se do modo seguinte.
1 volta - analisar as produes do tipo
S x
encontrando todas as formas sentenciais e cadeias x que se podem obter de S em um passo.
Alguma w? Se sim parar
2 volta aplicar todas as produes possveis varivel mais esquerda em cada forma
sentencial x da 1 volta, obtendo-se um conjunto de formas sentenciais alcanveis em dois
passos.
Alguma w ?
3 volta aplicar todas as produes possveis varivel mais esquerda em cada forma
sentencial obtida da 2 volta, obtendo um novo conjunto de formas sentenciais alcanveis em
trs passos.
Alguma w ?
e assim sucessivamente.
Se we L(G), deve ter uma derivao de extrema esquerda de comprimento finito. Por isso
este mtodo exaustivo h-de encontrar a soluo, se ela existir.
Trata-se de um mtodo de parsing de cima-para-baixo, que pode ser visto simplesmente
como a construo da rvore de derivao para baixo a partir da raiz.
Exemplo 5.3.1
Seja a gramtica com as produes
S SS | aSb | bSa | .
Fazer o parsing da cadeia w = aabb.
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
196
Vejamos como se aplica a procura exaustiva, desenhando a rvore da procura.
1 volta: inicializar a produo da gramtica a partir da raiz S
Nenhuma cadeia produzida w. Podem-se desde j eliminar as folhas de bSa (dado que w
se inicia por a) e (dado que |w|>0). Em cada etapa segue-se apenas por onde possa estar a
soluo. Caminhos que se sabe serem estreis no de prosseguem.
Note-se a diferena entre rvore de derivao (ou rvore de parsing) , que vimos atrs, e
esta rvore de procura de cadeias. Os filhos da raiz so as produes alternativas a partir de S,
e portanto as suas etiquetas so formas sentenciais ou sentenas (da a sua forma rectangular
para distinguir dos crculos da rvore de derivao). Por outro lado esta rvore de procura
bastante genrica e no afecta apenas a uma cadeia (embora se v particularizando media
que se prossegue, pelo abandono de caminhos inexequveis).
2 volta: a partir dos vrtices restantes da etapa 1, gerar todos os filhos possveis, usando
uma e uma s produo pela esquerda. Por exemplo em SS substitui-se apenas o primeiro S.
Nenhuma cadeia w. Podem-se desde j eliminar as folhas que comeam por b ou cujo
segunda carcter b.
S
SS
bSa aSb
Figura 5.3.1. Primeira volta do parsing de aabb.
Figura 5.3.2. Segunda volta do parsing exaustivo
S
SS

bSa aSb
SSS aSbS bSaS S aSSb aaSbbb abSab ab
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
197
3 volta: prossegue-se a partir de cada vrtice da 2volta, com produes pela esquerda.
E encontrou-se finalmente a cadeia aabb. A sua derivao est identificada. O seu parsing
est concludo. Ela foi produzida pelo caminho assinalado a tracejado.
SaSbaaSbbbaabb
Como se pode ver, o parsing exaustivo tem algumas desvantagens. Se a cadeia fosse muito
grande, a rvore de procura seria tambm muito grande. Alm disso um processo fastidioso,
parecido com os mtodos de fora bruta que consistem em experimentar todas as
alternativas possveis para um problema. Por isso um processo pouco eficiente, e nenhum
compilador o usa hoje em dia. Tem apenas um interesse didctico, ajudando-nos a perceber a
essncia do processo de parsing.
Tem alm disso um problema maior: pode nunca terminar se a cadeia no est na
linguagem (verificar neste caso o que acontece para w= abb), a menos que se introduza um
mecanismo de paragem ao fim de certo tempo.
Figura 5.3.3. Terceira e ltima volta do parsing de aabb
S
SS

bSa aSb
SSS aSbS bSaS S aSSb aaSbb abSab ab
SSSS aSbSS bSaSS SS
aSSbS aaSbbS abSabS abbS
aSSSb aaSbSb abSaSb aSb
aaSSbb aaaSbbb aabSabb aabbb
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
198
Como evitar a no paragem do parsing?
Se admitirmos que uma cadeia, por muito grande que seja, finita em tamanho, o parsing
exaustivo acabar por parar, desde que de etapa para etapa aumente o tamanho das formas
sentenciais. Se na gramtica existirem produes do tipo
S (reduz o tamanho da forma sentencial)
A B (mantm o tamanho da forma sentencial
esse facto no est assegurado. Portanto produes deste tipo devem ser eliminadas,
introduzindo-se assim algumas restries na forma da gramtica. Tal no acarreta problemas
adicionais dado que tais restries no diminuem significativamente o poder das gramticas
livres de contexto. No Captulo 6 estudaremos tcnicas de eliminar produes daqueles tipos
(chamadas nulas e unitrias) nas gramticas livres de contexto.
Exemplo 5.3.2.
A gramtica com produes
S SS | aSb | bSa | ab | ba
obedece restrio acima mencionada. Pode-se verificar que gera a mesma linguagem do
exemplo anterior, mas agora sem a cadeia vazia.
Uma produo possvel (de extrema esquerda):
S SS aSbSabSabS abababS abababba
Outra produo (de extrema direita) :
S SSSaSbSabSab SabbSaab Sabbabaab baabbabaab
Repare-se que as sucessivas formas sentenciais aumentam de tamanho pelo menos em uma
unidade, e portanto ao fim de n voltas elas tero pelo menos n+1 caracteres.
Considere-se o seguinte exemplo para nos apoiar na anlise.
Uma outra produo possvel pela esquerda:
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
199
S SS aSbSabSabS abSSabS abbSaSabS abbaSbaSabS
abbaabbaSabS abbaabbabaabS abbaabbabaabba
As formas sentenciais vo aumentando em comprimento e contm variveis e smbolos
terminais.
Outra produo
S SS SSS SSSS SSSSS SSSSSS SSSSSSS abSSSSSS abbaSSSSS
abbabaSSSS abbabaabSSS abbabaabbaSS abbabaabbabaS
abbabaabbabaab Tambm aqui as formas sentenciais vo
aumentando de comprimento. Inicialmente contm apenas variveis, mas a partir da 6
produo elas comeam a ser substitudas por caracteres do alfabeto (smbolos terminais) at
que a cadeia seja obtida.
Dada uma cadeia we {a,b}
+
, o mtodo de parsing exaustivo termina sempre em no mais
do que 2|w| voltas. Depois de (no mximo, caso extremo) |w| voltas, teremos enumerado todas
as formas sentencias com |w| caracteres. Essas formas sentenciais tm variveis e smbolos
terminais. No caso limite podem ter apenas |w| variveis e nenhum smbolo terminal. A partir
daqui necessrio substituir cada uma das variveis para se obter uma cadeia de smbolos
terminais. Na pior das hipteses, substitui-se uma varivel por um smbolo terminal de cada
vez, o que implica mais |w| voltas. Assim, na pior das hipteses, o parsing leva 2|w| voltas a
completar-se (ou o parsing encontrado ou a cadeia no pertence linguagem). Da o
teorema seguinte.
Teorema 5.3.1. Considere-se uma gramtica livre de contexto que no tem qualquer produo
da forma
A
A B
em que A, B e V. Ento o parsing exaustivo pode ser feito por um algoritmo que, para
qualquer we E*, ou produz o parsing de w, ou conclui que no possvel qualquer parsing
para w.
Qual o nmero mximo de formas sentenciais que se podem obter pelo parsing exaustivo ?
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
200
A gramtica tem um nmero de produes distintas igual a |P|.
Na 1 volta obtm-se |P| formas sentenciais.
Na 2 volta obtm-se |P||P|=|P|
2
formas sentenciais, no mximo.
Na 3 volta obtm-se |P|
2
|P|=|P|
3
formas sentenciais, no mximo.
...
Na 2|w| volta obtm-se |P|
2|w|
formas sentenciais, no mximo.
Somando agora ao longo de todas as voltas, obtm-se o limite superior para o nmero de
formas sentenciais que se podem obter:
F = |P| + |P|
2
+ |P|
3
+ ... + |P|
2|w|
A ltima parcela evidencia que o comprimento da cadeia expoente do ltimo termo da
soma. Prova-se assim que o trabalho de busca cresce exponencialmente com o comprimento
da cadeia, podendo tornar proibitivo o custo (computacional) do mtodo.
Este um problema central em teoria da computao: encontrar mtodos de parsing que
tenham menor complexidade computacional (isto , que sejam mais rpidos). Ainda hoje um
importante tema de investigao. Repare-se que para um compilador a cadeia em causa o
programa completo. Fazer o parsing da cadeia verificar se o programa obedece s produes
da gramtica da linguagem, isto , se est bem escrito.
Pode-se demonstrar que para quaisquer gramticas livres de contexto existe um algoritmo
que faz o parsing de qualquer cadeia w num tempo proporcional a |w|
3
. melhor do que
crescimento exponencial, mas ainda muito ineficiente (um compilador que fosse por a,
demoraria um tempo exagerado a compilar um programa). O que ainda se busca actualmente
um algoritmo de parsing que demore um tempo linear com o comprimento da cadeia para
qualquer gramtica livre de contexto.
Felizmente para algumas gramticas especiais j se encontrou um mtodo linear. So as
chamadas gramticas simples.
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
201
Definio 5.3.2. Uma gramtica livre de contexto G = (V, T, S, P ) uma gramtica simples
ou uma s-gramtica se todas as suas produes se iniciam por um smbolo terminal seguido
de zero ou mais variveis, ou seja, se so da forma
A ax
em que AeV, aeT, xeV*, e qualquer par (A, a) aparece no mximo uma vez em P.
Em cada produo substitui-se uma varivel por um smbolo terminal e uma combinao
de variveis. Assim aumenta-se, por cada produo, exactamente em uma unidade o nmero
de caracteres terminais em cada forma sentencial. Ao fim de |w| produes j se introduziram
|w| smbolos terminais e portanto j se encontrou a cadeia se ela pertence linguagem. Pode-
se parar ao fim de |w| voltas e por isso o nmero de voltas cresce linearmente com |w|.
Exemplo 5.3.3.
A gramtica com as produes
S aS | bSS | c
uma s-gramtica.
Uma produo possvel ( direita):
S aS abSS abSaS abSac abcac
Para se introduzir a, b ou c na forma sentencial h apenas uma possibilidade em cada volta.
A gramtica com produes
S aS | bSS | aSS | c
no uma s-gramtica porque o par (S, a) aparece nas duas produes S aS e S aSS.
Uma produo possvel:
S aS abSS abSaSS abSaSbSSabSaSbSc abSaSbcc abSacbcc abcacbcc
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
202
Aqui tambm o nmero de caracteres terminais aumenta em uma unidade por cada
produo. Para se introduzir a na forma sentencial h duas possibilidades (duas produes
possveis) e da o facto de o processo de parsing ser mais longo.
Muitas caractersticas de linguagens de programao podem ser descritas por s-gramticas.
Um parsing numa s-gramtica pode ser feito em |w| voltas, e por isso o seu tempo linear
com o tamanho da cadeia.
Exemplo 5.3.4
Seja a gramtica livre de contexto j encontrada no exemplo 5.2.6 (no uma s-gramtica).
E E + E
E E - E
E (E)
E V
V x
V z
V y
Como se pode derivar a cadeia x+(y-z)?
Desenhe-se a rvore de derivao, na Figura 5.3.4.
A cadeia x + (y - z) encontra-se lendo as folhas da rvore da esquerda para a directa. Ela o
fruto da rvore.
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
203
5.3.2. Ambiguidade nas gramticas e nas linguagens
Vimos que dada uma cadeia weL(G), o parsing exaustivo produz uma rvore de derivao.
Relembremos que uma rvore de derivao tem uma derivao pela esquerda e uma derivao
pela direita, e portanto existem duas derivaes para a mesma cadeia associadas mesma
rvore. Situao bem distinta aquela em que existem diversas rvores de derivao para a
mesma gramtica. Neste caso h mais do que uma derivao pela esquerda e mais do que uma
derivao pela direita. Qual usar? Temos uma situao de ambiguidade na linguagem, no
sentido de que no se sabe que rvore usar.
Definio 5.3.3
A derivao da cadeia x+(y-z) ser
E E + E
V + E
x + E
x + (E)
x + (E - E)
x + (V - E)
x + (y - E)
x + (y - V)
x + (y - z)
E
E +
E
V
( E )
x E - E
V
V
y
z
Figura 5.3.4. rvore de derivao do exemplo 5.3.4.
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
204
Uma gramtica livre de contexto ambgua se existir alguma cadeia w e L(G) que tem pelo
menos duas rvores de derivao possveis. A ambiguidade implica a existncia de duas ou
mais derivaes de extrema esquerda ou de extrema direita.
Exemplo 5.3.5(Linz) :
Seja a gramtica com produes
S aSb | SS |
construir a rvore de parsing de aabb.
H vrias possibilidades:
i) S aSbaaSbbaabb
ii) S SSaSbSaaSbbSaabbSaabb
iii) S SSSaSbSaaSbbSaabbaabb
A que correspondem as rvores seguintes, Fig. 5.3.5.
S
a S
b
a S
b

S
a S
b
a S
b

S
S

S
a S
b
a S
b

S
S

Figura 5.3.5. rvores de derivao do exemplo 5.3.5


Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
205
A segunda e terceira diferem apenas no facto de corresponderem a produes pela
esquerda ou pela direita.
Contrariamente s linguagens naturais, em que a ambiguidade tolerada (tendo at valor
literrio), nas linguagens de programao s pode existir uma interpretao para cada cadeia
(sentena) e por isso no pode existir ambiguidade. Poderia acontecer uma tragdia se um
compilador pudesse fazer o parsing de um programa de dois modos: resultariam dois cdigos
executveis diferentes. Se uma gramtica ambgua, ela deve por isso ser rescrita para a
libertar de toda a ambiguidade.
A ambiguidade pode estar na linguagem ela prpria.
Exemplo 5.3.6
Seja a gramtica com as produes
S AS | a | b
A SS | ab Para gerar a cadeia abb podem-se seguir duas rvores de
derivao, Fig. 5.3.6
Vejamos ainda outro exemplo (Linz, 142, Hopcroft 172).
S
A
S
B
B b
a
b
S
A S
a b
b
Figura 5.3.6. Exemplo 5.3.6.
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
206
Vamos desenvolver a gramtica que produz cadeias do tipo (a+b)
*
c, a+b
*
c, a+b+c,
Trata-se de uma gramtica de expresses aritmticas, do tipo das usadas por linguagens de
programao), em verso muito simplificada, considerando apenas os operadores adio + e
multiplicao * . Os argumentos dos operadores so identificadores, e estes podem ser neste
exemplo a, b ou c.
Necessitamos de duas variveis nesta gramtica. A varivel E representa as expresses; o
smbolo inicial. A varivel I representa os identificadores. Teremos assim a gramtica G= {V,
T, E, P} com
V={E, I}
T={a, b, c,+,
*
, (, )} e as produes
P: P1. E I
P2. E E + E
P3 E E * E
P4 E (E)
P567 I a | b | c
Para derivar a cadeia a+b
*
c podem-se seguir duas rvores de derivao, Fig. 5.3.7
E
E +
E
I
a
E * E
I
b
I
c
E
E *
E
I
c
E + E
I
a
I
b
Figura 5.3.7. rvores das expresses aritmticas
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
207
Na rvore da esquerda a subcadeia b
*
c filha de E, gerada depois da subcadeia a+. Na da
direita a+b filha E, gerada antes de
*
c. Tendo em conta que a rvore de derivao define a
estrutura de dados usada pelo compilador, teramos na esquerda o cdigo correspondente a
(a)+(b*c) e na direita o cdigo correspondente a (a+b)
*
(c). S a primeira est certa. Temos
aqui o problema da precedncia dos operadores aritmticos. Uma gramtica assim poderia
produzir resultados errados. A gramtica ambgua e a sua ambiguidade que leva e esta
problema.
Se o leitor desenhar a rvore de derivao de a+b+c encontrar tambm duas solues
possveis, uma correspondente a a+(b+c) e outra a (a+b)+c. Neste caso no h problemas de
compilao, mas h ambiguidade na mesma.
Para levantar a ambiguidade deve-se alterar a gramtica.
Introduzam-se mais duas variveis, fazendo
V={E, T, F, I},
e faam-se as produes
P1. E T
P2. T F
P3. FI
P3. E E + T
P4 T T* F
P5 F (E)
P678 I a | b | c
Agora para derivar a mesma cadeia a+b
*
c teremos a rvore da Fig. 5.3.8.
O leitor pode tentar uma outra rvore de derivao desta cadeia. No a encontrar porque a
gramtica no ambgua. Note-se que este problema de saber se uma gramtica ou no
ambgua no tem ainda uma soluo geral; s para algumas gramticas, por anlise prpria, se
pode obter a resposta.
Esta gramtica produz a mesma linguagem da gramtica ambgua e nesse sentido as duas
so equivalentes. No entanto podem produzir resultados de compilao diferentes.
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
208
Exemplo 5.3.7
Se quisermos uma gramtica no-ambgua de expresses aritmticas com identificadores mais
gerais, podendo conter as, bs, cs, 0s e 1s, mas iniciando-se sempre por uma das letras (a
linguagem dos identificadores a da expresso regular (a+b+c)(a+b+c+0+1)* ), basta
substituir na gramtica anterior as produes P678 por I a | b|c| Ia | Ib|Ic | I0|I1|, obtendo-
se a gramtica escrita em forma compacta seguinte (Hopcroft, 172):
ET | E+T
TF | T*F
FI | (E)
I a | b | c | Ia | Ib | Ic | I0 | I1
H gramticas ambguas que se podem tornar em gramticas no ambguas por pequenas
alteraes na sua estrutura, como foi o caso deste exemplo. Nem sempre assim acontece. De
facto h linguagens que so elas mesmas ambguas e por isso no possvel encontrar para
elas uma gramtica no ambgua.
E
E +
T
T
F
T * F
F
I
I
c
I
a b
Figura 5.3.8.rvore de derivao refeita
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
209
Definio 5.3.4
Se L uma linguagem livre de contexto para a qual existe uma gramtica no ambgua, ento
L diz-se no ambgua. Se toda a gramtica que gera L ambgua, neste caso a linguagem
diz-se inerentemente ambgua.
Exemplo de linguagem inerentemente ambgua (Hopcroft, 212)
L = {a
n
b
n
c
m
d
m
, n> 1, m> 1) {a
n
b
m
c
m
d
n
, n> 1, m>1}
Esta linguagem composta por todas as cadeias a
+
b
+
c
+
d
+
tal que
i) ou existem tantos as e bs e tantos cs e ds
ii) ou existem tantos as e ds e tantos bs e cs
Esta linguagem livre de contexto.
Uma gramtica para ela:
i) Para a
n
b
n
c
m
d
m
S AB
A aAb | ab
B cBd | cd
ii) Para a
n
b
m
c
m
d
n
S C
C aCd | aDd
D bDc | bc
Juntando agora as duas partes atravs da produo S AB | C vem
S AB | C
A aAb | ab
B cBd | cd
C aCd | aDd
D bDc | bc
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
210
Esta gramtica ambgua. A cadeia aabbccdd pode gerar-se por duas derivaes de
extrema esquerda,
1. S AB aAbB aabbB aabbcBd aabbccdd
2. S C aCd aaDdd aabDcdd aabbcdd
cujas rvores de parsing so as seguintes Fig 5.3.9 3 5.3.10 (com folhas simplificadas):
5.4. Gramticas livres de contexto e linguagens de programao
As linguagens de programao, com por exemplo o Phyton, Java, o C, o Pascal, so definidas
por gramticas livres de contexto. Para o caso do Java existem diversas verses. A completa,
desenvolvida pela Sun Microsystems, encontra-se na Java Language Specification em,
http://java.sun.com/docs/books/jls/second_edition/html/jTOC.doc.html
Pode ver-se uma outra verso em http://www.lykkenborg.no/java/grammar/JLS3.html
a b c d
a b c d
S
A B
A B
a d
a d
b c
b c
S
C
C
D
D
Figura 5.3.9
Figura 5.3.10
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
211
Encontram-se tambm verses muito simplificadas, para fins didcticos, com o a de
http://www.willamette.edu/~fruehr/231/grammar/simplest.html ou a especificao BNF
1
http://www.cambridge.org/resources/052182060X/MCIIJ2e/grammar.htm
para
uma mini Java em .
Para o Phyton ver uma gramtica BNF em http://docs.python.org/ref/grammar.txt.
Bibliografia
An Introduction to Formal Languages and Automata, Peter Linz, 3rd Ed., Jones and Bartelett
Computer Science, 2001
Introduction to Automata Theory, Languages and Computation, 2nd Ed., John Hopcroft,
Rajeev Motwani, Jeffrey Ullman, Addison Wesley, 2001.
Elements for the Theory of Computation, Harry Lewis and Christos Papadimitriou, 2nd Ed.,
Prentice Hall, 1998.
Introduction to the Theory of Computation, Michael Sipser, PWS Publishing Co, 1997.
1
BNF significa Backus Naur Form.Para mais informao ver por exemplo http://cui.unige.ch/db-
research/Enseignement/analyseinfo/AboutBNF.html.
Teoria da Computao Cap.5 Linguagens Livres de Contexto
LEI/DEI/FCTUC/2009/@ADC Documento de trabalho
212

Você também pode gostar