Você está na página 1de 10

Universidade Federal do Pará

Instituto de Ciências Exatas e Naturais Gramáticas Livres de Contexto (GLC)


Faculdade de Computação
Bacharelado em Ciência da Computação
 É um método mais poderoso de descrever linguagens
Unidade III: que os autômatos finitos e expressões regulares;

Linguagens Livre de Contexto  Tais gramáticas podem descrever certas


(Gramáticas Livres de Contexto)
características que têm uma estrutura recursiva, o que
as torna úteis em uma variedade de aplicações;
Prof. Josivaldo Araújo
(josivaldo@ufpa.br)
 As GLCs foram primeiramente utilizadas para o
estudo da linguagem humana (formação de frases:
nome, verbo e preposição);

Aplicações de GLCs Aplicações de GLCs


 Em Ciência da Computação, uma aplicação Hopcroft et al. (pág. 205 a 219):
importante das GLCs ocorre na especificação e  Analisadores sintáticos (componentes de
compilação de linguagens de programação; tradutores de linguagens de programação);

 Uma gramática para uma linguagem de programação O gerador de analisadores sintáticos YACC
aparece como referência para uma pessoa tentando (utilizado no sistema operacional UNIX);
aprender a sintaxe de tal linguagem;

 Linguagens de marcação (HTML);


 Os projetistas de compiladores e interpretadores
frequentemente iniciam seu trabalho definindo uma
gramática para a linguagem.  XML e definições de tipos de documentos.

Gramáticas Livres de Contexto (GLC) Gramáticas Livres de Contexto (GLC)


Suas produções são do tipo:
 A coleção de linguagens associadas com GLC são
chamadas de linguagens livres de contexto; A → α,
sendo que A ∈ N e α ∈ (N∪T)*
 Essa coleção inclui todas as linguagens regulares e
muitas outras linguagens (ver Hierarquia de Exemplo:
Chomsky); G1 = ({A,B}, {0,1,#}, P, A)

 Estudo: P: {A → 0Α1
 Gramáticas Livres de Contexto (gerador); A→Β Qual a linguagem gerada por G1?
 Autômatos com pilha (reconhecedor). Β → #}
Derivação Derivação mais à Esquerda
Efetuando sucessivos passos de derivação Para restringir o número de escolhas que temos
poderemos verificar que a linguagem de G1 é: na derivação de uma palavra, muitas vezes é útil
L(G1)= {0n#1n | n>=0} exigir que em cada etapa da derivação seja
substituído o não-terminal mais à esquerda
Exemplo: 000#111 (leftmost);
A ⇒ 0A1 ⇒ 00A11 ⇒ 000A111 ⇒ 000B111 ⇒ 000#111
Este tipo de derivação é chamado de derivação
mais à esquerda;
P: {A → 0Α1
A→Β
*
Utiliza-se o símbolo ⇒ ou ⇒
Β → #} lm lm

Ex. de Derivação mais à Esquerda Derivação mais à Direita


 Dada a gramática abaixo, derivar a palavra a * (a + b00); Para restringir o número de escolhas que temos
na derivação de uma palavra, muitas vezes é útil
1. E  I E ⇒ E*E ⇒ I *E ⇒ a*E ⇒ a *(E) ⇒
2. E  E + E lm lm lm lm lm exigir que em cada etapa da derivação é
3. E  E * E
a *(E+E) ⇒ a *(I+E) ⇒ a *(a+E) ⇒ substituído o não-terminal mais à direita
4. E  (E) lm lm lm
5. I  a
(rightmost);
6. I  b a *(a+I) ⇒ a *(a+I0) ⇒ a *(a+I00) ⇒ a *(a+b00)
lm lm lm
7. I  Ia
8. I  Ib Este tipo de derivação é chamado de derivação
9. I  I0 Podemos resumir a derivação mais à esquerda mais à direita;
10. I  I1 dizendo que: E ⇒ * a * (a + b00) ou representar
lm
várias etapas por meio de expressões como: *
* a * (E) Utiliza-se o símbolo ⇒ ou ⇒
E*E⇒ rm rm
lm

Ex. de Derivação mais à Direita Árvore de Análise Sintática


Dada a gramática abaixo, derivar a palavra:
a * (a + b00) Também serve para representar a derivação de
uma palavra de forma gráfica;
1. E  I E ⇒ E*E ⇒ E * (E) ⇒ E * (E+E) ⇒ E *(E+I) ⇒
2. E  E + E rm rm rm rm rm Na literatura, também são chamadas de árvores
3. E  E * E E *(E+I0) ⇒ E *(E+I00) ⇒ E *(E+b00) ⇒ de derivação (Menezes, 2005); parser tree
4. E  (E) rm rm rm
5. I  a (Sipser, 2006).
6. I  b E *(I+b00) ⇒ E *(a+b00) ⇒ I *(a+I00) ⇒ a *(a+b00)
rm rm rm
7. I  Ia
8. I  Ib
9. I  I0
10. I  I1
Revisão da Terminologia de Árvore Revisão da Terminologia de Árvore
 Árvores são coleções de nós, com um
relacionamento pai-filho. Um nó tem no máximo  Existe um nó, a raiz, que não tem pai e esse nó
um pai, colocado acima do nó, e zero ou mais filhos, aparece no alto da árvore. Nós sem filhos são
colocados abaixo dele. Linhas (arestas) conectam os chamados folhas. Nós que não são folhas são nós
pais a seus filhos, colocados abaixo deles. internos.

Nó E
 Os filhos de um nó são ordenados “a
E Raiz
partir da esquerda” e traçados dessa Nó E + E
forma. E + E Interno
Folha
a E × E
a E × E a a
a a

Árvore de Análise Sintática Árvore de Análise Sintática


 Dada uma gramática G=(N, T, P, S), árvores de Exemplo: 000#111
análise sintática para G são árvores com as
A
seguintes condições: Concatenando-se os nós folhas da
 O nó mais alto é a raiz da árvore (símbolo inicial); A esquerda para direita, obtemos o
 Cada nó interior é rotulado por um símbolo não- resultado da árvore sintática.
terminal; A
 Cada folha é rotulada por um símbolo terminal ou pela
A
palavra vazia (neste caso, esta folha é o único filho de seu A → 0Α1
pai); B A→Β
 Se um nó interno é rotulado por A e seus filhos são
rotulados por X1, X2, ..., Xn respectivamente, a partir da 0 0 0 # 1 1 1 Β→#
esquerda, então A → X1X2 ... Xn é uma produção em P.
A ⇒ 0A1 ⇒ 00A11 ⇒ 000A111 ⇒ 000B111 ⇒ 000#111

Exemplo 2 Exemplo 2
 G2, descreve um fragmento da língua Inglesa:  a boy sees

〈SENTENCA〉 → 〈NOUN-PHRASE〉〈VERB-PHRASE〉 〈SENTENCE〉 ⇒ 〈NOUN-PHRASE〉 〈VERB-PHRASE〉


〈NOUN-PHRASE〉 → 〈CMPLX-NOUN〉 | 〈CMPLX-NOUN〉 〈PREP-PHRASE〉 ⇒ 〈CMPLX-NOUN〉 〈VERB-PHRASE〉
〈VERB-PHRASE〉 → 〈CMPLX-VERB〉 | 〈CMPLX-VERB〉 〈PREP-PHRASE〉 ⇒ 〈ARTICLE〉 〈NOUN〉 〈VERB-PHRASE〉
〈PREP-PHRASE〉 → 〈PREP〉 〈CMPLX-NOUN〉 ⇒ a 〈NOUN〉 〈VERB-PHRASE〉
〈CMPLX-NOUN〉 → 〈ARTICLE〉 〈NOUN〉
⇒ a boy 〈VERB-PHRASE〉
〈CMPLX-VERB〉 → 〈VERB〉 | 〈VERB〉 〈NOUN-PHRASE〉
〈ARTICLE〉 → a | the ⇒ a boy 〈CMPLX-PHRASE〉
〈NOUN〉 → boy | girl | flower ⇒ a boy 〈VERB〉
〈VERB〉 → touches | likes | sees ⇒ a boy sees
〈PREP〉 → with
Gramáticas Livres do Contexto (GLC) Exemplo 3
Definição:  G4 = (N, T, P, 〈EXPR〉)
 Uma gramática livre do contexto é uma 4-upla:  N = {〈EXPR〉, 〈TERM〉, 〈FACTOR〉}
(V, Σ, R, S), onde:  T = {a, +, x, (, )}
 P = { 〈EXPR〉 → 〈EXPR〉 + 〈TERM〉 | 〈TERM〉
〈TERM〉 → 〈TERM〉 x 〈FACTOR〉 | 〈FACTOR〉
 V é um conjunto finito denominado variáveis;
〈FACTOR〉 → (〈EXPR〉 ) | a
 Σ é um conjunto finito, disjunto de V, denominado terminais;
}
 R é um conjunto finito de regras, com cada regra sendo uma
Para as palavras abaixo:
variável e uma cadeia de variavéis e terminais, e; 1) mostre a derivação de cada uma delas e,
2) gere árvores de análise sintática
 S ∈ V é a variável inicial.
a+axa
(a+a)xa

Exemplo 3 Exemplo 3 (cont.)


 A gramática G4 descreve um fragmento de uma
Árvore de Análise Sintática linguagem de programação preocupada com
expressões aritméticas;

 Note que a precedência de operadores é considerada


(“x” tem maior precedência que “+”);

 Também é considerado o uso de parênteses para dar


maior precedência a uma determinada operação como
a adição em (a+a) x a;
Árvore: a + a x a Árvore: (a + a) x a

Exercício Projeto de Gramáticas Livres de Contexto

 Obtenha a árvore de análise sintática da  Assim como o projeto de autômatos, o projeto de


sentença: “bbabaaabbaba” ; GLCs é um processo criativo;

 Gramáticas livres do contexto são mais complicadas


 Utilize a gramática abaixo:
de construir que autômatos finitos;

G = ({S, A}, {a, b}, P, S)  Porque estamos mais acostumados a programar uma
P: S → bAS | a máquina para tarefas específicas que a descrever
A → SaA | SS | ab linguagens com gramáticas;

 Existem algumas técnicas que podem auxiliar nesse


processo quando estivermos com dúvidas;
Projeto de Gramáticas Livres de Contexto Projeto de Gramáticas Livres de Contexto
1. Muitas Linguagens Livres de Contexto (LLC) são a 1. Muitas Linguagens Livres de Contexto (LLC) são a
união de LLCs mais simples. união de LLCs mais simples.

 Assim para construir uma GLC para uma linguagem, você  Exemplo: {0n1n| n>=0} ∪ {1n0n| n>=0}
pode quebrá-la em “pedaços” menores e construir gramáticas  Primeiro, construa a gramática para a linguagem {0n1n|
individuais para cada “pedaço”; n>=0}: S1 → 0S11|εε
 Segundo, construa a gramática para a linguagem {1n0n|
 Estas gramáticas individuais podem ser facilmente juntadas n>=0}: S2 → 1S20|εε
em uma gramática para a linguagem original por meio da  Adicione a regra S → S1|S2 para conseguir a gramática:
combinação das suas regras e pela adição de uma nova regra
S → S1|S2
S → S1 | S2 | ... | SK
S1 → 0S11|εε
S2 → 1S20|εε

Projeto de Gramáticas Livres de Contexto Projeto de Gramáticas Livres de Contexto


2. Construir uma GLC para uma linguagem regular é 2. Construir uma GLC para uma linguagem regular é
mais fácil se antes construirmos um AFD e depois o mais fácil se antes construirmos um AFD e depois o
convertemos para uma GLC equivalente. convertemos para uma GLC equivalente.

 Crie uma variável Ri para cada estado qi do seu AFD; M1 0 1


0
1
 Adicione a regra Ri → aRj a GLC se δ(qi,a)→ qj é uma trasição
no AFD; q1 q2 q3
 Adicione a regra Ri → ε se qi é um estado de aceitação no
0,1
AFD;
 Faça R0 o símbolo inicial da gramática, onde q0 é o estado
inicial do AFD.
Ex.: O AFD pode gerar a palavra 0011 ?

Construir a GLC equivalente.

Projeto de Gramáticas Livres de Contexto Projeto de Gramáticas Livres de Contexto


Regra 1:
3. Certas GLCs contém palavras com duas subpalavras
q1 → R1
q2 → R2 que são “linkadas” no sentido que uma máquina
q3 → R3 para reconhecer tal linguagem deveria lembrar uma
quantidade ilimitada de informação sobre uma das
Regra 2:
G = ( {R1, R2, R3}, {0,1}, Regra2, R0 ) subpalavras para verificar que esta corresponde
R1 → 1 R2
R1 → 0 R1 R1 ⇒ R1 → 0R1 apropriadamente a outra subpalavra.
R2 →1R2
R2 →0R3 0R1 ⇒ R1 → 0R1
R3 →01R2  Exemplo: {0n1n| n>=0}
00R1 ⇒ R1 → 1 R2
Regra 3:
R2 →ε 001R2 ⇒ R2 →1R2  Usar regras da forma R → uRv, que gera palavras com a parte
contendo u’s corresponde à parte que contém v’s.
Regra 4: 0011R2 ⇒ R2 →ε
R0→ R1 0011
Projeto de Gramáticas Livres de Contexto Ambiguidade
4. Em linguagem mais complexas, as palavras podem Uma gramática pode gerar a mesma palavra de
conter certas estruturas que aparecem recursivamente diferentes maneiras;
como parte de outras (ou da mesma) estruturas.
Tal palavra terá diferentes árvores de análise
 Exemplo: sintática e portanto vários e diferentes
〈EXPR〉 → 〈EXPR〉 + 〈TERM〉 | 〈TERM〉 significados;
〈TERM〉 → 〈TERM〉 x 〈FACTOR〉 | 〈FACTOR〉
〈FACTOR〉 → (〈EXPR〉 ) | a
Este resultado pode ser indesejável para várias
aplicações como o desenvolvimento de linguagens
de programação, pois um programa deve ter uma
interpretação única;

Ambiguidade Ambiguidade - Exemplo

Se uma gramática gera a mesma palavra de Dada a gramática G5:


diferentes maneiras, dizemos que a palavra é E → E + E | E x E | (E ) | a

derivada ambiguamente; A palavra a + a x a é gerada ambiguamente;

[1] [2]
Se uma gramática gera alguma palavra E E
ambiguamente, então dizemos que essa gramática
é ambígua. E + E E × E
a E × E a
E + E
a a a a

Ambiguidade - Definição Ambiguidade - Definição


 Dizemos que uma gramática gera uma palavra ambiguamente, Uma palavra w é derivada ambiguamente por
quando a palavra possui duas árvores de análise sintática
diferentes e não duas derivações diferentes;
uma GLC G se ela possui duas ou mais derivações
 Exemplo:
à esquerda;
Uma gramática G é ambígua se ela gera alguma
Derivar a palavra a + b palavra ambiguamente.
1. E  I
2. E  E + E E ⇒ E+E ⇒ I + E ⇒ a + E ⇒ a + I ⇒ a + b
3. E  E * E  Infelizmente não há um algoritmo para determinar
4. E  (E) E ⇒ E+E ⇒ E + I ⇒ I + I ⇒ I + b ⇒ a + b (detectar) se uma gramática é ambígua.
5. I  a
6. I  b  Também não há algoritmo genérico para remover a
7. I  Ia Duas derivações podem ser diferentes
ambiguidade de uma gramática. Existem técnicas. Ver
8. I  Ib quanto à ordem pela qual são
Hopcroft et al. seção 5.4.2
9. I  I0 substituídos os não-terminais;
10. I  I1
Ambiguidade - Exemplo Linguagens Inerentemente Ambíguas
 Derivar a palavra a + a * a
 É uma linguagem que só pode ser gerada por GLCs
ambíguas.
1. E  I
2. E  E + E
3. E  E * E
 Exemplo:
4. E  (E)
5. I  a L = { ai bj ck | i=j ou j=k}
6. I  b
7. I  Ia
8. I  Ib
9. I  I0
10. I  I1

Forma Normal de Chomsky (FNC) Forma Normal de Chomsky (FNC)


 É uma das formas mais simples e mais  Uma GLC está na Forma Normal de Chomsky se
utilizadas; toda regra está na forma:

onde:
 Existem outras formas normais como: A→a - a é qualquer terminal e
 Backus-Naur form; - A, B, C são quaisquer variáveis, mas B e
A → BC C não podem ser a variável inicial.
 Greibach normal form;

 Além disso é permitida a regra S → ε onde S é o


símbolo inicial.

Forma Normal de Chomsky (FNC) Forma Normal de Chomsky (FNC)


TEOREMA CONVERSÃO PARA A FNC

 “Qualquer linguagem livre de contexto é gerada 1) Adição de um novo símbolo inicial;


por uma gramática livre de contexto na forma
normal de Chomsky”; 2) Exclusão de produções vazias da forma: A → ε;

 Idéia da prova: podemos converter qualquer 3) Exclusão de produções unitárias da forma A → B


gramática G para a forma normal de Chomsky. (B é um não-terminal);
 Esta conversão tem várias etapas nas quais as regras
que violam as condições são substituídas por outras 4) Convertemos as produções restantes para a
equivalentes e que satisfazem as condições. forma apropriada incluindo produções e não-
terminais adicionais.
Forma Normal de Chomsky (FNC) Forma Normal de Chomsky (FNC)
1) Adição de um Novo Símbolo Inicial 2)Exclusão de produções vazias da forma: A → ε;

 Adicione uma nova variável inicial S0 e a regra  Removemos todas as regras A → ε, onde A não é a
S0 → S , onde S era a variável inicial original. variável inicial;
 Desta forma garantimos que o símbolo inicial não ocorre
no lado direito de uma produção.  Para cada ocorrência de A no lado direito de uma
produção, adicionamos uma nova produção sem
 Exemplo: aquela ocorrência do A, ou seja:

S → ASA | aB S0 → S
A→ B| S S → ASA | aB  Se R → uAv é uma produção em que u e v são
B→b|ε A→ B| S strings de terminais e não-terminais, nós
B→b|ε adicionamos a produção R → uv.

Forma Normal de Chomsky (FNC) Forma Normal de Chomsky (FNC)


2)Exclusão de produções vazias da forma: A → ε; 2)Exclusão de produções vazias da forma: A → ε;

 Isto deve ser feito para cada ocorrência de A. Assim a EXEMPLO:


produção R → uAvAw, gera as produções
 Excluir todas as regras B → ε, mostrados à
R → uvAw,
esquerda, e A → ε, mostrado à direita.
R → uAvw,
R → uvw.
S0 → S S0 → S
 Se tivermos a regra R → A, adicionamos R → ε, a S → ASA | aB S → ASA | aB
menos que tivéssemos previamente removido a A→ B| S | ε A→ B| S | ε
regra R → ε. B→b| ε B→b

 Repetimos esses passos até que eliminemos todas


as regras ε que não envolvem a variável inicial.

Forma Normal de Chomsky (FNC) Forma Normal de Chomsky (FNC)


2)Exclusão de produções vazias da forma: A → ε; 2)Exclusão de produções vazias da forma: A → ε;

EXEMPLO: EXEMPLO:

 Excluir todas as produções do tipo B → ε  Excluir todas as produções do tipo A → ε


Procurar as ocorrências de B no Inserir novas produções sem o B
Excluir a
lado direito das produções S0 → S produção S0 → S
S → ASA | aB | a vazia S → ASA | aB | a
S0 → S S0 → S A→ B| S | ε
S → ASA | aB S → ASA | aB | a A→ B| S
B→b B→b
A→ B| S | ε A→ B| S | ε
B→b B→b
Forma Normal de Chomsky (FNC) Forma Normal de Chomsky (FNC)
2)Exclusão de produções vazias da forma: A → ε; Passo 3: Excluir todas as produções unitárias do tipo A → B;

EXEMPLO:  Removemos as regras A → B e sempre que uma produção


B → u aparecer, nós adicionamos a produção: A → u, a
 Excluir todas as produções do tipo A → ε não ser que esta seja uma produção removida
previamente;
Procurar as ocorrências de A no Inserir novas produções sem a
lado direito das produções ocorrência de cada A
 B é um não-terminal;
S0 → S S0 → S
S → ASA | aB | a | SA | AS | S  u pode ser uma string de terminais e não-terminais;
S → ASA | aB | a
A→ B| S A→ B| S
 Esse processo é repetido até que não haja mais produções
B→b B→b
unitárias.

Forma Normal de Chomsky (FNC) Forma Normal de Chomsky (FNC)


Passo 3: Excluir todas as produções unitárias do tipo A → B; Passo 3: Excluir todas as produções unitárias do tipo A → B;
EXEMPLO: EXEMPLO:

 Excluir todas as produções unitárias do tipo A→B  Excluir todas as produções unitárias do tipo A→B
(1) antes (1) antes
S0 → S S0 → S
S → ASA | aB | a | SA | AS | S S → ASA | aB | a | SA | AS
A→ B| S A→ B| S
B→b B→b
(2) depois (2) depois
S0 → S S0 → ASA | aB | a | SA | AS
S → ASA | aB | a | SA | AS S → ASA | aB | a | SA | AS As produções de S são
A→ B| S A→ B| S adicionadas a S0
B→b B→b

Forma Normal de Chomsky (FNC) Forma Normal de Chomsky (FNC)


Passo 3: Excluir todas as produções unitárias do tipo A → B; Passo 3: Excluir todas as produções unitárias do tipo A → B;
EXEMPLO: EXEMPLO:

 Excluir todas as produções unitárias do tipo A→B  Excluir todas as produções unitárias do tipo A→B
(1) antes... (1)
S0 → ASA | aB | a | SA | AS S0 → ASA | aB | a | SA | AS
S → ASA | aB | a | SA | AS S → ASA | aB | a | SA | AS
A→B|S A→ S|b
B→b B→b
(3)
(2) Tirando o B... (3) finalmente... (2)
S0 → ASA | aB | a | SA | AS As produções de B são adicionadas a A S0 → ASA | aB | a | SA | AS As produções de S são adicionadas a A
S → ASA | aB | a | SA | AS S0 → ASA | aB | a | SA | AS S → ASA | aB | a | SA | AS S0 → ASA | aB | a | SA | AS
A→S S → ASA | aB | a | SA | AS A→b S → ASA | aB | a | SA | AS
B→b A→S|b B→b A → b | ASA | aB | a | SA | AS
B→b B→b
Forma Normal de Chomsky (FNC) Forma Normal de Chomsky (FNC)
Passo 4: converter as demais produções para a forma apropriada Passo 4: converter as demais produções para a forma apropriada
EXEMPLO:
 Substituímos cada produção da forma:
 Converter as demais produções para a forma apropriada
A → u1u2...uk, onde k>=3 e cada ui é um símbolo
terminal ou não-terminal, com as produções: (1) k ≥ 3
A → u1A1, A1 → u2A2, A2 → u3A3, ... S0 → ASA | aB | a | SA | AS
S → ASA | aB | a | SA | AS
A → b | ASA | aB | a | SA | AS
 E fazemos Ak-2 → uk-1uk
B→b
(2)
 Se k=2, substituímos qualquer terminal ui na
S0 → AA1 | aB | a | SA | AS
produção com uma nova variável Ui e a produção S → AA1 | aB | a | SA | AS
Ui → ui A → b | AA1 | aB | a | SA | AS
B→b
A1 → SA

Forma Normal de Chomsky (FNC) Exercício


Passo 4: converter as demais produções para a forma apropriada
 Responda a cada item para a seguinte gramática livre
EXEMPLO: do contexto G.
 Converter as demais produções para a forma apropriada
(1) k = 2 que tem símbolo terminal R → XRX | S
S0 → AA1 | aB | a | SA | AS S → aTb | bTa
S → AA1 | aB | a | SA | AS T → XTX | X | ε
A → b | AA1 | aB | a | SA | AS
B→b X→a|b
A1 → SA
a) Quais são as variáveis de G?
(2) S0 → AA1 | UB | a | SA | AS b) Quais são os terminais de G?
S → AA1 | UB | a | SA | AS c) Qual a variável inicial de G?
A → b | AA1 | UB | a | SA | AS Gramática final:
Forma Normal de Chomsky. d) Dê três cadeias em L(G).
B→b e) Dê três cadeias que não estão em L(G).
A1 → AS
f) Verdadeiro ou Falso: T ⇒ aba
U→a

Você também pode gostar