Você está na página 1de 5

Propriedades das Linguagens Livres de Contexto

Formas Normais

Com as simplificações apresentadas eliminamos certas formas “incomodas” de produções


que aparecem nas gramáticas livres de contexto.
Podemos simplificar a gramática apresentando padrões para as produções, ou seja, uma
"forma normal" em sua apresentação.

Forma Normal de Chomsky

Uma gramática livre de contexto é apresentada na forma normal de Chomsky se todas as


suas produções são da forma:
A → a, para a ∈ Σ, ou
A → BC, onde B, C ∈ ( V ∪ ∑)∗
Nessa apresentação, o lado direito de cada produção ou é um terminal ou será um par de
não-terminais.
Note que para uma gramática na forma normal de Chomsky a árvore de derivação de
qualquer derivação é uma árvore binária!
A transformação pode ser expressa como um algoritmo composto de três etapas:
− simplificação da gramática: simplifica a gramática excluindo as produções-ε (como a
linguagem não possui a palavra vazia, todas as produções da forma A → ε podem ser
excluídas), produções unitárias (A → B, se o lado direito de alguma produção tiver
somente um símbolo, este será terminal) e, símbolos e produções inúteis;
− transformação do lado direito da produções de comprimento maior ou igual a dois:
garante que o lado direito das produções de comprimento maior ou igual a dois é
composto exclusivamente por não-terminais. Para exclusão de um terminal “a”
podemos introduzir um não-terminal intermediário Ca e incluir a produção Ca → a;
− transformação do lado direito das produções de comprimento maior ou igual a três,
em produções com exatamente dois não-terminais: garante que o lado direito das
produções de comprimento maior do que um é composto exatamente por dois não-
terminais. Após a execução da etapa acima, o lado direito das produções da forma
A → B1B2 ... Bn (n ≥ 2) é composto exclusivamente por não-terminais. Portanto, para
concluir a transformação, é suficiente garantir que o lado direito é composto por
exatamente dois não-terminais. Isto é possível gerando B1B2 ... Bn em diversas
etapas, usando não-terminais intermediários.

Vamos ilustrar a transformação com a gramática livre de contexto:


S → bA | aB
A → bAA | aS | a
B → aBB | bS | b

Note que a gramática não tem produções-ε, produções unitárias ou símbolos inúteis.
Numa primeira transformação, temos:
S → CbA | CaB
A → CbAA | CaS | a
B → CaBB | CbS | b
Ca → a
Cb → b
Nesta versão temos à direita ou um terminal ou dois ou mais não-terminais.

A próxima etapa é a conversão das produções com não-terminais para um número exato de
dois, de acordo com a definição. E após a conversão final, a gramática na forma normal de
Chomsky torna-se:
S → CbA | CaB

A → CbD1 | CaS | a
D1 → AA
B → CaD2 | CbS | b
D2 → BB
Ca → a
Cb → b

Se L é uma linguagem livre de contexto que contem ε, então podemos encontrar uma

gramática livre de contexto na forma normal de Chomsky para L\{ε} e então adicionamos a

produção S → ε (uma exceção! ).

Forma Normal de Greibach


Outra apresentação que estabelece padrões para a construção de uma gramática é a forma
normal de Greibach, onde uma gramática livre de contexto tem todas as suas produções na
forma:
A → aα , onde a ∈ Σ e α ∈ ( V ∪ ∑)∗

O algoritmo a seguir transforma uma gramática, cuja linguagem gerada não possua

produções-ε, em uma gramática na forma normal de Greibach, seguindo as etapas:

− simplificação da gramática: exclusão de produções vazias (como a linguagem não

possui a palavra vazia, todas as produções da forma A → ε podem ser excluídas),

produções da forma A → B (se o lado direito de alguma produção tiver somente um

símbolo, este será terminal) e, opcionalmente, os não-terminais inúteis;

− renomeação dos não - terminais em uma ordem crescente qualquer: os não-

terminais da gramática são renomeados em uma ordem crescente qualquer, como,

por exemplo, A1A2 ... An onde n é o cardinal do conjunto de não-terminais.

Diferentes critérios de renomeação podem resultar em diferentes gramáticas na


forma normal de Greibach. Entretanto, todas são equivalentes (geram a mesma

linguagem);

− transformação de produções para a forma Ar → Asα, onde r ≤ s: as produções são

modificadas garantindo que o primeiro não-terminal do lado direito é maior ou igual

que o do lado esquerdo, considerando a ordenação da etapa anterior. As produções

Ar → Asα onde r>s, substitui-se o não-terminal As por suas correspondentes

produções (As → β1|...|βm), resultando em Ar → β1α | ... | βmα e assim sucessivamente.

Entretanto, como o conjunto de não-terminais é finito, existe um limite para as

produções crescentes, que pode ser a geração de um terminal (Ar → aα) ou de uma

recursão (Ar → Arα);

− exclusão das recursões da forma Ar → Arα: as recursões (à esquerda) podem

existir originalmente na gramática, ou serem geradas pela etapa anterior. A

eliminação da recursão à esquerda pode ser realizada introduzindo não-terminais

auxiliares e incluindo a recursão à direita (Br → αBr);

− um terminal no início do lado direito de cada produção: após a execução da etapa

anterior, todas as produções da forma Ar → Asα são tais que r < s.

Conseqüentemente, as produções do último não-terminal An podem iniciar pelas

suas correspondentes produções (exemplo: An → aβ), o lado direito das produções

de An-1 também iniciarão por um terminal (exemplo: An-1 → aβα). A repetição do

algoritmo para An-2, ...,A1 resultará em produções exclusivamente da forma Ar → aα;

− produções da forma Ar → aα onde α é composta por não – terminais: para concluir

a transformação, é suficiente garantir que as cadeias de não-terminais α sejam

compostas somente por não-terminais ou que sejam vazias (produções: A → a).

Considere o exemplo:

S → AA | a
A → SS | b

Transformando:

1ª etapa – simplificação: a gramática já está simplificada;


2ª etapa - renomeação: vamos mudar S e A para A1 e A2 respectivamente, obtendo:
A1 → A2A2 | a
A2 → A1A1 | b

3ª/4ªetapas – transformando Ai → Ajα e recursões Ai → Aiα.

A produção A2 → A1A1 necessita ser modificada. As produções da gramática ficam:

A1 → A2A2 | a
A2 → A2A2A1 | aA1 | b
A produção A2 →A2A2A1 contém uma recursão, portanto é necessário introduzir uma

variável auxiliar B:

A1 → A2A2 | a
A2 → aA1 | b | aA1B | bB
B → A2A1 | A2A1B

5ªetapa – o terminal do início de cada lado direito das produções: o lado direito das

produções da maior variável A2 iniciam por um terminal.

Substituindo A2 no lado direito de A1 → A2A2 pelas suas correspondentes derivações, as

produções de A1 também iniciaram por um terminal:

A1 → aA1A2 | bA2 | aA1BA2 | bA2 | a


A2 → aA1 | b | aA1B | bB
B → A2A1 | A2A1B
As produções referentes à B também são modificadas:

B → aA1A1 | bA1 | aA1BA1 | bBA1 | aA1A1B| bA1B| aA1BA1B | bBA1B

6ªetapa – modificando A → aα com α composta exclusivamente por não–terminais. Nenhum

procedimento é necessário, pois as produções já se encontram nesta forma. A gramática na

forma normal de Greibach resultante é a seguinte:

A1 → aA1A2 | bA2 | aA1BA2 | bA2 | a


A2 → aA1 | b | aA1B | bB
B → aA1A1 | bA1 | aA1BA1 | bBA1 | aA1A1B| bA1B| aA1BA1B | bBA1B
Exercícios

Re-escreva as gramáticas abaixo nas formas normais de Chomsky e Greibach:

1. G6 = ( {A,B,S}, {a,b}, P6, S) com produções

P6 = { S → ASB | ε
A → aAS | a
B → SbS | A | bb}

2. G7 = ( {A,B,C,S}, {a,b}, P7, S) com produções

P7 = { S → AB | CA
A → a
B → BC | AB
C → aB | b }

3. G8 = ( {A,B,S}, {a,b}, P8, S) com produções

P8 = { S → AAA | B
A → aA | B
B → ε}

4. G9 = ( {A,B,C,D,S}, {a,b}, P9, S) com produções

P9 = { S → aAa | bBb | ε
A → C|a
B → C|b
C → CDE | ε
D → A | B | ab }

Você também pode gostar