Ybadoo - Soluções em Software Livre
Tutoriais
Compiladores

Apresente a Análise Preditiva Tabular da entrada r1: se a_zero então vá_para r4 senão vá_para r2;r2:faça subtrair_a vá_para r3;r3:faça adicionar_b vá_para r1; sobre a gramática a seguir.

G = ({S, C, D, I, A, N, G}, {:, ;, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, r, faça, subtrair_a, adicionar_b, vá_para, se, a_zero, então, senão}, P, S)
P = { SC | S C
CA : D ; | A : I ;
D → faça subtrair_a vá_para A | faça adicionar_b vá_para A
I → se a_zero então vá_para A senão vá_para A
A → r N
NG | N G
G → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 }

 

1. Eliminação da recursividade à esquerda:

1.1. Simplificação da gramática livre de contexto:
G = ({S, C, D, I, A, N, G}, {:, ;, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, r, faça, subtrair_a, adicionar_b, vá_para, se, a_zero, então, senão}, P, S)
P = { SA : D ; | A : I ; | S C
CA : D ; | A : I ;
D → faça subtrair_a vá_para A | faça adicionar_b vá_para A
I → se a_zero então vá_para A senão vá_para A
A → r N
N → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | N G
G → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 }
1.2. Renomeação das variáveis em uma ordem crescente qualquer:
G = ({A, B, C, D, E, F, G}, {:, ;, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, r, faça, subtrair_a, adicionar_b, vá_para, se, a_zero, então, senão}, P, A)
P = { AE : C ; | E : D ; | A B
BE : C ; | E : D ;
C → faça subtrair_a vá_para E | faça adicionar_b vá_para E
D → se a_zero então vá_para E senão vá_para E
E → r F
F → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | F G
G → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 }
1.3. Transformação das produções da forma ArAsα, onde rs:
G = ({A, B, C, D, E, F, G}, {:, ;, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, r, faça, subtrair_a, adicionar_b, vá_para, se, a_zero, então, senão}, P, A)
P = { AE : C ; | E : D ; | A B
BE : C ; | E : D ;
C → faça subtrair_a vá_para E | faça adicionar_b vá_para E
D → se a_zero então vá_para E senão vá_para E
E → r F
F → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | F G
G → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 }
1.4. Exclusão das recursões da forma ArArα:
G = ({A, A1, B, C, D, E, F, F1, G}, {:, ;, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, r, faça, subtrair_a, adicionar_b, vá_para, se, a_zero, então, senão}, P, A)
P = { A E : C ; A1 | E : D ; A1
A1B A1 | ε
B E : C ; | E : D ;
C → faça subtrair_a vá_para E | faça adicionar_b vá_para E
D → se a_zero então vá_para E senão vá_para E
E → r F
F → 0 F1 | 1 F1 | 2 F1 | 3 F1 | 4 F1 | 5 F1 | 6 F1 | 7 F1 | 8 F1 | 9 F1
F1G F1 | ε
G → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 }

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

G = ({A, A1, A2, B, B1, C, C1, D, E, F, F1, G}, {:, ;, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, r, faça, subtrair_a, adicionar_b, vá_para, se, a_zero, então, senão}, P, A)
P = { A E : A2
A1B A1 | ε
A2C ; A1 | D ; A1
B E : B1
B1C ; | D ;
C → faça C1
C1 → subtrair_a vá_para E | adicionar_b vá_para E
D → se a_zero então vá_para E senão vá_para E
E → r F
F → 0 F1 | 1 F1 | 2 F1 | 3 F1 | 4 F1 | 5 F1 | 6 F1 | 7 F1 | 8 F1 | 9 F1
F1G F1 | ε
G → 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 }

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

FIRST(A)  = {r}
FIRST(A1) = {r, ε}
FIRST(A2) = {faça, se}
FIRST(B) = {r}
FIRST(B1) = {faça, se}
FIRST(C) = {faça}
FIRST(C1) = {subtrair_a, adicionar_b}
FIRST(D) = {se}
FIRST(E) = {r}
FIRST(F) = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
FIRST(F1) = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ε}
FIRST(G) = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
FOLLOW(A)  = {$}
FOLLOW(A1) = {$}
FOLLOW(A2) = {$}
FOLLOW(B) = {r, $}
FOLLOW(B1) = {r, $}
FOLLOW(C) = {;}
FOLLOW(C1) = {;}
FOLLOW(D) = {;}
FOLLOW(E) = {:, ;, senão}
FOLLOW(F) = {:, ;, senão}
FOLLOW(F1) = {:, ;, senão}
FOLLOW(G) = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, ;, senão}

4. Tabela de Análise Preditiva:

Tabela de análise preditiva da gramática G
 :;0..9rfaçasubtrair_aadicionar_bvá_parasea_zeroentãosenão$
A   E : A2         
A1   B A1        ε
A2    C ; A1   D ; A1    
B   E : B1         
B1    C ;   D ;    
C    faça C1        
C1     subtrair_a vá_para Eadicionar_b vá_para E      
D        se a_zero então vá_para E senão vá_para E    
E   r F         
F  0..9 F1          
F1εεG F1        ε 
G  0..9          

5. Analisador Preditivo Tabular:

Movimentos do analisador preditivo tabular para
r1: se a_zero então vá_para r4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1;
PilhaEntradaDerivação
$ Ar1: se a_zero então vá_para r4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
AE : A2
$ A2 : Er1: se a_zero então vá_para r4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
E → r F
$ A2 : F rr1: se a_zero então vá_para r4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A2 : F1: se a_zero então vá_para r4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
F → 1 F1
$ A2 : F1 11: se a_zero então vá_para r4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A2 : F1: se a_zero então vá_para r4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
F1 → ε
$ A2 :: se a_zero então vá_para r4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A2se a_zero então vá_para r4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
A2D ; A1
$ A1 ; Dse a_zero então vá_para r4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
D → se a_zero então vá_para E senão vá_para E
$ A1 ; E vá_para senão E vá_para então a_zero sese a_zero então vá_para r4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; E vá_para senão E vá_para então a_zeroa_zero então vá_para r4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; E vá_para senão E vá_para entãoentão vá_para r4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; E vá_para senão E vá_paravá_para r4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; E vá_para senão Er4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
E → r F
$ A1 ; E vá_para senão F rr4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; E vá_para senão F4 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
F → 4 F1
$ A1 ; E vá_para senão F1 44 senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; E vá_para senão F1senão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
F1 → ε
$ A1 ; E vá_para senãosenão vá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; E vá_paravá_para r2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; Er2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
E → r F
$ A1 ; F rr2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; F2;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
F → 2 F1
$ A1 ; F1 22;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; F1;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
F1 → ε
$ A1 ;;
r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1r2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
A1B A1
$ A1 Br2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
BE : B1
$ A1 B1 : Er2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
E → r F
$ A1 B1 : F rr2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 B1 : F2: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
F → 2 F1
$ A1 B1 : F1 22: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 B1 : F1: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
F1 → ε
$ A1 B1 :: faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 B1faça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
B1C ;
$ A1 ; Cfaça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
C → faça C1
$ A1 ; C1 façafaça subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; C1subtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
C1 → subtrair_a vá_para E
$ A1 ; E vá_para subtrair_asubtrair_a vá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; E vá_paravá_para r3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; Er3;
r3: faça adicionar_b vá_para r1; $
E → r F
$ A1 ; F rr3;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; F3;
r3: faça adicionar_b vá_para r1; $
F → 3 F1
$ A1 ; F1 33;
r3: faça adicionar_b vá_para r1; $
 
$ A1 ; F1;
r3: faça adicionar_b vá_para r1; $
F1 → ε
$ A1 ;;
r3: faça adicionar_b vá_para r1; $
 
$ A1r3: faça adicionar_b vá_para r1; $A1B A1
$ A1 Br3: faça adicionar_b vá_para r1; $BE : B1
$ A1 B1 : Er3: faça adicionar_b vá_para r1; $E → r F
$ A1 B1 : F rr3: faça adicionar_b vá_para r1; $ 
$ A1 B1 : F3: faça adicionar_b vá_para r1; $F → 3 F1
$ A1 B1 : F1 33: faça adicionar_b vá_para r1; $ 
$ A1 B1 : F1: faça adicionar_b vá_para r1; $F1 → ε
$ A1 B1 :: faça adicionar_b vá_para r1; $ 
$ A1 B1faça adicionar_b vá_para r1; $B1C ;
$ A1 ; Cfaça adicionar_b vá_para r1; $C → faça C1
$ A1 ; C1 façafaça adicionar_b vá_para r1; $ 
$ A1 ; C1adicionar_b vá_para r1; $C1 → adicionar_b vá_para E
$ A1 ; E vá_para adicionar_badicionar_b vá_para r1; $ 
$ A1 ; E vá_paravá_para r1; $ 
$ A1 ; Er1; $E → r F
$ A1 ; F rr1; $ 
$ A1 ; F1; $F → 1 F1
$ A1 ; F1 11; $ 
$ A1 ; F1; $F1 → ε
$ A1 ;; $ 
$ A1$A1 → ε
$$sucesso