terça-feira, 25 de maio de 2010

Problemas do Parser

No caminho de volta hoje pensei sobre o assunto que discutimos e cheguei a conclusão de que realmente pode dar problema. Caso a regra seja:

a{b*}{b*}bb → /1a/2

Podemos converter a regra para a gramática:

S → aG1G2bb
G1 → bG1 | ε
G2 → bG2 | ε

Simplificado:

S → aA
A → G1B
B → G2C
C → bD
D → b
G1 → bG1 | ε
G2 → bG2 | ε

Grupo FIRST:


First(S) = a
First(A) = b
First(B) = b
First(C) = b
First(D) = b
First(G1) = b, ε
First(G2) = b, ε

Grupo FOLLOW:


Follow(S) = #
Follow(A) = #
Follow(B) = #
Follow(C) = #
Follow(D) = #
Follow(G1) = b
Follow(G2) = b


Tabela de Parser:


S → aA
FIRST(aA FOLLOW(S)) = a

A → G1B
FIRST(G1B FOLLOW(A)) = {b, ε}{b}

B → G2C
FIRST(G2C FOLLOW(B)) = {b, ε}{b}

C → bD
FIRST(bD FOLLOW(C)) = b

D → b
FIRST(b FOLLOW(D)) = b

G1 → bG1
FIRST(bG1 FOLLOW(G1)) = b

G1 → ε
FIRST(ε FOLLOW(G1)) = {ε}{b}

G2 → bG2
FIRST(bG2 FOLLOW(G2)) = b

G2 → ε

FIRST(ε FOLLOW(G2)) = {ε}{b}


Podemos seguir a seguinte derivação com a cadeia abbb:

(abbb) S → aA
(bbb) A → G1B
(bbb) G1 → ε
(bbb) B → G2C
(bbb) G2 → ε
(bb) C → bD
(b) D → b

Ou seja, esta derivação não termina corretamente, logo temos que descartá-la. Caso fizéssemos uma tabela de parser LL 2, 3 ou maior, é possível fazer a derivação de forma determinística.
Temos que prever este tipo de derivações que não terminam corretamente e derivações diferentes também podem gerar as mesmas cadeias substituídas.

Pode-se perguntar então se é útil ter todo este trabalho para no final termos um parser não determinístico. Não me lembro agora qual, mas vi em um paper a informação de que sim. Mesmo que uma linguagem seja LL 2, 3, 4 é viável utilizar um parser LL(1) e tratar o não determinismo. Por outro lado, lá diz que é muito viável também utilizar um parser LL(1) ao invés de um parser simples não determinístico pois evitaria muitas derivações desnecessárias.

Nenhum comentário:

Postar um comentário