Ybadoo - Soluções em Software Livre
Tutoriais
Compiladores

Apresente a Análise Preditiva Tabular, com recuperação local de erros, da entrada (a (a; ); a) sobre a gramática a seguir.

G = ({S, L}, {a, ;, (, )}, P, S)
P = {S → (L) | a
LL;S | S}

 

1. Eliminação da recursividade à esquerda:

1.1. Simplificação da gramática livre de contexto:

G = ({S, L}, {a, ;, (, )}, P, S)
P = {S → (L) | a
LL;S | (L) | a}

1.2. Renomeação das variáveis em uma ordem crescente qualquer:

G = ({A, B}, {a, ;, (, )}, P, A)
P = {A → (B) | a
BB;A | (B) | a}

1.3. Transformação das produções da forma ArAsα, onde rs:

G = ({A, B}, {a, ;, (, )}, P, A)
P = {A → (B) | a
BB;A | (B) | a}

1.4. Exclusão das recursões da forma ArArα:

G = ({A, B, C}, {a, ;, (, )}, P, A)
P = {A → (B) | a
B → (B)C | aC | (B) | a
C → ;AC | ;A}

2. Fatoração a esquerda da gramática livre de contexto:

G = ({A, B, C, D}, {a, ;, (, )}, P, A)
P = {A → (B) | a
B → (B)D | aD
C → ;AD
DC | ε}

3. Conjuntos FIRST(α) e FOLLOW(A):

FIRST(A) = {a, (}
FIRST(B) = {a, (}
FIRST(C) = {;}
FIRST(D) = {;, ε}
FOLLOW(A) = {;, ), $}
FOLLOW(B) = {)}
FOLLOW(C) = {)}
FOLLOW(D) = {)}

4. Tabela de Análise Preditiva:

Tabela de análise preditiva da gramática G
 a;()$
AA → aerro 1A → (B)erro 1erro 1
BB → aDerro 1B → (B)Derro 1erro 1
C C → ;AD erro 1erro 1
DD → εDCD → εD → εD → ε
adesempilha    
; desempilha   
(  desempilha  
)erro 2erro 2erro 2desempilhaerro 2
$erro 3erro 3erro 3erro 3sucesso

erro 1 - insere o token a na entrada e emite a mensagem: operando esperado.

erro 2 - retira o token ) da pilha e emite a mensagem: parêntese direito esperado.

erro 3 - retira o token da entrada e emite a mensagem: fim de arquivo encontrado.

5. Analisador Preditivo Tabular:

Movimentos do analisador preditivo tabular para (a (a; ); a)
PilhaEntradaDerivação
$ A(a (a; ); a)$A → (B)
$ ) B ((a (a; ); a)$ 
$ ) Ba (a; ); a)$B → aD
$ ) D aa (a; ); a)$ 
$ ) D(a; ); a)$D → ε
$ )(a; ); a)$erro 2
$(a; ); a)$erro 3
$a; ); a)$erro 3
$; ); a)$erro 3
$); a)$erro 3
$; a)$erro 3
$a)$erro 3
$)$erro 3
$$aceita