Você está na página 1de 29

Teoria da Computao e Compiladores

GLC Gramticas Livres de Contexto Continuao


Ricardo Oliveira ricardo@ffm.com.br

Forma Normal de Chomsky

s vezes conveniente ter GLCs em uma forma simplificada Uma das formas mais simples a Forma Normal de Chomsky Ela til para a construo de algoritmos que trabalham com gramticas livres de contexto

Forma Normal de Chomsky

Uma GLC est na Forma Normal de Chomsky se toda regra pertence a um dos formatos

A BC Aa

onde a um terminal qualquer e A, B e C so variveis quaisquer, exceto pelo fato de que B e C no podem ser variveis iniciais Permite-se tambm a regra S , onde S a varivel inicial

Forma Normal de Chomsky

Teorema

Qualquer linguagem livre de contexto pode ser gerada por uma gramtica na forma normal de Chomsky

Para provar isso, mostramos que qualquer GLC pode ser convertida na forma normal de Chomsky Essa converso tem vrios estgios em que as produes que violam as condies da forma normal so substitudas por outras que equivalentes que so satisfatrias

Forma Normal de Chomsky

Estgios da converso
1.
2. 3. 4.

Adicionar novo smbolo inicial Eliminar regras no formato A Eliminar regras no formato A B Converter as regras restantes nos formatos permitidos na forma normal de Chomsky

Forma Normal de Chomsky

Etapa 1:
Adicionar novo smbolo inicial S0 e a regra S0 S, onde S o smbolo inicial original Isso garante que o smbolo inicial no ocorra no lado direito de nenhuma regra.

Forma Normal de Chomsky

Etapa 2:
Remover uma regra A , onde A no a varivel inicial Para cada ocorrncia de A do lado direito de alguma regra, gera-se uma nova com aquela ocorrncia excluda Assim, se h uma regra R uAv, onde u e v so strings de variveis e terminais, adicionamos a regra R uv Isso feito para cada ocorrncia de A, ou seja, a regra R uAvAw gera trs novas regras R uvAw, R uAvw, R uvw Se houver a regra R A, adicionamos R , a no ser que esta regra tenha sido removida previamente Repetir at remover todas as -rules

Forma Normal de Chomsky

Etapa 3:
Remover uma regra unitria no formato A B Toda vez que houver uma regra B u, adicionamos a regra A u, a menos que esta regra tenha sido removida previamente Repetir at remover todas as regras unitrias

Forma Normal de Chomsky

Etapa 4:
Converter as regras remanescentes em regras nos formatos adequados Substitui-se cada regra no formato A u1u2...uk, com k 3 e cada u uma varivel ou terminal, pelas regras A u1A1, A1 u2A2, A2 u3A3, ..., Ak-2 uk-1uk Os Ais so novas variveis Se k 2, substitui-se qualquer terminal ui nas regras anteriores por uma nova varivel Ui, e adiciona-se a regra Ui ui

Exemplo

Converter a GLC a seguir para a forma normal de Chomsky


S ASA | aB AB|S Bb|

As regras em cinza acabaram de ser removias, as regras em azul, acabaram de ser adicionadas

Exemplo

Adicionar novo estado inicial


SX X AXA | aB AB|X Bb|

Exemplo

Eliminar B
SX X AXA | aB | a AB|X| Bb|

Exemplo

Eliminar A
SX X AXA | aB | a | XA | AX | X AB|X| Bb

Exemplo

Eliminar X X
SX X AXA | aB | a | XA | AX | X AB|X Bb

A remoo acrescentaria novamente a regra X X, mas no acrescentamos regras removidas previamente

Exemplo

Eliminar S X
S X | AXA | aB | a | XA | AX X AXA | aB | a | XA | AX AB|X Bb

Exemplo

Eliminar A B
S AXA | aB | a | XA | AX X AXA | aB | a | XA | AX AB|X|b Bb

Exemplo

Eliminar A X
S AXA | aB | a | XA | AX X AXA | aB | a | XA | AX A X | b | AXA | aB | a | XA | AX Bb

Exemplo

Dividir regras com mais de dois smbolos


S AC | aB | a | XA | AX X AC | aB | a | XA | AX A b | AC | aB | a | XA | AX C XA Bb

Exemplo

Substituir terminais em regras em que eles no aparecem sozinhos


S AC | UB | a | XA | AX X AC | UB | a | XA | AX A b | AC | UB | a | XA | AX C XA Ua Bb

Exemplo

Gramtica na forma normal de Chomsky


S AC | UB | a | XA | AX X AC | UB | a | XA | AX A b | AC | UB | a | XA | AX C XA Ua Bb

Exerccio

Converter a gramtica a seguir para a forma normal de Chomsky


A B1B B 0B1 | 1B0 | B1 |

Ambigidade

Uma gramtica G dita ambgua se L(G) contm ao menos uma sentena para a qual existe mais do que uma rvore de derivao Isso indesejvel em certas aplicaes, como linguagens de programao, onde qualquer programa deve ter uma nica interpretao Considere a gramtica G = ({E},{a,b,+,*,(,)},P,E) onde P a regra

E E+E|E*E|(E)|a|b

Considere a sentena w = a + b * a.

Ambigidade

Duas derivaes possveis para w so


(1) E => E + E => a + E => a + E * E => a + b * E => a + b * a (2) E => E * E => E + E * E => a + E * E => a + b * E => a + b * a

Suas rvores de derivao so:

Ambigidade

A rvore (1) representa a + b * a como soma de duas subexpresses A rvore (2) representa a + b * a como produto de duas subexpresses

Ambigidade

Considere a gramtica anterior e a sentena z = a + a + a Duas derivaes possveis para z so


(1) E => E + E => E + E + E => a + E +E => a + a + E => a + a + a (2) E => E + E => E + E + E => E + E + a => E + a + a => a + a + a

Ambigidade

A rvore (1), obtida atravs da derivao mais esquerda, representa a + a + a como (a+a) + a A rvore (2), obtida atravs da derivao mais direita, representa a + a + a como a + (a+a)

Ambigidade

Causas da ambigidade de G

G no indica a precedncia entre os operadores + e * (multiplicao tem precedncia maior) G no estabelece associatividade para os operadores (normalmente + e * estabelecem associatividade a esquerda)

Ambigidade

Soluo: reescrever a gramtica


G1 = ({E,T,F}, {a,b,+,*,(,)}, P1, E) P1: E E + T | T TT*F|F F (E) | a | b

O uso dos no-terminais E, T e F estabelece precedncia entre os operadores A recursividade a esquerda (E E + T e T T * F) estabelece a associatividade a esquerda

Autmatos de Pilha

Os autmatos de pilha (Pushdown Automata) so a classe de autmatos capazes de reconhecer as mesmas linguagens que as gramticas livres de contexto No sero estudados neste momento do curso

Você também pode gostar