Ybadoo - Soluções em Software Livre
Tutoriais
Compiladores

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

G = ({A, B, C}, {id, +, *, (, )}, P, A)
P = {AA+B | B
BB*C | C
C → (A) | id}

 

Eliminação de Recursividade à Esquerda:

G = ({A, A₁, B, B₁, C}, {id, +, *, (, )}, P, A)
P = {ABA₁
A₁ → +BA₁ | ε
BCB₁
B₁ → *CB₁ | ε
C → (A) | id}

Fatoração à Esquerda:

G = ({A, A₁, B, B₁, C}, {id, +, *, (, )}, P, A)
P = {ABA₁
A₁ → +BA₁ | ε
BCB₁
B₁ → *CB₁ | ε
C → (A) | id}

Conjuntos FIRST(α) e FOLLOW(A):

FIRST(A)  = {id, (}
FIRST(A₁) = {+, ε}
FIRST(B)  = {id, (}
FIRST(B₁) = {*, ε}
FIRST(C)  = {id, (}
FOLLOW(A)  = {), $}
FOLLOW(A₁) = {), $}
FOLLOW(B)  = {+, ), $}
FOLLOW(B₁) = {+, ), $}
FOLLOW(C)  = {+, *, ), $}

Tabela de Análise Preditiva:

Tabela de análise preditiva da gramática G
 id+*()$
AABA₁erro 1erro 1ABA₁erro 1erro 1
A₁A₁ → εA₁ → +BA₁A₁ → εA₁ → εA₁ → εA₁ → ε
BBCB₁erro 1erro 1BCB₁erro 1erro 1
B₁B₁ → εB₁ → εB₁ → *CB₁B₁ → εB₁ → εB₁ → ε
CC → iderro 1erro 1C → (A)erro 1erro 1
iddesempilha     
+ desempilha    
*  desempilha   
(   desempilha  
)erro 2erro 2erro 2erro 2desempilhaerro 2
$erro 3erro 3erro 3erro 3erro 3aceita

erro 1 - insere o token id 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.

Analisador Preditivo Tabular:

Movimentos do analisador preditivo tabular para id * (id id) * id
PilhaEntradaDerivação
$ Aid * (id id) * id $ABA₁
$ A₁ Bid * (id id) * id $BCB₁
$ A₁ B₁ cid * (id id) * id $C → id
$ A₁ B₁ idid * (id id) * id $ 
$ A₁ B₁* (id id) * id $B₁ → *CB₁
$ A₁ B₁ C ** (id id) * id $ 
$ A₁ B₁ C(id id) * id $C → (A)
$ A₁ B₁ ) A ((id id) * id $ 
$ A₁ B₁ ) Aid id) * id $ABA₁
$ A₁ B₁ ) A₁ Bid id) * id $BCB₁
$ A₁ B₁ ) A₁ B₁ Cid id) * id $C → id
$ A₁ B₁ ) A₁ B₁ idid id) * id $ 
$ A₁ B₁ ) A₁ B₁id) * id $B₁ → ε
$ A₁ B₁ ) A₁id) * id $A₁ → ε
$ A₁ B₁ )id) * id $erro 2
$ A₁ B₁id) * id $B₁ → ε
$ A₁id) * id $A₁ → ε
$id) * id $erro 3
$) * id $erro 3
$* id $erro 3
$id $erro 3
$$aceita