DCC063
Linguagens Formais
e Autômatos
Tipos de Gramáticas – segundo a hierarquia de
Chomsky existem quatro tipos:
Tipo 0 ou Irrestritas:
◼ P = { → | (NT)+, (NT)* }
Tipo 1 ou Sensível ao Contexto
◼ P = { → | ||||, (NT)+, (NT)+}
Tipo 2 ou Livre de Contexto ◼ P = { A→ | AN, (NT)*}
Tipo 3 ou Regular
◼ A→aB ou A→a, ou seja:
◼ P = { A→aX | AN, aT, XN{}}
Linguagens Livres de Contexto
Linguagens Livres de Contexto
Exemplo: expressões aritméticas com + e *
E → N | E+E | E*E | (E)
N → DN | D
D → 0 | 1 | 2 | 3 | ... | 9
Exemplo: {w | o comprimento de w é ímpar} G1: S → SSS | a | b
G2: S → aSa | aSb | bSa | bSb | a | b
G3: L → S
S → aA | bA | a | b
A → aS | bS
Linguagens Livres de Contexto
A importância das LLC’s reside no fato de que
praticamente todas as linguagens de programação podem ser descritas por este formalismo
A maioria das linguagens de programação
pertence a um subconjunto das LLC’s que pode ser
analisado por algoritmos que executam n.log(n)
passos, onde n é o tamanho da sentença de
entrada;
Outro subconjunto, que corresponde às
linguagens LC não ambíguas pode ser analisado
em tempo n2;
Linguagens Livres de Contexto
No pior caso, uma LLC ambígua pode ser
analisada em tempo n3;
O que ainda é bastante eficiente, se comparado
às linguagens sensíveis ao contexto que pode requerer complexidade exponencial (2n), sendo,
portanto, computacionalmente intratáveis;
Melhor ainda em relação às linguagens de tipo 0,
que podem ser inclusive indecidíveis, isto é, o algoritmo de análise pode não parar nunca .
Linguagens Livres de Contexto
Relembrando, uma gramática livre de contexto
(GLC) é denotada por G = (N, T, P, S), onde N e T são conjuntos disjuntos de variáveis e terminais, respectivamente, P é um conjunto finito de produções, cada uma da forma A → , onde A é uma variável do conjunto N e é uma cadeia de símbolos de (T N)*. Finalmente, S é uma variável especial denominada símbolo inicial.
Lista simples: xxxxx...x Exemplo: números naturais
A → xA | x ou N → DN | D
A → Ax | x D → 0 | 1 | 2 | 3 | ... | 9
Lista com separadores: xSxSxSxS...Sx
A → xSA | x
Exemplo:cadeias de a’s separadas por $.
S → A$S
A → aA | a
Linguagens Livres de Contexto
Opção: G1 ou G2: A → B | C Exemplo1: comentário em pascal:
C → H | P
H → {M}
P → (*M*) M → LM | L
L → a | b | c |...| z | ‘A’ | ‘B’ | ... | ‘Z’ |
Linguagens Livres de Contexto
Opção: G1 ou G2: A → B | C
Exemplo2: conj. números inteiros. Z → P | N
P → U | +U N → -U
U → DU | D D → 0 | 1 |...|9
Linguagens Livres de Contexto
Concatenação: G1G2
C → AB
Exemplo: número não negativo em ponto flutuante R → N.N | N | .N | N.
N → DN | D
D → 0 | 1 | 2 | 3 | ... | 9
Linguagens Livres de Contexto
Auto-aninhamento:
A → aAf | c
Exemplo: expressões aritméticas com + e * E → N | E+E | E*E | E/E | E-E | (E) N → DN | D
D → 0 | 1 | 2 | 3 | ... | 9
Linguagens Livres de Contexto
Auto-aninhamento e lista:
Exemplo: gramática que gera todas as cadeias que equilibram adequadamente os parênteses da esquerda com os da direita:
S → SS | (S) |
Linguagens Livres de Contexto
Linguagens Livres de Contexto
Técnicas de definição de gramáticas
Relações quantitativas:
1) {aib2i | i 0} = {, abb, aabbbb, ...}
2) {aibj | j 0 e i > j} = {aab, aaaa, aaaabb ...}
3) {aibj | j = 2i ou i > j} = {, aab, aaaa, aaaabb, abb ...}
4) {aibjckdm | i = m e j = 3k} = {abbbcd,
aabbbbbbccdd,...}
5) {aibj | i j e i,j > 0} = {abbb, aab, aaabbbb, aaaab...}
6) {aibjci+j| i,j > 0} = {abcc, aabccc, aabbbccccc, ...}
7) {anbncn| n 0} = {abc, aabbcc, aaabbbccc, ...}. Não é
Linguagens Livres de Contexto
Exercícios
1. Uma palíndrome é uma cadeia que pode ser lida da mesma maneira da direita para a esquerda e da esquerda para a direita. Exemplos: a, aba, osso, asddsa. Defina uma gramática para a linguagem palíndrome (conjunto de
todas as palíndromes sobre o alfabeto A = {a, b, c, ..., z}).
2. Seja G = ({S}, {a, b}, P, S). Dê definições para o conjunto de produções P, de
maneira a gerar as seguintes linguagens:
a) Cadeias que começam e terminam coma.
b) Cadeias com tamanho ímpar.
c) Cadeias onde todos osa’saparecem consecutivos.
d) Cadeias onde todos osb’sprecedem todos os a’s.
Linguagens Livres de Contexto
Exercícios
3. Defina uma gramática que gere as expressões numéricas com o seguinte alfabeto dígitos: 0 a 9; sinais: +, - , * e /; parênteses: ( e ). Teste sua definição mostrando a derivação das seguintes cadeias:
a) 1+(3*534)
b) ((8/2-(25+3))
4. Definir uma gramática G que gere a linguagem composta pelas cadeias sobre = {a, b, c, d} de tal forma que
a) L(G) = {wdwR| w{a, b, c}*} b) L(G) = {wwR| w{a, b, c}*}
5. Definir gramáticas para as linguagens sobre alfabeto = {a, b, c, d} :
a) Conjunto vazio;
b) Conjunto contendo apenas a cadeia vazia;
c) Conjunto de todas as cadeias sobre, incluindo ;
6. Construir gramáticas para as linguagens:
a) {x{a, b}* | x apresenta simultaneamente aabb e bbaa como subcadeias}
Linguagens Livres de Contexto
Árvore de Derivação e Ambigüidade
Muitas vezes é útil mostrar as derivações de uma
GLC através de árvores
Estas figuras – chamadas árvores de derivação
ou árvores sintáticas – impõem certas estruturas
úteis às cadeias das linguagens geradas
Os vértices de uma árvore de derivação são
rotulados com terminais ou variáveis, ou mesmo com a cadeia vazia
Linguagens Livres de Contexto
Árvore de Derivação e Ambigüidade
Se um vértice n é rotulado com A, e os filhos de n
são rotulados com X1, X2,..., Xk, da esquerda para a direita, então A→X1X2...Xk deve ser uma produção;
Considere, como exemplo, a gramática:
E → E+E | E*E | (E) | id
Linguagens Livres de Contexto
Árvore de Derivação e Ambigüidade
Uma árvore de derivação para a sentença
(id+id)*id gerada por esta gramática
poderia ser:
18
E
E * E
( E )
E + E
id
Linguagens Livres de Contexto
Árvore de Derivação e Ambigüidade
Mais formalmente, seja G = (N, T, P, S) uma GLC.
Então uma árvore é uma árvore de derivação para G, se:
a. Cada vértice tem um rótulo, que é um símbolo de
N T {};
b. O rótulo da raiz é o símbolo S;
c. Os vértices interiores são rotulados apenas com
Linguagens Livres de Contexto
Árvore de Derivação e Ambigüidade
d. Se o vértice n tem rótulo A, e os vértices n1, n2,..., nk
são filhos de n, da esquerda para a direita, com
rótulos X1, X2,..., Xk, respectivamente, então
A → X1X2...Xk
deve ser uma produção em P.
Se o vértice n tem rótulo , então n é uma folha e
Linguagens Livres de Contexto
Exemplo
Considere a gramática G = ({S, A}, {a, b}, P, S),
onde P consiste de
S → aAS | a
A → SbA | SS | ba
A figura seguinte é uma árvore de derivação
para uma sentença desta gramática, na qual os nodos foram numerados para facilitar a explicação:
Linguagens Livres de Contexto
Exemplo Os vértices interiores são 1, 3, 4, 5 e 7.
O vértice 1 tem rótulo S, e seus filhos, da esquerda para a direita têm rótulos a, A e S. Note que S→aAS é uma produção.
Os vértices 4 e 5 têm ambos o rótulo S. O único filho deles tem rótulo a; e S → a é uma produção.
Finalmente, o vértice 7 tem rótulo A, e seus filhos, da esquerda para a direita, tem rótulos b e a.
Linguagens Livres de Contexto
Árvore de Derivação e Ambigüidade
Pode-se ver que a árvore de derivação é uma
descrição natural para a derivação de uma forma sentencial particular da gramática G
Se uma gramática G tem mais de uma árvore de
derivação para uma mesma cadeia não vazia, então G é chamada de gramática ambígua.
Uma linguagem livre de contexto para a qual
toda gramática livre de contexto é ambígua é denominada linguagem livre de contexto inerentemente ambígua. Ex {0i1j2k|i=j ou j=k}
Linguagens Livres de Contexto
Derivação mais à Esquerda e mais à Direita
Se cada passo na produção de uma derivação é
aplicado na variável mais à esquerda, então a derivação é chamada derivação mais à esquerda.
Similarmente, uma derivação onde a cada passo
a variável à direita é substituída, é chamada de
derivação mais à direita.
Linguagens Livres de Contexto
Derivação mais à Esquerda e mais à Direita
Se w está em L(G), então w tem ao menos uma árvore de
derivação.
Além disso, em relação a uma árvore de derivação
particular, w tem uma única derivação mais à esquerda e
uma única derivação mais à direita.
Evidentemente, w pode ter várias derivações mais à
esquerda e várias derivações mais à direita, já que pode haver mais de uma árvore de derivação para w.
Entretanto, é fácil mostrar que para cada árvore de
derivação apenas uma derivação mais à esquerda e uma derivação mais à direita pode ser obtida.
Linguagens Livres de Contexto
Derivação mais à Esquerda e mais à Direita
Exemplo
derivação mais à esquerda correspondendo à árvore do exemplo anterior
derivação mais à direita correspondente
S aAS
aSbAS
aabAS
aabbaS
aabbaa
S aAS
aAa
aSbAa
aSbbaa
aabbaa
26
S → aAS | a
Linguagens Livres de Contexto
Simplificações de GLC
Existem várias maneiras de restringir as produções de
uma gramática livre de contexto sem reduzir seu poder expressivo
Se L é uma linguagem livre de contexto não vazia,
então L pode ser gerada por uma gramática livre de contexto G com as seguintes propriedades:
a) Cada variável e cada terminal de G aparecem na derivação de alguma palavra de L (não possui símbolos inúteis). Todos símbolos são ou geradores ou alcançáveis;
b) Não há produções da forma A → B, onde A e B são variáveis;
c) Se não está em L, então não há necessidade de produções da forma A → .
Linguagens Livres de Contexto
Simplificações de GLC
No caso de (a), estes símbolos (variáveis ou
terminais) são conhecidos como símbolos inúteis (símbolos improdutivos e símbolos inalcançáveis)
Em (b) as produções A → B são conhecidas como
produções unitárias;
As produções da forma A → (item c) são
conhecidas como -produções;
Existem algoritmos que podem ser aplicados nos
casos (a), (b) e (c) que produzem uma nova gramática equivalente à gramática original
Linguagens Livres de Contexto
Eliminação das -produções
Toda GLC pode ser transformada em uma GLC
equivalente sem -produções; com exceção da produção S → (S é o símbolo inicial), se esta existir.
Assim procedendo, é possível mostrar que toda
GLC pode obedecer à restrição das GSC (tipo 1).
O método de eliminação das -produções
consiste em determinar, para cada variável A em N, se A*.
Linguagens Livres de Contexto
Eliminação das -produções
Se isso ocorrer diz-se que a variável A é
anulável;
Pode-se, assim, substituir cada produção da
forma B→X1X2X3...Xn por todas as produções formadas pela retirada de uma ou mais variáveis Xi anuláveis
Exemplo
Linguagens Livres de Contexto
Eliminação das -produções Exemplo
Dada a gramática
A → BCDe
B → | e C → | a D → b | cC
Neste caso as variáveis anuláveis são B e C, assim, a gramática pode ser transformada na seguinte gramática:
A → BCDe | CDe | BDe | De B → e
C → a
D → b | c | cC
Linguagens Livres de Contexto
Eliminação das -produções
Os não-terminais que derivam a cadeia são
chamados -não-teminais.
Um não-terminal (variável) A é um
-não-terminal se existir uma derivação A* em G.
Note que está em L(G) se e somente se S é um -não-terminal. Onde S é o não terminal inicial.
Se G não tem -não-terminal, ela é dita -livre.
Linguagens Livres de Contexto
Eliminação das -produções
Se G tem -produções, então em uma derivação
sentencial da forma:
S 1 2 ... n
Os tamanhos das sentenças irão variar
não-monotonicamente um em relação ao outro, isto é, ora aumentam, ora diminui. Entretanto, se G não tem -produções, então:
|S| |1| |2| ... |n|
Antes de apresentar um algoritmo para eliminar
as -produções, será apresentado um algoritmo para encontrar os -não-terminais.
Linguagens Livres de Contexto
Eliminação das -produções
Algoritmo: Encontrar o Conjunto dos -não-terminais
Entrada: Uma GLC G = (N, T, P, S)
Saída: O conjunto E de -não-terminais E {A | AN e A → };
Repita
Q {X | XN e XE e existe pelo menos uma produção da forma X → Y1Y2...Yn tal que Y1E, Y2E, ...,YnE};
E EQ; Até Q = ;
Linguagens Livres de Contexto
Eliminação das -produções
Exemplo: Seja G a seguinte gramática
S → aS | SS | bA
A → BB
B → CC | ab | aAbC
C →
Inicialmente temos E = {C} e se obtem:
B → CC | aAbC
C →
Linguagens Livres de Contexto
Eliminação das -produções
Quando o laço é executado pela primeira vez
deixa Q = {B} e
A → BB
B → CC | ab | aAbC C →
Linguagens Livres de Contexto
Eliminação das -produções
Como Q não é vazio, uma segunda iteração deixa
Q = {A}
S → bA
A → BB
B → CC | ab | aAbC C →
obtendo E = {A, B, C}
Mais uma vez, Q é não-vazio, mas uma iteração
subseqüente não acrescenta novos símbolos, assim o algoritmo termina. A, B e C são os únicos
-não-terminais em G.
Linguagens Livres de Contexto
Eliminação das -produções
Para eliminar os -não-terminais de uma GLC,
pode-se usar o seguinte algoritmo, que elimina
-não-terminais sem introduzir novos
A estratégia é baseada na seguinte ideia:
Linguagens Livres de Contexto
Eliminação das -produções
Seja A um -não-terminal em G. Então ele é
dividido conceitualmente em dois não-terminais A’ e A’’, tal que A’ gera todas as cadeias não vazias e A’’ apenas gera .
Agora, o lado direito de cada produção onde A
aparece uma vez, por exemplo, B→ A, é trocado por duas produções B → A’ e B →
A’’. Já que A’’ só gera , ele pode ser trocado por , deixando B → .
Linguagens Livres de Contexto
Eliminação das -produções
Depois disso, pode-se usar A em lugar de A’; A produção final fica:
B → | B → A,
onde A não é mais um -não-terminal
Se B→AA, então são obtidas as quatro
combinações possíveis pelas trocas de A por , e assim por diante.
Linguagens Livres de Contexto
Eliminação das -produções
Algoritmo:Eliminação de todos os -não-terminais
Entrada: Uma GLC G = (N, T, P, S)
Saída: Uma GLC G’ = (N’, T, P’, S’) -livre Construa o conjunto E;
P’ {p | pP e p não é -produção}
Repita
Se P’ tem uma produção da forma A→B, tal que BE,
(NT)* e ,
então inclua a produção A → em P’;
até que nenhuma nova produção possa ser adicionada a P’;
Linguagens Livres de Contexto
Eliminação das -produções
Algoritmo:Eliminação de todos os -não-terminais
Continuação...
se SE então
Adicione a P’ as produções S’ → S | N’ N {S’};
senão
S’ S; N’ N;
Fim-se;
Linguagens Livres de Contexto
Eliminação das -produções
Exemplo 1: Eliminar as -produções da seguinte
gramática
S → ABC
A → BB |
B → CC | a
C → AA | b
Linguagens Livres de Contexto
Eliminação das -produções
Exemplo 2: Eliminar as -produções da seguinte
gramática
S → aBC
A → bB |
Linguagens Livres de Contexto
Fatoração de GLC
Uma GLC está fatorada se ela é determinística
Ou seja, se ela não possui produções para um
mesmo não terminal no lado esquerdo cujo lado direito inicie com a mesma cadeia de símbolos ou com símbolos que derivam seqüências que iniciem com a mesma cadeia de símbolos
Linguagens Livres de Contexto
Fatoração de GLC
Exemplo:
S
→
aSB | aSa
A
→
a
B
→
b
Fonte de não
determinismo.
Linguagens Livres de Contexto
Fatoração de GLC
Para fatorar uma GLC deve-se alterar as
produções envolvidas no não determinismo da seguinte maneira:
As produções com não determinismo direto da
forma:
A → |
serão substituídas por: A → A’
Linguagens Livres de Contexto
Fatoração de GLC
O não determinismo indireto é retirado por meio de
sua transformação em determinismo direto (através de substituições sucessivas) e posterior eliminação segundo o item (a).
Linguagens Livres de Contexto
Fatoração de GLC
Exemplo: fatorar a gramática:
S → aSB | aSa
A → b
B → a
Eliminando o não determinismo direto:
S → aSS’
S’ →B | a
A → b
B → a
Linguagens Livres de Contexto
Fatoração de GLC
Exemplo...
Veja que na produção
S’ → B | a
tem um não-determinismo indireto
Tem-se que tornar este não determinismo
indireto em direto substituindo o lado direito de B → a na variável B da produção S’ → B
Linguagens Livres de Contexto
Fatoração de GLC
Exemplo...
Obtém-se então
S → aSS’
S’ → a | a
A → b
B → a
Linguagens Livres de Contexto
Fatoração de GLC
Exemplo...
Eliminando o não determinismo direto
S → aSS’
S’ → aS’’ S’’ →
A → b
B → a
Linguagens Livres de Contexto
Fatoração de GLC
Exemplo: Fatorar a gramática
C → if E then C else C
C → if E then C
C → o
C Comando E Expressão
o Outro comando
Linguagens Livres de Contexto
Fatoração de GLC
Exemplo: Fatorar a gramática
S → AC | BD
A → aD | cB
B → aB | dD
C → eC | eA
D → fD | AB
Linguagens Livres de Contexto
Eliminação da recursão a esquerda
Um não-terminal A, em uma GLC G = (N, T, P, S) é
recursivo se A +A, para e (NT)*.
Se = , então A é recursivo à esquerda; Se = , então A é recursivo à direita.
Esta recursividade pode ser direta ou indireta. Uma GLC G = (N, T, P, S) possui recursão à
esquerda direta, se P contém pelo menos uma
produção da forma A → A.
Linguagens Livres de Contexto
Eliminação da recursão a esquerda
Uma GLC G = (N, T, P, S) possui recursão à
esquerda indireta, se existe em G uma derivação
da forma: A n A, para algum n 2.
Linguagens Livres de Contexto
Eliminação da recursão a esquerda
Para eliminar as recursões diretas à esquerda de
um não terminal A, com produções
A → A1 | A2 | ... |Am | 1 | 2 | ... | n
onde nenhum i começa por A.
Substituir estas produções-A por:
A → 1A’ | 2A’ | ... | nA’
Linguagens Livres de Contexto
Eliminação da recursão a esquerda
Algoritmo:
Algoritmo: Eliminação da recursão á esquerda Entrada: Uma GLC G = (N, T, P, S);
Saída: Uma GLC G’ = (N’, T, P’, S) sem recursão à esquerda;
Ordene os não-terminais em uma ordem qualquer (ex: A1, A2, ...,An); para i de 1 a n faça
para j de 1 a i-1 faça
Substitua as produções Ai→Aj por Ai→1 | 2 |...| k, onde Aj→1 | 2 |...| k
são todas as produções-Aj correntes; fim_para;
Elimine as recursões à esquerda diretas entre as produções Ai; fim_para;
Linguagens Livres de Contexto
59
Eliminação da recursão a esquerda
Exemplo: Eliminar a RE das gramáticas a seguir:
a) 𝐸 → 𝐸 + 𝑇 | 𝑇
𝑇 → 𝑇 ∗ 𝐹 | 𝐹 𝐹 → 𝐸 | 𝑖𝑑
b) A→ 𝐵𝑎 𝐴𝑎 𝑐
Linguagens Livres de Contexto
Eliminação da Ambiguidade de GLC (dicas)
É apenas uma dica, pois não existe um algoritmo
para eliminar a ambiguidade, tampouco para verificar se um GLC é ambígua (nem LLC inerentemente ambíguas).
A gramática GE:
𝐸 → 𝐸 + 𝐸 𝐸 ∗ 𝐸 𝐸 𝐸 − 𝐸 𝐸 𝐸 | 𝑖𝑑Τ
gera a linguagem ambígua L(GE)=LE das expressões aritméticas.
Para retirar a ambiguidade, deve-se levar em
consideração, neste caso específico, a precedência e a associatividade dos operadores presentes em cada cadeia de L .
Linguagens Livres de Contexto
Eliminação da Ambiguidade de GLC (dicas)
Precedência e associatividade dos operadores
aritméticos:
61
Associatividade Operadores Precedência
Esquerda +, –
aumenta
Esquerda *, /
Deve-se, então, criar:
duas variáveis E (expressão) e T (termo) para os
dois níveis de precedência;
uma variável F (fator) para as unidades básicas:
Linguagens Livres de Contexto
Eliminação da Ambiguidade de GLC (dicas)
Para os operadores aritméticos * e / (maior
precedência e associatividade a esquerda):
𝑇 → 𝑇 ∗ 𝐹 | 𝑇/𝐹 |𝐹
Para os operadores aritméticos + e – (menor
precedência e associatividade a esquerda):
𝐸 → 𝐸 + 𝑇 𝐸 − 𝑇 𝑇
Gramática final que gera LE sem ambiguidade: E → E + T | E − T | T
T → T*F | T/F | F F → id | (E)
Linguagens Livres de Contexto
Eliminação da Ambiguidade de GLC (dicas)
Exercícios. 1) Desenvolver uma gramática não ambígua para a linguagens das expressões regulares contendo os operações: * (fecho de kleene), • (concatenação), | (união). Além dos operadores, deve-se usar (, ), a e b (2 símbolos
do alfabeto da ER)
2) Desenvolver uma outra gramática não ambígua para a seguinte gramática (gera a linguagem dos parênteses):
𝑆 → 𝑆 𝑆𝑆 𝜀
Linguagens Livres de Contexto
Eliminação da Ambiguidade de GLC (dicas)
3) Verifique se a gramática abaixo é ambígua e se sim, transformá-la em outra gramática não ambígua:
𝑆 → 𝑏𝑒𝑔𝑖𝑛 𝐿 𝑒𝑛𝑑 | 𝑖𝑑 ≔ 𝐸 𝐿 → 𝐿; 𝑆 | 𝑆
𝐸 → 𝐸 ∨ 𝐸 | 𝑖𝑑
Linguagens Livres de Contexto
Simplificações de GLC
Símbolos inúteis (símbolos improdutivos e
símbolos inalcançáveis)
Importância: em gramáticas grandes, como
gramáticas de linguagens de programação, pode acontecer de se esquecer de definir regras relativas a alguma variável, ou então, uma variável, apesar de ter suas regras já definidas, pode não ter sido utilizada na formação de novas regras.
não usados na geração de cadeias de terminais;
são excluídas as produções que contém os símbolos
inúteis e os próprios símbolos.
Linguagens Livres de Contexto
Simplificações de GLC
Algoritmo para a exclusão de símbolos inatingíveis
(garante que qualquer variável gera terminais).
Etapa 1:
66
N1 = ;
repita
N1 = N1{A | A→P e (TN1)*}
até que o cardinal de N1 não aumente.
Linguagens Livres de Contexto
Simplificações de GLC
Algoritmo para a exclusão de símbolos
improdutivos (garante que qualquer símbolo é
atingível a partir da variável inicial). Etapa 2:
67
T2 = ;
N2 = {S};
repita
N2 = N2{A | X→AP1,XN2};
T2 = T2{a | X→aP1,XN2};
Linguagens Livres de Contexto
Simplificações de GLC
Exemplo1: Excluir os símbolos inúteis da
gramática:
68
S → aAa | bBb A → a | S
C → c
S → aAa | bBb
A → a | S C → c
S → aAa | bBb
A → a | S
C → c
S → aAa | bBb
A → a | S
C → c
Assim, N1 = {A, C, S} e a produção S → bBb deve ser retirada. Gramática após a primeira etapa:
Linguagens Livres de Contexto
Simplificações de GLC
Exemplo1: Excluir os símbolos inúteis da
gramática:
69
Assim, N2 = {S, A} e T2 = {a} a produção C → c deve ser retirada. Gramática final:
S → aAa A → a | S C → c
S → aAa
A → a | S
C → c
S → aAa
A → a | S
C → c
Linguagens Livres de Contexto
Simplificações de GLC
Exemplo2: Excluir os símbolos inúteis da
gramática:
70
S → ABC | AC | A | CC | A → AB | AA | Ba
B → BA | A | aB
C → AB | aB | aC | a
S → ABC | AC | A | CC | A → AB | AA | Ba
B → BA | A | aB
C → AB | aB | aC | a
S → ABC | AC | A | CC |
A → AB | AA | Ba
B → BA | A | aB
C → AB | aB | aC | a
N1 = {S, C} e a gramática após a primeira etapa:
Linguagens Livres de Contexto
Simplificações de GLC
Exemplo2: Excluir os símbolos inúteis da
gramática. Etapa 2:
71
S → CC | C → aC | a
S → CC |
C → aC | a
S → CC |
C → aC | a