Você está na página 1de 4

Linguagens Livres de Contexto a formação de um analisador sintático, componente de um

compilador.
As linguagens livres de contexto têm uma fundamental
importância para a ciência da computação, pois aborda um conjunto Classificamos uma gramática como sendo livre de contexto quando
mais amplo de linguagens. Com ela podemos tratar questões como as regras de produção são todas na seguinte forma: P = { α→β | α ∈
as dos parênteses balanceados construções de blocos e estruturas, N e β ≠ ε }. Ou seja, do lado esquerdo da produção deve, sempre,
entre outras formalidades de linguagens de computação conhecidas. ocorrer um e apenas um não terminal. A sentença vazia também
Seu estudo é fundamental para o desenvolvimento de compiladores, não é aceita do lado direito da produção. Exemplo de uma produção
pois a partir destas são desenvolvidos os analisadores sintáticos, aceita em uma gramática livre de contexto seria X → abcX
parte de um compilador. (não interessa o contexto em que X se encontra)

Segundo a Hierarquia de Chomsky, a classe de linguagens livre de Exemplos de Gramáticas Livres de Contexto:
contexto contém propriamente a classe de linguagens regulares,
mas apesar disto, esta classe ainda é relativamente restrita, sendo G1 = ({A,B}, {0,1,#}, {A →0A1 | B, B → #} , A)
fácil definir linguagens que não pertençam a esta classe.
G2 = ({ S, A, B }, {a, b}, P, S )
As linguagens livres de contexto podem ser estudadas abordando Onde P é:
os seguintes formalismos. S → aB | bA
A → bAA | a | aS
Gramática Livre de Contexto. Trata se de um gerador da
B → b | bS | aBB
linguagem. É uma gramática mais flexível em suas
produções do que a gramática regular, porém ainda com
certas restrições. L(G2) é o conjunto de todas as palavras em T que
tem o mesmo número de a’s e b’s.
Autômato de Pilha. Trata se de um reconhecedor da
linguagem, que consiste basicamente em um autômato finito Note que a gramática acima não é regular devido às produções bAA
não deterministico que utiliza uma pilha, que serve como e aBB.
memória adicional.
Vamos estender a definição da gramática livre de contexto para
Gramáticas Livres de Contexto permitir produções do tipo S →ε, sendo S o símbolo inicial.
Entretanto, isto só será possível se S não aparecer do lado direito
As Gramáticas Livres de Contexto (GLC) tem grande importância de qualquer produção. Desde modo, a regra S →ε somente será
dentro do estudo das Linguagens Formais, pois através delas pode utilizada para dar origem à sentença vazia.
ser descrita a maior parte das construções sintáticas das linguagens
de programação. Estas gramáticas se tornam tão importantes A gramática que possuir o símbolo inicial aparecendo do lado direito
porque podem descrever estruturas recursivas o que as tornam de regras de produção, deverá ser transformada em outra
necessárias para uma variedade de aplicações, como por exemplo,
equivalente que obedeça a esta restrição.Gramáticas equivalentes Exemplo:
devem gerar a mesma linguagem. Considere a gramática G = ( {S, A}, {a, b}, P, S ), onde P consiste
de:
Quando for necessário transformar a gramática, deverá ser incluído S → aAS | a
um novo símbolo não-terminal (S’) que passará a ser o novo A → SbA | SS | ba
símbolo inicial, mais a regra S’→ε.
a derivação da sentença aabbaa é dada por:
Exemplo: Modificar a gramática abaixo de modo a incluir a sentença S → aAS → aSbAS → aabAS → aabbaS → aabbaa
vazia.
G = {{S, A}, {a}, P, S} A árvore de derivação correspondente a essa sentença seria:
P: S → aA S
A → aA | a
Resposta: a A S
G = {{S’, S, A}, {a}, P’, S’}
P’: S’ → S | ε S b A a
S → aA
A → aA | a a b a

Árvores de Derivação para GLC Definimos como Profundidade da Árvore de Derivação o


comprimento do maior caminho entre a raiz e um nodo terminal. No
As árvores de derivação são representações gráficas para as exemplo anterior, a árvore de derivação da sentença tem
derivações nas GLC. Através destas, temos representado profundidade 3.
explicitamente a estrutura hierárquica que está implícita na
linguagem. Formalmente, consideremos que G = (N, T, P, S) seja
uma GLC. Uma árvore é uma árvore de derivação para G se: Definimos como Limite de uma Árvore de Derivação a seqüência
formada pela concatenação, da esquerda para a direita, das folhas
1. todo nó tem um rótulo que é um símbolo de N ∪ T ∪ {ε}; da árvore de derivação.
2. o rótulo da raiz é S;
3. se um nó A tem um ou mais descendentes, então A é um não Uma árvore de derivação ignora variações na ordem em que os
terminal; símbolos foram substituídos na derivação. Por exemplo, na
4. se A1, A2, ..., An são descendentes diretos de A, da esquerda gramática de expressão aritmética abaixo:
para a direita, então A → A1 A2 ... An é uma produção de P; G = ( {E}, {+, *, (, ), -, id}, P, E )
5. se D é a única subárvore da raiz e tem rótulo ε, então a regra onde
S → ε ∈ P. P= E→E+E
E→E*E
E→(E)
E→-E E E
E → id
E + E E *
a sentença “- (id * id)” pode ser derivada de dois modos diferentes: E

E → - E → - ( E ) → - ( E + E ) → - ( id + E ) → - ( id + id ) id E * E E + E
ou id
E → - E → - ( E ) → - ( E + E ) → - ( E + id ) → - ( id + id )
id id id id

As derivações acima correspondem à mesma árvore de derivação: Linguagens Inerentemente Ambígua


E A ambigüidade é muitas vezes não desejada em certas
aplicações. Ex.: linguagens de programação. Às vezes quando se
- E tem uma gramática ambígua pode-se encontrar uma gramática
equivalente unambígua. Porém algumas LLC só podem gerar
( E ) gramáticas ambíguas, essas linguagens são ditas linguagem
inerentemente ambígua.
i j k
E + E L = { a b c | i = j ou j = k}

id id Construindo uma GLC


Construir uma GLC requer criatividade, mas existem
Uma derivação é chamada de mais à esquerda quando o algumas regras que podem ajudar.
símbolo substituído for o não-terminal mais à esquerda da forma 1. Muitas GLCs são a união de GLC mais simplificadas. Se for
sentencial. Na derivação mais à direita, o símbolo substituído é o possível dividir a LLC em pedaços mais fáceis de serem
não-terminal mais à direita. construídos, então construa a gramática de cada pedaço
Nas duas derivações da sentença “- ( id + id )” mostradas individualmente e depois faça a união destes. Para isto
acima, a primeira é mais à esquerda e a segunda mais à direita. basta colocar todas as regras justas e inserir uma nova
produção que passará a conter o símbolo de partida
Gramática Ambígua derivando todos os símbolos de partida das gramáticas
individuais.
n n n n
Uma GLC é ambígua quando, para alguma sentença da Ex.: {0 1  n ≥ 0} ∪ {1 0  n ≥ 0}
linguagem gerada, existe mais de uma árvore de derivação. S1 → 0S11ε
S2 → 1S10ε
Exemplo:
A gramática anterior é ambígua. Isto pode ser visto através S → S1 S2
de duas árvores de derivação diferentes para a sentença id + id * id. S1 → 0S11ε
S2 → 1S10ε
c) aababb
2. Se a linguagem é regular, construa primeiro o AF e o
converta em uma gramática. 3) Dada a gramática abaixo faça a arvore de derivação para as
3. Algumas LLC contem duas subpalavras que são “ligadas”, seguintes sentenças.
no sentido que a máquina precisa lembrar de determinada G = ({E, T, F}, {+. *, (, ), a}, P, E)
informação a respeito da primeira subpalavra para poder Onde P é:
verificar a escrita da segunda subpalavra. E → E + T T
n n
Ex.: {0 1  n ≥ 0} T → T * FF
R → uRv F → ( E )a
4. Algumas LLC podem conter estruturas que aparecem
recursivamente como parte de outras estruturas. a) a + a * a
Ex.: gramática que geram expressões b) (a + a) * a
aritméticas c) ((a))
E → E + T T
T → T * FF 5) Seja G a seguinte GLC: G =({S}, {a,b}, {S → aSbSa  ε}, S).
F → ( E )a Mostre quatro cadeias de L(G) e a derivação de cada um delas

6) Obtenha a árvore de derivação de sentença “bbabaaabbaba” na


Gramáticas Livre de Contexto - Exercícios
gramática:
G = ({S, A}, {a, b}, P, S)
1) Dada a gramática:
Onde P é
G = ({E}, {+, *, (, ), -, id}, P, E )
Onde P é: : S → bAS | a
E → E + E | E * E | ( E ) | - E | id A → SaA | SS | ab

Obtenha as derivações mais à esquerda e mais à direita das 7) Construa uma gramática G tal que
sentenças a seguir: +
a) L(G) = { w | w ∈ (0,1,2) e todos os 0´s sejam consecutivos}
+
id * id * id b) L(G) = { w | w ∈ (0,1,2) e todo 0 vem seguido de um 1 }
+
(id + id ) * id c) L(G) = { w | w ∈ (a,b) e w tem no máximo um par de a como
–(id + id ) * id + id subpalavra e no máximo um par de b como subpalavra }
+
d) L(G) = { w | w ∈ (0,1,2) e w não possui 010 como subpalavra }
+
2) Dada a gramática abaixo faça a arvore de derivação para as e) L(G) = { w | w ∈ (a,b,c) e w possui baa como subpalavra}
seguintes sentenças.
G = ({S}, {a, b}, {S → aSbSSε}, S)
a) abab
b) aaabbb

Você também pode gostar