Você está na página 1de 8

Teoria da Computação Segundo Semestre, 2014

Aula 8: Gramáticas Livres de Contexto


DAINF-UTFPR Prof. Ricardo Dutra da Silva

Veremos agora maneira de gerar as strings de um tipo específico de linguagem, conhecido


como linguagem livre de contexto. As strings serão geradas por regras que formam a cha-
mada gramática livre de contexto. As gramáticas livres de contexto são usadas para definir
linguagens de programação bem como os seus compiladores.
Os elementos básicos que formam as regras da gramática são os símbolos terminais,
formados por elementos de um alfabeto Σ, e os símbolos não-terminais, comumente chamados
de variáveis.
Definição 8.1. Uma gramática livre de contexto é uma quádrupla (V, Σ, P, S) onde

• V é um conjunto de variáveis;

• Σ é o conjunto de símbolos terminais;

• P é um conjunto de regras que são elementos do conjunto V × {V ∪ Σ}∗ , sendo, em


geral, uma regra (A, w) escrita como A → w.

• S ∈ V é um símbolo (uma variável) inicial.


Exemplo 8.1
A gramática G = ({S, A}, {a, b}, P, S) com o conjunto P de regras

S → AA
A → AAA
A → bA
A → Ab
A→a

gera strings com um número positivo de a’s.

Quando temos diferentes regras para uma mesmo símbolo, como A → Ab e A → a,


podemos simplificar a escrita usando uma barra vertical para separar as regras. Poeríamos
escrever o exemplo como A → Ab | a.
Exemplo 8.2
O conjunto P de regras da gramática G = ({S, A}, {a, b}, P, S), do Exemplo 8.1, pode
1
2 Aula 8: Gramáticas Livres de Contexto

ser simplificada como

S → AA
A → AAA | bA | Ab | a.

O processo fundamental para a geração de uma string é a aplicação de regras. A aplicação


de uma regra A → w sobre um string uAv ∈ {V ∪ Σ}∗ , produz a string uwv. Os prefixo u e
o sufixo v definem o contexto em que a regra é aplicada. Uma gramática livre de contexto é
aquela em que os prefixos e sufixos não definem restrições sobre quando e onde a regra pode
ser aplicada.
Definição 8.2. Uma string w ∈ {V ∪ Σ}∗ é derivada de v ∈ {V ∪ Σ}∗ se existe uma
sequência finita de aplicações de regras que transformam v em w:

v ⇒ w1 ⇒ w2 ⇒ . . . ⇒ wn = w


Essa derivação pode ser representada por v ⇒
= w.
Definição 8.3. Seja G = (V, Σ, P, S) uma gramática livre de contexto e v ∈ {V ∪ Σ}∗ . O
conjunto de strings deriváveis de v é definido como

• Base: v é derivável de v;

• Passo: Se u = xAy é derivável de v e A → w ∈ P , então xwy é derivável de v.


Exemplo 8.3
Uma derivação da string ababaa na gramática G = ({S, A}, {a, b}, P, S) com o conjunto
P de regras

S → AA
A → AAA | bA | Ab | a.
Aula 8: Gramáticas Livres de Contexto 3

pode ser escrita como

S ⇒ AA
⇒ aA
⇒ abA
⇒ abAAA
⇒ abaAA
⇒ ababAA
⇒ ababaA
⇒ ababaa

A derivação de uma string pode também ser visualizada como uma árvore.

Definição 8.4. Seja G = (V, Σ, P, S) uma gramática livre de contexto e S ⇒ = w uma

derivação de G. A árvore de derivação de S ⇒
= w, pode ser construída da seguinte forma

1. Inicia a árvore com raiz S.

2. Se A → x1 x2 . . . xn com xi ∈ {V ∪ Σ} é a regra de derivação aplicada à string uAv,


então adicione x1 , x2 , . . . , xn como nós filhos de A na árvore.

3. Se A → λ é a regra de derivação aplicada à string uAv, então adicione λ como filho


de A na árvore
Exemplo 8.4
Uma derivação da string ababaa na gramática G = ({S, A}, {a, b}, P, S) com o conjunto
P de regras

S → AA
A → AAA | bA | Ab | a.

pode ser visualizada como


4 Aula 8: Gramáticas Livres de Contexto

S ⇒ AA A A
⇒ aA
a b A
⇒ abA
⇒ abAAA A A A

⇒ abaAA a b A a
⇒ ababAA
a
⇒ ababaA
⇒ ababaa

Definição 8.5. Seja G = (V, Σ, P, S) uma gramática livre de contexto, a linguagem de G,



L(G), é o conjunto {w ∈ Σ∗ | S ⇒ = w}. Uma linguagem é livre de contexto se existe uma
gramática livre de contexto que a gera.
Exemplo 8.5
Seja a gramática G = ({S, B}, {a, b}, P, S) com conjunto P

S → aSa | aBa
B → bB | b

então L(G) = {an bm an | n > 0, m > 0}.

Exemplo 8.6
Dada a linguagem L = {an bm cm d2n | n ≥ 0, m > 0}. A gramática G tal que L(G) = L é
dada por G = ({S, B}, {a, b}, P, S) com conjunto P

S → aSdd | B
B → bBc | bc.

Note que a derivação dada nos Exemplos 8.3 e 8.4 não é única. Podemos derivar uma
mesma string fazendo escolhas diferentes para aplicação das regras e para a ordem em que
são aplicadas.
Exemplo 8.7
Diferentes derivações da string ababaa na gramática G = ({S, A}, {a, b}, P, S) com o
Aula 8: Gramáticas Livres de Contexto 5

conjunto P de regras

S → AA
A → AAA | bA | Ab | a.

S ⇒ AA S ⇒ AA S ⇒ AA S ⇒ AA
⇒ aA ⇒ AAAA ⇒ Aa ⇒ aA
⇒ abA ⇒ aAAA ⇒ AAAa ⇒ aAAA
⇒ abAAA ⇒ abAAA ⇒ AAbAa ⇒ aAAa
⇒ abaAA ⇒ abaAA ⇒ AAbaa ⇒ abAAa
⇒ ababAA ⇒ ababAA ⇒ AbAbaa ⇒ abAbAa
⇒ ababaA ⇒ ababaA ⇒ Ababaa ⇒ ababAa
⇒ ababaa ⇒ ababaa ⇒ ababaa ⇒ ababaa

Definição 8.6. A derivação de uma string w em uma gramática G é uma derivação mais à
esquerda se a aplicação de regras, a cada passo, é realizada na primeira variável que aparece
da esquerda para a direita.
A derivação dada no Exemplo 8.3 é uma derivação mais à esquerda.
Definição 8.7. A derivação de uma string w em uma gramática G é ambígua se existe
mais de uma derivação mais à esquerda. Uma gramática G é ambígua se alguma string
possui uma derivação ambígua.
Exemplo 8.8
Seja a gramática G = ({E}, {a, +, ×, (, )}, P, E) com o conjunto P de regras

E → E + E | E × E | (E) | a.

e as seguintes derivações da string a + a × a


6 Aula 8: Gramáticas Livres de Contexto

E ⇒E+E S ⇒E×E
⇒a+E ⇒E+E×E
⇒a+E×E ⇒a+E×E
⇒a+a×E ⇒a+a×E
⇒a+a×a ⇒ a + a × a.

Como existem duas derivações mais à esquerda diferentes, a gramática é ambígua. A am-
biguidade reflete em como as expressões são avaliadas, podendo gerar resultados errados,
que não respeitam ordens de precedência.
A gramática G0 = ({E, T, F }, {a, +, ×, (, )}, P, E) com o conjunto P de regras

E →E+T |T
T →T ×F |F
F → (E) | a

não é ambígua para as mesmas strings de G.

Gramáticas não ambíguas são essenciais para a definição de linguagens e para a construção
de compiladores. No entanto, existem linguagens inerentemente ambíguas.
Às vezes é interessante que a gramática esteja numa forma simplificada. A mais comum
é a forma de Chomsky.

Definição 8.8. Uma gramática livre de contexto está na forma normal de Chomsky se as
regras estão em uma das formas:

A → BC
A→a
S→λ

onde A, B, C ∈ V , a ∈ Σ e B, C são diferentes de S.

As gramáticas regulares geram linguagens livres de contexto enquanto PDA’s reconhecem


as mesmas linguagens.

Definição 8.9. Uma linguagem L é livre de contexto se existe uma existe um PDA que
reconhece L.
Aula 8: Gramáticas Livres de Contexto 7

Definição 8.10. Uma linguagem L é livre de contexto se existe uma gramática livre de
contexto que gere L.
Exercício 8.1. Seja a gramática G = ({S, A}, {a, b, c, d}, P, S) com regras P

S → abSc | A
A → cAd | cd.

a) Mostre a derivação de ababccddcc.

b) Mostre a árvore de derivação para a string do item anterior.

c) Defina qual a linguagem gerada usando a notação de conjuntos.

Exercício 8.2. Seja a gramática G = ({S, A, B}, {a, b}, P, S) com regras P

S → ASB | λ
A → aAb | λ
A → bBa | ba.

a) Mostre uma derivação mais à esquerda de aabbba.

b) Mostre uma derivação mais à direita de abaabbbabba.

c) Mostre as árvores de derivação para as derivações dos itens anteriores.

d) Defina qual a linguagem gerada usando a notação de conjuntos.

Exercício 8.3. Considere a árvore de derivação abaixo.

A B

a A A B

a a b

a) Mostre uma derivação mais à esquerda correspondente à derivação da árvore.

b) Mostre uma derivação mais à direita correspondente à derivação da árvore.

c) Defina formalmente uma gramática que gera a derivação da árvore.


8 Aula 8: Gramáticas Livres de Contexto

d) Defina qual a linguagem gerada usando a notação de conjuntos.

Exercício 8.4. Defina gramáticas para as linguagens:

a) L = {{aa}i bj | i ≥ j ≥ 0};

b) L = {ai cj bi | i ≥ 0, j > 0};

c) L = {{ab}i {cd}j {ba}j {dc}i | i, j ≥ 0};

d) L = {ai cj ak bk dj bi | i ≥ 0, j, k > 0};

e) L = {ai bj | i > 0, i ≤ j ≤ 2i}.

Exercício 8.5. Defina a gramática sobre Σ = {a, b} que gere a linguagem que contém
strings de tamanho ímpar.

Você também pode gostar