22
Análise •Dada uma cadeia de terminais w, queremos saber se wL(G) ou não. •Se for o caso, poderemos querer achar uma derivação de w. •Um algoritmo que pode nos dizer se wL(G) é um algoritmo de pertinência •o termo análise descreve o modo de achar uma sequência de produções pela qual é derivada wL(G).

Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Embed Size (px)

Citation preview

Page 1: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Análise•Dada uma cadeia de terminais w, queremos saber se wL(G) ou não.•Se for o caso, poderemos querer achar uma derivação de w.•Um algoritmo que pode nos dizer se wL(G) é um algoritmo de pertinência•o termo análise descreve o modo de achar uma sequência de produções pela qual é derivada wL(G).

Page 2: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

• análise óbvia se w está L(G): – construir todas as possíveis (e.g. as mais à

esquerda) derivações e verificar se al-guma coincide com W.

• análise de pesquisa exaustiva• Problemas:

– não é eficiente;– é possível que ele nunca termine wL(G).

Por cause de produções da forma

AB e A

Page 3: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Ambigüidade

•Uma gramática livre de contexto G é ambígua se existe wL(G) com no mí-nimo duas árvores de derivação.

•ambiguidade a existência de ≥2 derivações à esquerda e à direita.

Page 4: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Exemplo: A gramática com produções SaSb | SS | é ambígua.

• aabb tem duas árvores de derivação:

S

a S

Sa

b

b

S

S

S

bSa

Sa b

Page 5: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Soluções

•Re-escrever a gramática tal que exista somente uma análise possível;

•Associar regras de precedência (como feito em LP com os + e *)– Esta solução está completamente fora da

gramática.

•existem exemplos onde é impossível remover a ambiguidade da gramática.

Page 6: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Abigüidade Inerentenão-ambígua:• existe uma gramática para L que é não-

ambígua;

inerentemente ambígua.se toda gramática para L é ambígua.e.g.:

L={anbncm|n,m>0}{anbmcm|n,m>0}

Page 7: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Formas Normais

•A definição de uma GLC não impõe qualquer restrição no lado direito de uma produção.•Em muitas situações (aplicações) é desejável colocar restrições.•Estudaremos métodos de transformar uma GLC arbitrária numa equivalente que satisfaz certas restrições sobre sua forma.

Page 8: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Forma Normal de Chomsky

Uma gramática livre de contexto está na forma normal de Chomsky se todas as produções são da forma

ABC ou Aa onde A, B, C V e a T.

Page 9: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Forma Normal de Greibach

Uma gramática livre de contexto está na forma normal de Greibach se todas as produções tem a forma

Aa B1 B2…Bk

para k0, com A, B1, BkV e aT.

Page 10: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Teorema de Normalização

Teorema:Para toda GLC G, existe uma GLC G’ na

forma normal de Chomsky e uma GLC G’’ na forma normal de Greibach tal que

L(G’’)=L(G’)=L(G) - { }

Page 11: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Remoção de Produções Unitárias AB e -Produções

Lema: Para qualquer GLC G=(N, , P, S), exis-te uma GLC G’ sem -produção e sem produção unitária tq L(G’)=L(G) - {}.

Page 12: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Prova

Seja P^ o menor conjunto de produ-ções contendo P e fechado sobre as duas regras:

(a)Se AB P^ e B P^, então

A P^ (b)Se AB P^ e B P^, então

A P^

Page 13: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

•Podemos construir P^ indutivamen-te de P adicionando produções para satisfazer (a) e (b).•Seja G^ a gramática G^=(N, , P^, S) como P P^:

– L(G) L(G^), obviamente!– mas L(G)=L (G^), porque cada nova

produção adicionada pode ser simula-da pela produção que a adicionou.

Page 14: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Agora mostramos que para cada cadeias não nulas x, qualquer derivação S*

G^ x de tamanho

mínimo não usa -produção nem produção unitária.

• Seja x considere a derivação de tamanho mínimo S*

G^ x. Suponha

para a contradição que A é usada em algum ponto da derivação S*A *x com ou não nulo.

Page 15: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

•esta ocorrência de A aparece na derivação quando uma produção da forma B A é aplicada:Sm B A n A *x para algum m,n,k0.

•Mas pela regra (a) B está tam-bém em P^, e esta produção poderia ter sido usada neste ponto dando uma derivação menor de x:

SmB n kxabsurdo!

Page 16: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Um argumento similar mostra que produções unitárias não são usadas em derivações de tamanho mínimo.

Seja x e considere a derivação de tamanho mínimo S*

G^ x. Suponha que AB é usada em algum mo-mento

S*A B *x.a ocorrência de B desaparece apli-cando a produção B mais tarde:

SmA Bn B kx

Page 17: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

• Mas pela regra (b), A está também em P^ e esta produção poderia ter sido usada dando uma derivação menor para x: SmA n kx

• Isto contradiz o tamanho mínimo da derivação.

Logo as -produções e produções unitárias podem ser descartadas!

qed

Page 18: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Transformando para a forma normal de Chomsky.

SPG só consideraremos gramáticas sem - produções e produções unitá-rias:•Para cada a, introduza um novo não terminal Aa e a produção Aa a, e troque todas as ocorrências de a no lado direito das antigas regras (exceto das regras de forma B a) por Aa.

Page 19: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

•Então todas as produções são de uma das duas formas

Aa ou AB1B2…Bk, k2

onde os Bi são não terminais.

•O conjunto de cadeias terminais não muda, somente temos mais um passo(que antes)para gerar um sím-bolo terminal.

Page 20: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

• Para qualquer produção A B1B2. …Bk com K>2, introduza um novo não terminal C e troque esta produção por duas

A B1C e C B2B3 …Bk ..

• Continue fazendo estas trocas até que todos os lados direitos tenham tamanho no máximo 2.

Page 21: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

Exemplo

Derive a gramática na forma normal de Chomsky para o conjunto

{anbn | n0} - {} = {anbn | n 1}. •pegue gramática para {anbn | n0} :

SaSb|•Removendo as - produções temos:

S aSb | ab que gera {anbn | n 1}.

Page 22: Análise Dada uma cadeia de terminais w, queremos saber se w L(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode

• Adicionamos não-terminais A, B e trocamos as produções para:

S ASB| AB A a B b• Adicionamos um não-terminal C e

trocamos B ASB por S AC C SB.

A gramática na forma normal de Chomsky é

S AB|AC A a B b C SB