diff --git a/MEPA b/MEPA
index dd41d3f02a140ad26d914284dcd89eb1f12a7a5d..4c145d867255a722b297b6e5777dd85f14ec8e34 100644
--- a/MEPA
+++ b/MEPA
@@ -1,49 +1,15 @@
      INPP
-     AMEM 2
-     LEIT
-     ARMZ 0,1
-     CRCT 0
-     ARMZ 0,0
-R00: NADA 
-     CRVL 0,0
-     CRVL 0,1
-     CMME
-     DSVF R01
-     CRVL 0,0
-     CRCT 2
-     DIVI
-     CRCT 2
-     MULT
-     CRVL 0,0
-     CMIG
-     DSVF R02
-     CRVL 0,0
-     IMPR
-     CRCT 0
-     IMPR
-     CRVL 0,0
-     CRCT 0
-     CMIG
-     DSVF R04
-     CRCT 2
-     IMPR
-     DSVS R05
-R04: NADA 
-     CRCT 3
-     IMPR
-R05: NADA 
-     DSVS R03
-R02: NADA 
-     CRVL 0,0
-     IMPR
-     CRCT 1
-     IMPR
-R03: NADA 
-     CRVL 0,0
-     CRCT 1
-     SOMA
-     ARMZ 0,0
+     AMEM 1
      DSVS R00
-R01: NADA 
+R01: ENPR 1 
+     AMEM 1
+     DSVS R02
+R02: NADA 
+     CRCT 3
+     ARMZ 1,1
      DMEM 2
+R00: NADA 
+     CRCT 8
+     ARMZ 0,0
+     DMEM 0
      PARA
diff --git a/compilador b/compilador
index dec53b9f92a3cf7349e7606481764fe2e37bab4f..fc42e009c85e53b9b110f44d7c8229b032d97328 100755
Binary files a/compilador and b/compilador differ
diff --git a/compilador.output b/compilador.output
index da63078abfaeb69e3ecec255d805ec97b69f3e7b..903e78d82b740fe99001e59ba71e3f2577130750 100644
--- a/compilador.output
+++ b/compilador.output
@@ -9,7 +9,7 @@ Terminais sem uso na gramática
     NOT
 
 
-Estado 61 conflitos: 1 de redução/redução
+Estado 70 conflitos: 1 de redução/redução
 
 
 Gramática
@@ -20,107 +20,113 @@ Gramática
 
     2 programa: $@1 PROGRAM IDENT ABRE_PARENTESES lista_idents FECHA_PARENTESES PONTO_E_VIRGULA bloco PONTO
 
-    3 bloco: parte_declara_rotulos parte_declara_vars parte_declara_subrotinas comando_composto
+    3 $@2: ε
 
-    4 parte_declara_rotulos: LABEL VIRGULA
-    5                      | ε
+    4 $@3: ε
 
-    6 parte_declara_vars: var
+    5 bloco: parte_declara_rotulos parte_declara_vars $@2 parte_declara_subrotinas $@3 comando_composto
 
-    7 $@2: ε
+    6 parte_declara_rotulos: LABEL VIRGULA
+    7                      | ε
 
-    8 var: $@2 VAR declara_vars
-    9    | ε
+    8 parte_declara_vars: var
 
-   10 declara_vars: declara_vars declara_var
-   11             | declara_var
+    9 $@4: ε
 
-   12 $@3: ε
+   10 var: $@4 VAR declara_vars
+   11    | ε
 
-   13 $@4: ε
+   12 declara_vars: declara_vars declara_var
+   13             | declara_var
 
-   14 declara_var: $@3 lista_id_var DOIS_PONTOS tipo $@4 PONTO_E_VIRGULA
+   14 $@5: ε
 
-   15 tipo: IDENT
+   15 $@6: ε
 
-   16 lista_id_var: lista_id_var VIRGULA IDENT
-   17             | IDENT
+   16 declara_var: $@5 lista_id_var DOIS_PONTOS tipo $@6 PONTO_E_VIRGULA
 
-   18 lista_idents: lista_idents VIRGULA IDENT
+   17 tipo: IDENT
+
+   18 lista_id_var: lista_id_var VIRGULA IDENT
    19             | IDENT
 
-   20 parte_declara_subrotinas: declaracao_procedimento
+   20 lista_idents: lista_idents VIRGULA IDENT
+   21             | IDENT
+
+   22 parte_declara_subrotinas: parte_declara_subrotinas declaracao_procedimento
+   23                         | ε
 
-   21 declaracao_procedimento: PROCEDURE IDENT
-   22                        | ε
+   24 $@7: ε
 
-   23 comando_composto: T_BEGIN comandos T_END
+   25 declaracao_procedimento: PROCEDURE IDENT $@7 PONTO_E_VIRGULA bloco
 
-   24 comandos: comando PONTO_E_VIRGULA comandos
-   25         | comando PONTO_E_VIRGULA
-   26         | ε
+   26 comando_composto: T_BEGIN comandos T_END
 
-   27 comando: numero DOIS_PONTOS comando_sem_rotulo
-   28        | comando_sem_rotulo
+   27 comandos: comando PONTO_E_VIRGULA comandos
+   28         | comando PONTO_E_VIRGULA
+   29         | ε
 
-   29 comando_sem_rotulo: atribuicao
-   30                   | comando_composto
-   31                   | comando_condicional
-   32                   | comando_repetitivo
-   33                   | leitura
-   34                   | escrita
+   30 comando: numero DOIS_PONTOS comando_sem_rotulo
+   31        | comando_sem_rotulo
 
-   35 leitura: READ ABRE_PARENTESES lista_leituras FECHA_PARENTESES
+   32 comando_sem_rotulo: atribuicao
+   33                   | comando_composto
+   34                   | comando_condicional
+   35                   | comando_repetitivo
+   36                   | leitura
+   37                   | escrita
 
-   36 lista_leituras: lista_leituras VIRGULA simb_leitura
-   37               | simb_leitura
+   38 leitura: READ ABRE_PARENTESES lista_leituras FECHA_PARENTESES
 
-   38 simb_leitura: IDENT
+   39 lista_leituras: lista_leituras VIRGULA simb_leitura
+   40               | simb_leitura
 
-   39 escrita: WRITE ABRE_PARENTESES lista_escritas FECHA_PARENTESES
+   41 simb_leitura: IDENT
 
-   40 lista_escritas: lista_escritas VIRGULA expressao_simples
-   41               | expressao_simples
+   42 escrita: WRITE ABRE_PARENTESES lista_escritas FECHA_PARENTESES
 
-   42 expressao: expressao IGUAL expressao_simples
-   43          | expressao DIFERENTE expressao_simples
-   44          | expressao MENOR expressao_simples
-   45          | expressao MENOR_IGUAL expressao_simples
-   46          | expressao MAIOR expressao_simples
-   47          | expressao MAIOR_IGUAL expressao_simples
-   48          | expressao_simples
+   43 lista_escritas: lista_escritas VIRGULA expressao_simples
+   44               | expressao_simples
 
-   49 expressao_simples: expressao_simples MAIS termo
-   50                  | expressao_simples MENOS termo
-   51                  | termo
+   45 expressao: expressao IGUAL expressao_simples
+   46          | expressao DIFERENTE expressao_simples
+   47          | expressao MENOR expressao_simples
+   48          | expressao MENOR_IGUAL expressao_simples
+   49          | expressao MAIOR expressao_simples
+   50          | expressao MAIOR_IGUAL expressao_simples
+   51          | expressao_simples
 
-   52 termo: termo ASTERISCO fator
-   53      | termo DIV fator
-   54      | fator
+   52 expressao_simples: expressao_simples MAIS termo
+   53                  | expressao_simples MENOS termo
+   54                  | termo
 
-   55 $@5: ε
+   55 termo: termo ASTERISCO fator
+   56      | termo DIV fator
+   57      | fator
 
-   56 atribuicao: IDENT $@5 ATRIBUICAO expressao_simples
+   58 $@8: ε
 
-   57 fator: IDENT
-   58      | NUMERO
+   59 atribuicao: IDENT $@8 ATRIBUICAO expressao_simples
 
-   59 numero: NUMERO
+   60 fator: IDENT
+   61      | NUMERO
 
-   60 $@6: ε
+   62 numero: NUMERO
 
-   61 $@7: ε
+   63 $@9: ε
 
-   62 comando_repetitivo: $@6 WHILE expressao DO $@7 comando_sem_rotulo
+   64 $@10: ε
 
-   63 comando_condicional: if_then cond_else
+   65 comando_repetitivo: $@9 WHILE expressao DO $@10 comando_sem_rotulo
 
-   64 cond_else: ELSE comando_sem_rotulo
-   65          | ε
+   66 comando_condicional: if_then cond_else
 
-   66 $@8: ε
+   67 cond_else: ELSE comando_sem_rotulo
+   68          | ε
 
-   67 if_then: IF expressao $@8 THEN comando_sem_rotulo
+   69 $@11: ε
+
+   70 if_then: IF expressao $@11 THEN comando_sem_rotulo
 
 
 Terminais, com as regras onde eles aparecem
@@ -128,44 +134,44 @@ Terminais, com as regras onde eles aparecem
     $end (0) 0
     error (256)
     PROGRAM (258) 2
-    ABRE_PARENTESES (259) 2 35 39
-    FECHA_PARENTESES (260) 2 35 39
-    VIRGULA (261) 4 16 18 36 40
-    PONTO_E_VIRGULA (262) 2 14 24 25
-    DOIS_PONTOS (263) 14 27
+    ABRE_PARENTESES (259) 2 38 42
+    FECHA_PARENTESES (260) 2 38 42
+    VIRGULA (261) 6 18 20 39 43
+    PONTO_E_VIRGULA (262) 2 16 25 27 28
+    DOIS_PONTOS (263) 16 30
     PONTO (264) 2
-    T_BEGIN (265) 23
-    T_END (266) 23
-    VAR (267) 8
-    IDENT (268) 2 15 16 17 18 19 21 38 56 57
-    ATRIBUICAO (269) 56
-    LABEL (270) 4
+    T_BEGIN (265) 26
+    T_END (266) 26
+    VAR (267) 10
+    IDENT (268) 2 17 18 19 20 21 25 41 59 60
+    ATRIBUICAO (269) 59
+    LABEL (270) 6
     TYPE (271)
     ARRAY (272)
-    PROCEDURE (273) 21
+    PROCEDURE (273) 25
     FUNCTION (274)
     GOTO (275)
-    IF (276) 67
-    THEN (277) 67
-    ELSE (278) 64
-    WHILE (279) 62
-    DO (280) 62
+    IF (276) 70
+    THEN (277) 70
+    ELSE (278) 67
+    WHILE (279) 65
+    DO (280) 65
     OR (281)
-    DIV (282) 53
+    DIV (282) 56
     AND (283)
     NOT (284)
-    IGUAL (285) 42
-    DIFERENTE (286) 43
-    MENOR_IGUAL (287) 45
-    MAIOR_IGUAL (288) 47
-    MENOR (289) 44
-    MAIOR (290) 46
-    MAIS (291) 49
-    MENOS (292) 50
-    ASTERISCO (293) 52
-    NUMERO (294) 58 59
-    READ (295) 35
-    WRITE (296) 39
+    IGUAL (285) 45
+    DIFERENTE (286) 46
+    MENOR_IGUAL (287) 48
+    MAIOR_IGUAL (288) 50
+    MENOR (289) 47
+    MAIOR (290) 49
+    MAIS (291) 52
+    MENOS (292) 53
+    ASTERISCO (293) 55
+    NUMERO (294) 61 62
+    READ (295) 38
+    WRITE (296) 42
     LOWER_THAN_ELSE (297)
 
 
@@ -180,116 +186,125 @@ Não terminais com as regras onde eles aparecem
         à esquerda: 1
         à direita: 2
     bloco (46)
+        à esquerda: 5
+        à direita: 2 25
+    $@2 (47)
         à esquerda: 3
-        à direita: 2
-    parte_declara_rotulos (47)
-        à esquerda: 4 5
-        à direita: 3
-    parte_declara_vars (48)
-        à esquerda: 6
-        à direita: 3
-    var (49)
-        à esquerda: 8 9
-        à direita: 6
-    $@2 (50)
-        à esquerda: 7
-        à direita: 8
-    declara_vars (51)
+        à direita: 5
+    $@3 (48)
+        à esquerda: 4
+        à direita: 5
+    parte_declara_rotulos (49)
+        à esquerda: 6 7
+        à direita: 5
+    parte_declara_vars (50)
+        à esquerda: 8
+        à direita: 5
+    var (51)
         à esquerda: 10 11
-        à direita: 8 10
-    declara_var (52)
+        à direita: 8
+    $@4 (52)
+        à esquerda: 9
+        à direita: 10
+    declara_vars (53)
+        à esquerda: 12 13
+        à direita: 10 12
+    declara_var (54)
+        à esquerda: 16
+        à direita: 12 13
+    $@5 (55)
         à esquerda: 14
-        à direita: 10 11
-    $@3 (53)
-        à esquerda: 12
-        à direita: 14
-    $@4 (54)
-        à esquerda: 13
-        à direita: 14
-    tipo (55)
+        à direita: 16
+    $@6 (56)
         à esquerda: 15
-        à direita: 14
-    lista_id_var (56)
-        à esquerda: 16 17
-        à direita: 14 16
-    lista_idents (57)
+        à direita: 16
+    tipo (57)
+        à esquerda: 17
+        à direita: 16
+    lista_id_var (58)
         à esquerda: 18 19
-        à direita: 2 18
-    parte_declara_subrotinas (58)
-        à esquerda: 20
-        à direita: 3
-    declaracao_procedimento (59)
-        à esquerda: 21 22
-        à direita: 20
-    comando_composto (60)
-        à esquerda: 23
-        à direita: 3 30
-    comandos (61)
-        à esquerda: 24 25 26
-        à direita: 23 24
-    comando (62)
-        à esquerda: 27 28
-        à direita: 24 25
-    comando_sem_rotulo (63)
-        à esquerda: 29 30 31 32 33 34
-        à direita: 27 28 62 64 67
-    leitura (64)
-        à esquerda: 35
-        à direita: 33
-    lista_leituras (65)
-        à esquerda: 36 37
-        à direita: 35 36
-    simb_leitura (66)
+        à direita: 16 18
+    lista_idents (59)
+        à esquerda: 20 21
+        à direita: 2 20
+    parte_declara_subrotinas (60)
+        à esquerda: 22 23
+        à direita: 5 22
+    declaracao_procedimento (61)
+        à esquerda: 25
+        à direita: 22
+    $@7 (62)
+        à esquerda: 24
+        à direita: 25
+    comando_composto (63)
+        à esquerda: 26
+        à direita: 5 33
+    comandos (64)
+        à esquerda: 27 28 29
+        à direita: 26 27
+    comando (65)
+        à esquerda: 30 31
+        à direita: 27 28
+    comando_sem_rotulo (66)
+        à esquerda: 32 33 34 35 36 37
+        à direita: 30 31 65 67 70
+    leitura (67)
         à esquerda: 38
-        à direita: 36 37
-    escrita (67)
-        à esquerda: 39
-        à direita: 34
-    lista_escritas (68)
-        à esquerda: 40 41
+        à direita: 36
+    lista_leituras (68)
+        à esquerda: 39 40
+        à direita: 38 39
+    simb_leitura (69)
+        à esquerda: 41
         à direita: 39 40
-    expressao (69)
-        à esquerda: 42 43 44 45 46 47 48
-        à direita: 42 43 44 45 46 47 62 67
-    expressao_simples (70)
-        à esquerda: 49 50 51
-        à direita: 40 41 42 43 44 45 46 47 48 49 50 56
-    termo (71)
+    escrita (70)
+        à esquerda: 42
+        à direita: 37
+    lista_escritas (71)
+        à esquerda: 43 44
+        à direita: 42 43
+    expressao (72)
+        à esquerda: 45 46 47 48 49 50 51
+        à direita: 45 46 47 48 49 50 65 70
+    expressao_simples (73)
         à esquerda: 52 53 54
-        à direita: 49 50 51 52 53
-    atribuicao (72)
-        à esquerda: 56
-        à direita: 29
-    $@5 (73)
-        à esquerda: 55
-        à direita: 56
-    fator (74)
-        à esquerda: 57 58
-        à direita: 52 53 54
-    numero (75)
+        à direita: 43 44 45 46 47 48 49 50 51 52 53 59
+    termo (74)
+        à esquerda: 55 56 57
+        à direita: 52 53 54 55 56
+    atribuicao (75)
         à esquerda: 59
-        à direita: 27
-    comando_repetitivo (76)
-        à esquerda: 62
         à direita: 32
-    $@6 (77)
-        à esquerda: 60
-        à direita: 62
-    $@7 (78)
-        à esquerda: 61
-        à direita: 62
-    comando_condicional (79)
+    $@8 (76)
+        à esquerda: 58
+        à direita: 59
+    fator (77)
+        à esquerda: 60 61
+        à direita: 55 56 57
+    numero (78)
+        à esquerda: 62
+        à direita: 30
+    comando_repetitivo (79)
+        à esquerda: 65
+        à direita: 35
+    $@9 (80)
         à esquerda: 63
-        à direita: 31
-    cond_else (80)
-        à esquerda: 64 65
-        à direita: 63
-    if_then (81)
-        à esquerda: 67
-        à direita: 63
-    $@8 (82)
+        à direita: 65
+    $@10 (81)
+        à esquerda: 64
+        à direita: 65
+    comando_condicional (82)
         à esquerda: 66
-        à direita: 67
+        à direita: 34
+    cond_else (83)
+        à esquerda: 67 68
+        à direita: 66
+    if_then (84)
+        à esquerda: 70
+        à direita: 66
+    $@11 (85)
+        à esquerda: 69
+        à direita: 70
 
 
 Estado 0
@@ -348,15 +363,15 @@ Estado 6
 
 Estado 7
 
-   19 lista_idents: IDENT •
+   21 lista_idents: IDENT •
 
-    $padrão  reduzir usando a regra 19 (lista_idents)
+    $padrão  reduzir usando a regra 21 (lista_idents)
 
 
 Estado 8
 
     2 programa: $@1 PROGRAM IDENT ABRE_PARENTESES lista_idents • FECHA_PARENTESES PONTO_E_VIRGULA bloco PONTO
-   18 lista_idents: lista_idents • VIRGULA IDENT
+   20 lista_idents: lista_idents • VIRGULA IDENT
 
     FECHA_PARENTESES  deslocar, e ir ao estado 9
     VIRGULA           deslocar, e ir ao estado 10
@@ -371,7 +386,7 @@ Estado 9
 
 Estado 10
 
-   18 lista_idents: lista_idents VIRGULA • IDENT
+   20 lista_idents: lista_idents VIRGULA • IDENT
 
     IDENT  deslocar, e ir ao estado 12
 
@@ -382,7 +397,7 @@ Estado 11
 
     LABEL  deslocar, e ir ao estado 13
 
-    $padrão  reduzir usando a regra 5 (parte_declara_rotulos)
+    $padrão  reduzir usando a regra 7 (parte_declara_rotulos)
 
     bloco                  ir ao estado 14
     parte_declara_rotulos  ir ao estado 15
@@ -390,14 +405,14 @@ Estado 11
 
 Estado 12
 
-   18 lista_idents: lista_idents VIRGULA IDENT •
+   20 lista_idents: lista_idents VIRGULA IDENT •
 
-    $padrão  reduzir usando a regra 18 (lista_idents)
+    $padrão  reduzir usando a regra 20 (lista_idents)
 
 
 Estado 13
 
-    4 parte_declara_rotulos: LABEL • VIRGULA
+    6 parte_declara_rotulos: LABEL • VIRGULA
 
     VIRGULA  deslocar, e ir ao estado 16
 
@@ -411,21 +426,21 @@ Estado 14
 
 Estado 15
 
-    3 bloco: parte_declara_rotulos • parte_declara_vars parte_declara_subrotinas comando_composto
+    5 bloco: parte_declara_rotulos • parte_declara_vars $@2 parte_declara_subrotinas $@3 comando_composto
 
-    VAR      reduzir usando a regra 7 ($@2)
-    $padrão  reduzir usando a regra 9 (var)
+    VAR      reduzir usando a regra 9 ($@4)
+    $padrão  reduzir usando a regra 11 (var)
 
     parte_declara_vars  ir ao estado 18
     var                 ir ao estado 19
-    $@2                 ir ao estado 20
+    $@4                 ir ao estado 20
 
 
 Estado 16
 
-    4 parte_declara_rotulos: LABEL VIRGULA •
+    6 parte_declara_rotulos: LABEL VIRGULA •
 
-    $padrão  reduzir usando a regra 4 (parte_declara_rotulos)
+    $padrão  reduzir usando a regra 6 (parte_declara_rotulos)
 
 
 Estado 17
@@ -437,1000 +452,1047 @@ Estado 17
 
 Estado 18
 
-    3 bloco: parte_declara_rotulos parte_declara_vars • parte_declara_subrotinas comando_composto
+    5 bloco: parte_declara_rotulos parte_declara_vars • $@2 parte_declara_subrotinas $@3 comando_composto
 
-    PROCEDURE  deslocar, e ir ao estado 21
+    $padrão  reduzir usando a regra 3 ($@2)
 
-    $padrão  reduzir usando a regra 22 (declaracao_procedimento)
-
-    parte_declara_subrotinas  ir ao estado 22
-    declaracao_procedimento   ir ao estado 23
+    $@2  ir ao estado 21
 
 
 Estado 19
 
-    6 parte_declara_vars: var •
+    8 parte_declara_vars: var •
 
-    $padrão  reduzir usando a regra 6 (parte_declara_vars)
+    $padrão  reduzir usando a regra 8 (parte_declara_vars)
 
 
 Estado 20
 
-    8 var: $@2 • VAR declara_vars
+   10 var: $@4 • VAR declara_vars
 
-    VAR  deslocar, e ir ao estado 24
+    VAR  deslocar, e ir ao estado 22
 
 
 Estado 21
 
-   21 declaracao_procedimento: PROCEDURE • IDENT
+    5 bloco: parte_declara_rotulos parte_declara_vars $@2 • parte_declara_subrotinas $@3 comando_composto
+
+    $padrão  reduzir usando a regra 23 (parte_declara_subrotinas)
 
-    IDENT  deslocar, e ir ao estado 25
+    parte_declara_subrotinas  ir ao estado 23
 
 
 Estado 22
 
-    3 bloco: parte_declara_rotulos parte_declara_vars parte_declara_subrotinas • comando_composto
+   10 var: $@4 VAR • declara_vars
 
-    T_BEGIN  deslocar, e ir ao estado 26
+    $padrão  reduzir usando a regra 14 ($@5)
 
-    comando_composto  ir ao estado 27
+    declara_vars  ir ao estado 24
+    declara_var   ir ao estado 25
+    $@5           ir ao estado 26
 
 
 Estado 23
 
-   20 parte_declara_subrotinas: declaracao_procedimento •
+    5 bloco: parte_declara_rotulos parte_declara_vars $@2 parte_declara_subrotinas • $@3 comando_composto
+   22 parte_declara_subrotinas: parte_declara_subrotinas • declaracao_procedimento
 
-    $padrão  reduzir usando a regra 20 (parte_declara_subrotinas)
+    PROCEDURE  deslocar, e ir ao estado 27
+
+    $padrão  reduzir usando a regra 4 ($@3)
+
+    $@3                      ir ao estado 28
+    declaracao_procedimento  ir ao estado 29
 
 
 Estado 24
 
-    8 var: $@2 VAR • declara_vars
+   10 var: $@4 VAR declara_vars •
+   12 declara_vars: declara_vars • declara_var
 
-    $padrão  reduzir usando a regra 12 ($@3)
+    IDENT    reduzir usando a regra 14 ($@5)
+    $padrão  reduzir usando a regra 10 (var)
 
-    declara_vars  ir ao estado 28
-    declara_var   ir ao estado 29
-    $@3           ir ao estado 30
+    declara_var  ir ao estado 30
+    $@5          ir ao estado 26
 
 
 Estado 25
 
-   21 declaracao_procedimento: PROCEDURE IDENT •
+   13 declara_vars: declara_var •
 
-    $padrão  reduzir usando a regra 21 (declaracao_procedimento)
+    $padrão  reduzir usando a regra 13 (declara_vars)
 
 
 Estado 26
 
-   23 comando_composto: T_BEGIN • comandos T_END
-
-    T_BEGIN  deslocar, e ir ao estado 26
-    IDENT    deslocar, e ir ao estado 31
-    IF       deslocar, e ir ao estado 32
-    NUMERO   deslocar, e ir ao estado 33
-    READ     deslocar, e ir ao estado 34
-    WRITE    deslocar, e ir ao estado 35
+   16 declara_var: $@5 • lista_id_var DOIS_PONTOS tipo $@6 PONTO_E_VIRGULA
 
-    WHILE    reduzir usando a regra 60 ($@6)
-    $padrão  reduzir usando a regra 26 (comandos)
+    IDENT  deslocar, e ir ao estado 31
 
-    comando_composto     ir ao estado 36
-    comandos             ir ao estado 37
-    comando              ir ao estado 38
-    comando_sem_rotulo   ir ao estado 39
-    leitura              ir ao estado 40
-    escrita              ir ao estado 41
-    atribuicao           ir ao estado 42
-    numero               ir ao estado 43
-    comando_repetitivo   ir ao estado 44
-    $@6                  ir ao estado 45
-    comando_condicional  ir ao estado 46
-    if_then              ir ao estado 47
+    lista_id_var  ir ao estado 32
 
 
 Estado 27
 
-    3 bloco: parte_declara_rotulos parte_declara_vars parte_declara_subrotinas comando_composto •
+   25 declaracao_procedimento: PROCEDURE • IDENT $@7 PONTO_E_VIRGULA bloco
 
-    $padrão  reduzir usando a regra 3 (bloco)
+    IDENT  deslocar, e ir ao estado 33
 
 
 Estado 28
 
-    8 var: $@2 VAR declara_vars •
-   10 declara_vars: declara_vars • declara_var
+    5 bloco: parte_declara_rotulos parte_declara_vars $@2 parte_declara_subrotinas $@3 • comando_composto
 
-    IDENT    reduzir usando a regra 12 ($@3)
-    $padrão  reduzir usando a regra 8 (var)
+    T_BEGIN  deslocar, e ir ao estado 34
 
-    declara_var  ir ao estado 48
-    $@3          ir ao estado 30
+    comando_composto  ir ao estado 35
 
 
 Estado 29
 
-   11 declara_vars: declara_var •
+   22 parte_declara_subrotinas: parte_declara_subrotinas declaracao_procedimento •
 
-    $padrão  reduzir usando a regra 11 (declara_vars)
+    $padrão  reduzir usando a regra 22 (parte_declara_subrotinas)
 
 
 Estado 30
 
-   14 declara_var: $@3 • lista_id_var DOIS_PONTOS tipo $@4 PONTO_E_VIRGULA
+   12 declara_vars: declara_vars declara_var •
 
-    IDENT  deslocar, e ir ao estado 49
-
-    lista_id_var  ir ao estado 50
+    $padrão  reduzir usando a regra 12 (declara_vars)
 
 
 Estado 31
 
-   56 atribuicao: IDENT • $@5 ATRIBUICAO expressao_simples
-
-    $padrão  reduzir usando a regra 55 ($@5)
+   19 lista_id_var: IDENT •
 
-    $@5  ir ao estado 51
+    $padrão  reduzir usando a regra 19 (lista_id_var)
 
 
 Estado 32
 
-   67 if_then: IF • expressao $@8 THEN comando_sem_rotulo
+   16 declara_var: $@5 lista_id_var • DOIS_PONTOS tipo $@6 PONTO_E_VIRGULA
+   18 lista_id_var: lista_id_var • VIRGULA IDENT
 
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
-
-    expressao          ir ao estado 54
-    expressao_simples  ir ao estado 55
-    termo              ir ao estado 56
-    fator              ir ao estado 57
+    VIRGULA      deslocar, e ir ao estado 36
+    DOIS_PONTOS  deslocar, e ir ao estado 37
 
 
 Estado 33
 
-   59 numero: NUMERO •
+   25 declaracao_procedimento: PROCEDURE IDENT • $@7 PONTO_E_VIRGULA bloco
+
+    $padrão  reduzir usando a regra 24 ($@7)
 
-    $padrão  reduzir usando a regra 59 (numero)
+    $@7  ir ao estado 38
 
 
 Estado 34
 
-   35 leitura: READ • ABRE_PARENTESES lista_leituras FECHA_PARENTESES
+   26 comando_composto: T_BEGIN • comandos T_END
 
-    ABRE_PARENTESES  deslocar, e ir ao estado 58
+    T_BEGIN  deslocar, e ir ao estado 34
+    IDENT    deslocar, e ir ao estado 39
+    IF       deslocar, e ir ao estado 40
+    NUMERO   deslocar, e ir ao estado 41
+    READ     deslocar, e ir ao estado 42
+    WRITE    deslocar, e ir ao estado 43
+
+    WHILE    reduzir usando a regra 63 ($@9)
+    $padrão  reduzir usando a regra 29 (comandos)
+
+    comando_composto     ir ao estado 44
+    comandos             ir ao estado 45
+    comando              ir ao estado 46
+    comando_sem_rotulo   ir ao estado 47
+    leitura              ir ao estado 48
+    escrita              ir ao estado 49
+    atribuicao           ir ao estado 50
+    numero               ir ao estado 51
+    comando_repetitivo   ir ao estado 52
+    $@9                  ir ao estado 53
+    comando_condicional  ir ao estado 54
+    if_then              ir ao estado 55
 
 
 Estado 35
 
-   39 escrita: WRITE • ABRE_PARENTESES lista_escritas FECHA_PARENTESES
+    5 bloco: parte_declara_rotulos parte_declara_vars $@2 parte_declara_subrotinas $@3 comando_composto •
 
-    ABRE_PARENTESES  deslocar, e ir ao estado 59
+    $padrão  reduzir usando a regra 5 (bloco)
 
 
 Estado 36
 
-   30 comando_sem_rotulo: comando_composto •
+   18 lista_id_var: lista_id_var VIRGULA • IDENT
 
-    $padrão  reduzir usando a regra 30 (comando_sem_rotulo)
+    IDENT  deslocar, e ir ao estado 56
 
 
 Estado 37
 
-   23 comando_composto: T_BEGIN comandos • T_END
+   16 declara_var: $@5 lista_id_var DOIS_PONTOS • tipo $@6 PONTO_E_VIRGULA
+
+    IDENT  deslocar, e ir ao estado 57
 
-    T_END  deslocar, e ir ao estado 60
+    tipo  ir ao estado 58
 
 
 Estado 38
 
-   24 comandos: comando • PONTO_E_VIRGULA comandos
-   25         | comando • PONTO_E_VIRGULA
+   25 declaracao_procedimento: PROCEDURE IDENT $@7 • PONTO_E_VIRGULA bloco
 
-    PONTO_E_VIRGULA  deslocar, e ir ao estado 61
+    PONTO_E_VIRGULA  deslocar, e ir ao estado 59
 
 
 Estado 39
 
-   28 comando: comando_sem_rotulo •
+   59 atribuicao: IDENT • $@8 ATRIBUICAO expressao_simples
 
-    $padrão  reduzir usando a regra 28 (comando)
+    $padrão  reduzir usando a regra 58 ($@8)
+
+    $@8  ir ao estado 60
 
 
 Estado 40
 
-   33 comando_sem_rotulo: leitura •
+   70 if_then: IF • expressao $@11 THEN comando_sem_rotulo
 
-    $padrão  reduzir usando a regra 33 (comando_sem_rotulo)
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
+
+    expressao          ir ao estado 63
+    expressao_simples  ir ao estado 64
+    termo              ir ao estado 65
+    fator              ir ao estado 66
 
 
 Estado 41
 
-   34 comando_sem_rotulo: escrita •
+   62 numero: NUMERO •
 
-    $padrão  reduzir usando a regra 34 (comando_sem_rotulo)
+    $padrão  reduzir usando a regra 62 (numero)
 
 
 Estado 42
 
-   29 comando_sem_rotulo: atribuicao •
+   38 leitura: READ • ABRE_PARENTESES lista_leituras FECHA_PARENTESES
 
-    $padrão  reduzir usando a regra 29 (comando_sem_rotulo)
+    ABRE_PARENTESES  deslocar, e ir ao estado 67
 
 
 Estado 43
 
-   27 comando: numero • DOIS_PONTOS comando_sem_rotulo
+   42 escrita: WRITE • ABRE_PARENTESES lista_escritas FECHA_PARENTESES
 
-    DOIS_PONTOS  deslocar, e ir ao estado 62
+    ABRE_PARENTESES  deslocar, e ir ao estado 68
 
 
 Estado 44
 
-   32 comando_sem_rotulo: comando_repetitivo •
+   33 comando_sem_rotulo: comando_composto •
 
-    $padrão  reduzir usando a regra 32 (comando_sem_rotulo)
+    $padrão  reduzir usando a regra 33 (comando_sem_rotulo)
 
 
 Estado 45
 
-   62 comando_repetitivo: $@6 • WHILE expressao DO $@7 comando_sem_rotulo
+   26 comando_composto: T_BEGIN comandos • T_END
 
-    WHILE  deslocar, e ir ao estado 63
+    T_END  deslocar, e ir ao estado 69
 
 
 Estado 46
 
-   31 comando_sem_rotulo: comando_condicional •
+   27 comandos: comando • PONTO_E_VIRGULA comandos
+   28         | comando • PONTO_E_VIRGULA
 
-    $padrão  reduzir usando a regra 31 (comando_sem_rotulo)
+    PONTO_E_VIRGULA  deslocar, e ir ao estado 70
 
 
 Estado 47
 
-   63 comando_condicional: if_then • cond_else
-
-    ELSE  deslocar, e ir ao estado 64
+   31 comando: comando_sem_rotulo •
 
-    $padrão  reduzir usando a regra 65 (cond_else)
-
-    cond_else  ir ao estado 65
+    $padrão  reduzir usando a regra 31 (comando)
 
 
 Estado 48
 
-   10 declara_vars: declara_vars declara_var •
+   36 comando_sem_rotulo: leitura •
 
-    $padrão  reduzir usando a regra 10 (declara_vars)
+    $padrão  reduzir usando a regra 36 (comando_sem_rotulo)
 
 
 Estado 49
 
-   17 lista_id_var: IDENT •
+   37 comando_sem_rotulo: escrita •
 
-    $padrão  reduzir usando a regra 17 (lista_id_var)
+    $padrão  reduzir usando a regra 37 (comando_sem_rotulo)
 
 
 Estado 50
 
-   14 declara_var: $@3 lista_id_var • DOIS_PONTOS tipo $@4 PONTO_E_VIRGULA
-   16 lista_id_var: lista_id_var • VIRGULA IDENT
+   32 comando_sem_rotulo: atribuicao •
 
-    VIRGULA      deslocar, e ir ao estado 66
-    DOIS_PONTOS  deslocar, e ir ao estado 67
+    $padrão  reduzir usando a regra 32 (comando_sem_rotulo)
 
 
 Estado 51
 
-   56 atribuicao: IDENT $@5 • ATRIBUICAO expressao_simples
+   30 comando: numero • DOIS_PONTOS comando_sem_rotulo
 
-    ATRIBUICAO  deslocar, e ir ao estado 68
+    DOIS_PONTOS  deslocar, e ir ao estado 71
 
 
 Estado 52
 
-   57 fator: IDENT •
+   35 comando_sem_rotulo: comando_repetitivo •
 
-    $padrão  reduzir usando a regra 57 (fator)
+    $padrão  reduzir usando a regra 35 (comando_sem_rotulo)
 
 
 Estado 53
 
-   58 fator: NUMERO •
+   65 comando_repetitivo: $@9 • WHILE expressao DO $@10 comando_sem_rotulo
 
-    $padrão  reduzir usando a regra 58 (fator)
+    WHILE  deslocar, e ir ao estado 72
 
 
 Estado 54
 
-   42 expressao: expressao • IGUAL expressao_simples
-   43          | expressao • DIFERENTE expressao_simples
-   44          | expressao • MENOR expressao_simples
-   45          | expressao • MENOR_IGUAL expressao_simples
-   46          | expressao • MAIOR expressao_simples
-   47          | expressao • MAIOR_IGUAL expressao_simples
-   67 if_then: IF expressao • $@8 THEN comando_sem_rotulo
-
-    IGUAL        deslocar, e ir ao estado 69
-    DIFERENTE    deslocar, e ir ao estado 70
-    MENOR_IGUAL  deslocar, e ir ao estado 71
-    MAIOR_IGUAL  deslocar, e ir ao estado 72
-    MENOR        deslocar, e ir ao estado 73
-    MAIOR        deslocar, e ir ao estado 74
-
-    $padrão  reduzir usando a regra 66 ($@8)
+   34 comando_sem_rotulo: comando_condicional •
 
-    $@8  ir ao estado 75
+    $padrão  reduzir usando a regra 34 (comando_sem_rotulo)
 
 
 Estado 55
 
-   48 expressao: expressao_simples •
-   49 expressao_simples: expressao_simples • MAIS termo
-   50                  | expressao_simples • MENOS termo
+   66 comando_condicional: if_then • cond_else
 
-    MAIS   deslocar, e ir ao estado 76
-    MENOS  deslocar, e ir ao estado 77
+    ELSE  deslocar, e ir ao estado 73
 
-    $padrão  reduzir usando a regra 48 (expressao)
+    $padrão  reduzir usando a regra 68 (cond_else)
 
+    cond_else  ir ao estado 74
 
-Estado 56
 
-   51 expressao_simples: termo •
-   52 termo: termo • ASTERISCO fator
-   53      | termo • DIV fator
+Estado 56
 
-    DIV        deslocar, e ir ao estado 78
-    ASTERISCO  deslocar, e ir ao estado 79
+   18 lista_id_var: lista_id_var VIRGULA IDENT •
 
-    $padrão  reduzir usando a regra 51 (expressao_simples)
+    $padrão  reduzir usando a regra 18 (lista_id_var)
 
 
 Estado 57
 
-   54 termo: fator •
+   17 tipo: IDENT •
 
-    $padrão  reduzir usando a regra 54 (termo)
+    $padrão  reduzir usando a regra 17 (tipo)
 
 
 Estado 58
 
-   35 leitura: READ ABRE_PARENTESES • lista_leituras FECHA_PARENTESES
+   16 declara_var: $@5 lista_id_var DOIS_PONTOS tipo • $@6 PONTO_E_VIRGULA
 
-    IDENT  deslocar, e ir ao estado 80
+    $padrão  reduzir usando a regra 15 ($@6)
 
-    lista_leituras  ir ao estado 81
-    simb_leitura    ir ao estado 82
+    $@6  ir ao estado 75
 
 
 Estado 59
 
-   39 escrita: WRITE ABRE_PARENTESES • lista_escritas FECHA_PARENTESES
+   25 declaracao_procedimento: PROCEDURE IDENT $@7 PONTO_E_VIRGULA • bloco
+
+    LABEL  deslocar, e ir ao estado 13
 
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
+    $padrão  reduzir usando a regra 7 (parte_declara_rotulos)
 
-    lista_escritas     ir ao estado 83
-    expressao_simples  ir ao estado 84
-    termo              ir ao estado 56
-    fator              ir ao estado 57
+    bloco                  ir ao estado 76
+    parte_declara_rotulos  ir ao estado 15
 
 
 Estado 60
 
-   23 comando_composto: T_BEGIN comandos T_END •
+   59 atribuicao: IDENT $@8 • ATRIBUICAO expressao_simples
 
-    $padrão  reduzir usando a regra 23 (comando_composto)
+    ATRIBUICAO  deslocar, e ir ao estado 77
 
 
 Estado 61
 
-   24 comandos: comando PONTO_E_VIRGULA • comandos
-   25         | comando PONTO_E_VIRGULA •
-
-    T_BEGIN  deslocar, e ir ao estado 26
-    IDENT    deslocar, e ir ao estado 31
-    IF       deslocar, e ir ao estado 32
-    NUMERO   deslocar, e ir ao estado 33
-    READ     deslocar, e ir ao estado 34
-    WRITE    deslocar, e ir ao estado 35
-
-    T_END    reduzir usando a regra 25 (comandos)
-    T_END    [reduzir usando a regra 26 (comandos)]
-    WHILE    reduzir usando a regra 60 ($@6)
-    $padrão  reduzir usando a regra 25 (comandos)
-
-    comando_composto     ir ao estado 36
-    comandos             ir ao estado 85
-    comando              ir ao estado 38
-    comando_sem_rotulo   ir ao estado 39
-    leitura              ir ao estado 40
-    escrita              ir ao estado 41
-    atribuicao           ir ao estado 42
-    numero               ir ao estado 43
-    comando_repetitivo   ir ao estado 44
-    $@6                  ir ao estado 45
-    comando_condicional  ir ao estado 46
-    if_then              ir ao estado 47
+   60 fator: IDENT •
 
+    $padrão  reduzir usando a regra 60 (fator)
 
-Estado 62
-
-   27 comando: numero DOIS_PONTOS • comando_sem_rotulo
 
-    T_BEGIN  deslocar, e ir ao estado 26
-    IDENT    deslocar, e ir ao estado 31
-    IF       deslocar, e ir ao estado 32
-    READ     deslocar, e ir ao estado 34
-    WRITE    deslocar, e ir ao estado 35
+Estado 62
 
-    $padrão  reduzir usando a regra 60 ($@6)
+   61 fator: NUMERO •
 
-    comando_composto     ir ao estado 36
-    comando_sem_rotulo   ir ao estado 86
-    leitura              ir ao estado 40
-    escrita              ir ao estado 41
-    atribuicao           ir ao estado 42
-    comando_repetitivo   ir ao estado 44
-    $@6                  ir ao estado 45
-    comando_condicional  ir ao estado 46
-    if_then              ir ao estado 47
+    $padrão  reduzir usando a regra 61 (fator)
 
 
 Estado 63
 
-   62 comando_repetitivo: $@6 WHILE • expressao DO $@7 comando_sem_rotulo
+   45 expressao: expressao • IGUAL expressao_simples
+   46          | expressao • DIFERENTE expressao_simples
+   47          | expressao • MENOR expressao_simples
+   48          | expressao • MENOR_IGUAL expressao_simples
+   49          | expressao • MAIOR expressao_simples
+   50          | expressao • MAIOR_IGUAL expressao_simples
+   70 if_then: IF expressao • $@11 THEN comando_sem_rotulo
 
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
+    IGUAL        deslocar, e ir ao estado 78
+    DIFERENTE    deslocar, e ir ao estado 79
+    MENOR_IGUAL  deslocar, e ir ao estado 80
+    MAIOR_IGUAL  deslocar, e ir ao estado 81
+    MENOR        deslocar, e ir ao estado 82
+    MAIOR        deslocar, e ir ao estado 83
 
-    expressao          ir ao estado 87
-    expressao_simples  ir ao estado 55
-    termo              ir ao estado 56
-    fator              ir ao estado 57
+    $padrão  reduzir usando a regra 69 ($@11)
 
+    $@11  ir ao estado 84
 
-Estado 64
 
-   64 cond_else: ELSE • comando_sem_rotulo
+Estado 64
 
-    T_BEGIN  deslocar, e ir ao estado 26
-    IDENT    deslocar, e ir ao estado 31
-    IF       deslocar, e ir ao estado 32
-    READ     deslocar, e ir ao estado 34
-    WRITE    deslocar, e ir ao estado 35
+   51 expressao: expressao_simples •
+   52 expressao_simples: expressao_simples • MAIS termo
+   53                  | expressao_simples • MENOS termo
 
-    $padrão  reduzir usando a regra 60 ($@6)
+    MAIS   deslocar, e ir ao estado 85
+    MENOS  deslocar, e ir ao estado 86
 
-    comando_composto     ir ao estado 36
-    comando_sem_rotulo   ir ao estado 88
-    leitura              ir ao estado 40
-    escrita              ir ao estado 41
-    atribuicao           ir ao estado 42
-    comando_repetitivo   ir ao estado 44
-    $@6                  ir ao estado 45
-    comando_condicional  ir ao estado 46
-    if_then              ir ao estado 47
+    $padrão  reduzir usando a regra 51 (expressao)
 
 
 Estado 65
 
-   63 comando_condicional: if_then cond_else •
+   54 expressao_simples: termo •
+   55 termo: termo • ASTERISCO fator
+   56      | termo • DIV fator
 
-    $padrão  reduzir usando a regra 63 (comando_condicional)
+    DIV        deslocar, e ir ao estado 87
+    ASTERISCO  deslocar, e ir ao estado 88
+
+    $padrão  reduzir usando a regra 54 (expressao_simples)
 
 
 Estado 66
 
-   16 lista_id_var: lista_id_var VIRGULA • IDENT
+   57 termo: fator •
 
-    IDENT  deslocar, e ir ao estado 89
+    $padrão  reduzir usando a regra 57 (termo)
 
 
 Estado 67
 
-   14 declara_var: $@3 lista_id_var DOIS_PONTOS • tipo $@4 PONTO_E_VIRGULA
+   38 leitura: READ ABRE_PARENTESES • lista_leituras FECHA_PARENTESES
 
-    IDENT  deslocar, e ir ao estado 90
+    IDENT  deslocar, e ir ao estado 89
 
-    tipo  ir ao estado 91
+    lista_leituras  ir ao estado 90
+    simb_leitura    ir ao estado 91
 
 
 Estado 68
 
-   56 atribuicao: IDENT $@5 ATRIBUICAO • expressao_simples
+   42 escrita: WRITE ABRE_PARENTESES • lista_escritas FECHA_PARENTESES
 
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
 
-    expressao_simples  ir ao estado 92
-    termo              ir ao estado 56
-    fator              ir ao estado 57
+    lista_escritas     ir ao estado 92
+    expressao_simples  ir ao estado 93
+    termo              ir ao estado 65
+    fator              ir ao estado 66
 
 
 Estado 69
 
-   42 expressao: expressao IGUAL • expressao_simples
-
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
+   26 comando_composto: T_BEGIN comandos T_END •
 
-    expressao_simples  ir ao estado 93
-    termo              ir ao estado 56
-    fator              ir ao estado 57
+    $padrão  reduzir usando a regra 26 (comando_composto)
 
 
 Estado 70
 
-   43 expressao: expressao DIFERENTE • expressao_simples
-
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
-
-    expressao_simples  ir ao estado 94
-    termo              ir ao estado 56
-    fator              ir ao estado 57
+   27 comandos: comando PONTO_E_VIRGULA • comandos
+   28         | comando PONTO_E_VIRGULA •
+
+    T_BEGIN  deslocar, e ir ao estado 34
+    IDENT    deslocar, e ir ao estado 39
+    IF       deslocar, e ir ao estado 40
+    NUMERO   deslocar, e ir ao estado 41
+    READ     deslocar, e ir ao estado 42
+    WRITE    deslocar, e ir ao estado 43
+
+    T_END    reduzir usando a regra 28 (comandos)
+    T_END    [reduzir usando a regra 29 (comandos)]
+    WHILE    reduzir usando a regra 63 ($@9)
+    $padrão  reduzir usando a regra 28 (comandos)
+
+    comando_composto     ir ao estado 44
+    comandos             ir ao estado 94
+    comando              ir ao estado 46
+    comando_sem_rotulo   ir ao estado 47
+    leitura              ir ao estado 48
+    escrita              ir ao estado 49
+    atribuicao           ir ao estado 50
+    numero               ir ao estado 51
+    comando_repetitivo   ir ao estado 52
+    $@9                  ir ao estado 53
+    comando_condicional  ir ao estado 54
+    if_then              ir ao estado 55
 
 
 Estado 71
 
-   45 expressao: expressao MENOR_IGUAL • expressao_simples
+   30 comando: numero DOIS_PONTOS • comando_sem_rotulo
+
+    T_BEGIN  deslocar, e ir ao estado 34
+    IDENT    deslocar, e ir ao estado 39
+    IF       deslocar, e ir ao estado 40
+    READ     deslocar, e ir ao estado 42
+    WRITE    deslocar, e ir ao estado 43
 
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
+    $padrão  reduzir usando a regra 63 ($@9)
 
-    expressao_simples  ir ao estado 95
-    termo              ir ao estado 56
-    fator              ir ao estado 57
+    comando_composto     ir ao estado 44
+    comando_sem_rotulo   ir ao estado 95
+    leitura              ir ao estado 48
+    escrita              ir ao estado 49
+    atribuicao           ir ao estado 50
+    comando_repetitivo   ir ao estado 52
+    $@9                  ir ao estado 53
+    comando_condicional  ir ao estado 54
+    if_then              ir ao estado 55
 
 
 Estado 72
 
-   47 expressao: expressao MAIOR_IGUAL • expressao_simples
+   65 comando_repetitivo: $@9 WHILE • expressao DO $@10 comando_sem_rotulo
 
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
 
-    expressao_simples  ir ao estado 96
-    termo              ir ao estado 56
-    fator              ir ao estado 57
+    expressao          ir ao estado 96
+    expressao_simples  ir ao estado 64
+    termo              ir ao estado 65
+    fator              ir ao estado 66
 
 
 Estado 73
 
-   44 expressao: expressao MENOR • expressao_simples
+   67 cond_else: ELSE • comando_sem_rotulo
 
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
+    T_BEGIN  deslocar, e ir ao estado 34
+    IDENT    deslocar, e ir ao estado 39
+    IF       deslocar, e ir ao estado 40
+    READ     deslocar, e ir ao estado 42
+    WRITE    deslocar, e ir ao estado 43
 
-    expressao_simples  ir ao estado 97
-    termo              ir ao estado 56
-    fator              ir ao estado 57
+    $padrão  reduzir usando a regra 63 ($@9)
 
+    comando_composto     ir ao estado 44
+    comando_sem_rotulo   ir ao estado 97
+    leitura              ir ao estado 48
+    escrita              ir ao estado 49
+    atribuicao           ir ao estado 50
+    comando_repetitivo   ir ao estado 52
+    $@9                  ir ao estado 53
+    comando_condicional  ir ao estado 54
+    if_then              ir ao estado 55
 
-Estado 74
 
-   46 expressao: expressao MAIOR • expressao_simples
+Estado 74
 
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
+   66 comando_condicional: if_then cond_else •
 
-    expressao_simples  ir ao estado 98
-    termo              ir ao estado 56
-    fator              ir ao estado 57
+    $padrão  reduzir usando a regra 66 (comando_condicional)
 
 
 Estado 75
 
-   67 if_then: IF expressao $@8 • THEN comando_sem_rotulo
+   16 declara_var: $@5 lista_id_var DOIS_PONTOS tipo $@6 • PONTO_E_VIRGULA
 
-    THEN  deslocar, e ir ao estado 99
+    PONTO_E_VIRGULA  deslocar, e ir ao estado 98
 
 
 Estado 76
 
-   49 expressao_simples: expressao_simples MAIS • termo
-
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
+   25 declaracao_procedimento: PROCEDURE IDENT $@7 PONTO_E_VIRGULA bloco •
 
-    termo  ir ao estado 100
-    fator  ir ao estado 57
+    $padrão  reduzir usando a regra 25 (declaracao_procedimento)
 
 
 Estado 77
 
-   50 expressao_simples: expressao_simples MENOS • termo
+   59 atribuicao: IDENT $@8 ATRIBUICAO • expressao_simples
 
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
 
-    termo  ir ao estado 101
-    fator  ir ao estado 57
+    expressao_simples  ir ao estado 99
+    termo              ir ao estado 65
+    fator              ir ao estado 66
 
 
 Estado 78
 
-   53 termo: termo DIV • fator
+   45 expressao: expressao IGUAL • expressao_simples
 
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
 
-    fator  ir ao estado 102
+    expressao_simples  ir ao estado 100
+    termo              ir ao estado 65
+    fator              ir ao estado 66
 
 
 Estado 79
 
-   52 termo: termo ASTERISCO • fator
+   46 expressao: expressao DIFERENTE • expressao_simples
 
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
 
-    fator  ir ao estado 103
+    expressao_simples  ir ao estado 101
+    termo              ir ao estado 65
+    fator              ir ao estado 66
 
 
 Estado 80
 
-   38 simb_leitura: IDENT •
+   48 expressao: expressao MENOR_IGUAL • expressao_simples
 
-    $padrão  reduzir usando a regra 38 (simb_leitura)
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
+
+    expressao_simples  ir ao estado 102
+    termo              ir ao estado 65
+    fator              ir ao estado 66
 
 
 Estado 81
 
-   35 leitura: READ ABRE_PARENTESES lista_leituras • FECHA_PARENTESES
-   36 lista_leituras: lista_leituras • VIRGULA simb_leitura
+   50 expressao: expressao MAIOR_IGUAL • expressao_simples
+
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
 
-    FECHA_PARENTESES  deslocar, e ir ao estado 104
-    VIRGULA           deslocar, e ir ao estado 105
+    expressao_simples  ir ao estado 103
+    termo              ir ao estado 65
+    fator              ir ao estado 66
 
 
 Estado 82
 
-   37 lista_leituras: simb_leitura •
+   47 expressao: expressao MENOR • expressao_simples
 
-    $padrão  reduzir usando a regra 37 (lista_leituras)
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
+
+    expressao_simples  ir ao estado 104
+    termo              ir ao estado 65
+    fator              ir ao estado 66
 
 
 Estado 83
 
-   39 escrita: WRITE ABRE_PARENTESES lista_escritas • FECHA_PARENTESES
-   40 lista_escritas: lista_escritas • VIRGULA expressao_simples
+   49 expressao: expressao MAIOR • expressao_simples
 
-    FECHA_PARENTESES  deslocar, e ir ao estado 106
-    VIRGULA           deslocar, e ir ao estado 107
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
 
+    expressao_simples  ir ao estado 105
+    termo              ir ao estado 65
+    fator              ir ao estado 66
 
-Estado 84
 
-   41 lista_escritas: expressao_simples •
-   49 expressao_simples: expressao_simples • MAIS termo
-   50                  | expressao_simples • MENOS termo
+Estado 84
 
-    MAIS   deslocar, e ir ao estado 76
-    MENOS  deslocar, e ir ao estado 77
+   70 if_then: IF expressao $@11 • THEN comando_sem_rotulo
 
-    $padrão  reduzir usando a regra 41 (lista_escritas)
+    THEN  deslocar, e ir ao estado 106
 
 
 Estado 85
 
-   24 comandos: comando PONTO_E_VIRGULA comandos •
+   52 expressao_simples: expressao_simples MAIS • termo
+
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
 
-    $padrão  reduzir usando a regra 24 (comandos)
+    termo  ir ao estado 107
+    fator  ir ao estado 66
 
 
 Estado 86
 
-   27 comando: numero DOIS_PONTOS comando_sem_rotulo •
+   53 expressao_simples: expressao_simples MENOS • termo
 
-    $padrão  reduzir usando a regra 27 (comando)
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
+
+    termo  ir ao estado 108
+    fator  ir ao estado 66
 
 
 Estado 87
 
-   42 expressao: expressao • IGUAL expressao_simples
-   43          | expressao • DIFERENTE expressao_simples
-   44          | expressao • MENOR expressao_simples
-   45          | expressao • MENOR_IGUAL expressao_simples
-   46          | expressao • MAIOR expressao_simples
-   47          | expressao • MAIOR_IGUAL expressao_simples
-   62 comando_repetitivo: $@6 WHILE expressao • DO $@7 comando_sem_rotulo
+   56 termo: termo DIV • fator
+
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
 
-    DO           deslocar, e ir ao estado 108
-    IGUAL        deslocar, e ir ao estado 69
-    DIFERENTE    deslocar, e ir ao estado 70
-    MENOR_IGUAL  deslocar, e ir ao estado 71
-    MAIOR_IGUAL  deslocar, e ir ao estado 72
-    MENOR        deslocar, e ir ao estado 73
-    MAIOR        deslocar, e ir ao estado 74
+    fator  ir ao estado 109
 
 
 Estado 88
 
-   64 cond_else: ELSE comando_sem_rotulo •
+   55 termo: termo ASTERISCO • fator
 
-    $padrão  reduzir usando a regra 64 (cond_else)
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
+
+    fator  ir ao estado 110
 
 
 Estado 89
 
-   16 lista_id_var: lista_id_var VIRGULA IDENT •
+   41 simb_leitura: IDENT •
 
-    $padrão  reduzir usando a regra 16 (lista_id_var)
+    $padrão  reduzir usando a regra 41 (simb_leitura)
 
 
 Estado 90
 
-   15 tipo: IDENT •
+   38 leitura: READ ABRE_PARENTESES lista_leituras • FECHA_PARENTESES
+   39 lista_leituras: lista_leituras • VIRGULA simb_leitura
 
-    $padrão  reduzir usando a regra 15 (tipo)
+    FECHA_PARENTESES  deslocar, e ir ao estado 111
+    VIRGULA           deslocar, e ir ao estado 112
 
 
 Estado 91
 
-   14 declara_var: $@3 lista_id_var DOIS_PONTOS tipo • $@4 PONTO_E_VIRGULA
-
-    $padrão  reduzir usando a regra 13 ($@4)
+   40 lista_leituras: simb_leitura •
 
-    $@4  ir ao estado 109
+    $padrão  reduzir usando a regra 40 (lista_leituras)
 
 
 Estado 92
 
-   49 expressao_simples: expressao_simples • MAIS termo
-   50                  | expressao_simples • MENOS termo
-   56 atribuicao: IDENT $@5 ATRIBUICAO expressao_simples •
+   42 escrita: WRITE ABRE_PARENTESES lista_escritas • FECHA_PARENTESES
+   43 lista_escritas: lista_escritas • VIRGULA expressao_simples
 
-    MAIS   deslocar, e ir ao estado 76
-    MENOS  deslocar, e ir ao estado 77
-
-    $padrão  reduzir usando a regra 56 (atribuicao)
+    FECHA_PARENTESES  deslocar, e ir ao estado 113
+    VIRGULA           deslocar, e ir ao estado 114
 
 
 Estado 93
 
-   42 expressao: expressao IGUAL expressao_simples •
-   49 expressao_simples: expressao_simples • MAIS termo
-   50                  | expressao_simples • MENOS termo
+   44 lista_escritas: expressao_simples •
+   52 expressao_simples: expressao_simples • MAIS termo
+   53                  | expressao_simples • MENOS termo
 
-    MAIS   deslocar, e ir ao estado 76
-    MENOS  deslocar, e ir ao estado 77
+    MAIS   deslocar, e ir ao estado 85
+    MENOS  deslocar, e ir ao estado 86
 
-    $padrão  reduzir usando a regra 42 (expressao)
+    $padrão  reduzir usando a regra 44 (lista_escritas)
 
 
 Estado 94
 
-   43 expressao: expressao DIFERENTE expressao_simples •
-   49 expressao_simples: expressao_simples • MAIS termo
-   50                  | expressao_simples • MENOS termo
-
-    MAIS   deslocar, e ir ao estado 76
-    MENOS  deslocar, e ir ao estado 77
+   27 comandos: comando PONTO_E_VIRGULA comandos •
 
-    $padrão  reduzir usando a regra 43 (expressao)
+    $padrão  reduzir usando a regra 27 (comandos)
 
 
 Estado 95
 
-   45 expressao: expressao MENOR_IGUAL expressao_simples •
-   49 expressao_simples: expressao_simples • MAIS termo
-   50                  | expressao_simples • MENOS termo
+   30 comando: numero DOIS_PONTOS comando_sem_rotulo •
 
-    MAIS   deslocar, e ir ao estado 76
-    MENOS  deslocar, e ir ao estado 77
-
-    $padrão  reduzir usando a regra 45 (expressao)
+    $padrão  reduzir usando a regra 30 (comando)
 
 
 Estado 96
 
-   47 expressao: expressao MAIOR_IGUAL expressao_simples •
-   49 expressao_simples: expressao_simples • MAIS termo
-   50                  | expressao_simples • MENOS termo
+   45 expressao: expressao • IGUAL expressao_simples
+   46          | expressao • DIFERENTE expressao_simples
+   47          | expressao • MENOR expressao_simples
+   48          | expressao • MENOR_IGUAL expressao_simples
+   49          | expressao • MAIOR expressao_simples
+   50          | expressao • MAIOR_IGUAL expressao_simples
+   65 comando_repetitivo: $@9 WHILE expressao • DO $@10 comando_sem_rotulo
 
-    MAIS   deslocar, e ir ao estado 76
-    MENOS  deslocar, e ir ao estado 77
-
-    $padrão  reduzir usando a regra 47 (expressao)
+    DO           deslocar, e ir ao estado 115
+    IGUAL        deslocar, e ir ao estado 78
+    DIFERENTE    deslocar, e ir ao estado 79
+    MENOR_IGUAL  deslocar, e ir ao estado 80
+    MAIOR_IGUAL  deslocar, e ir ao estado 81
+    MENOR        deslocar, e ir ao estado 82
+    MAIOR        deslocar, e ir ao estado 83
 
 
 Estado 97
 
-   44 expressao: expressao MENOR expressao_simples •
-   49 expressao_simples: expressao_simples • MAIS termo
-   50                  | expressao_simples • MENOS termo
-
-    MAIS   deslocar, e ir ao estado 76
-    MENOS  deslocar, e ir ao estado 77
+   67 cond_else: ELSE comando_sem_rotulo •
 
-    $padrão  reduzir usando a regra 44 (expressao)
+    $padrão  reduzir usando a regra 67 (cond_else)
 
 
 Estado 98
 
-   46 expressao: expressao MAIOR expressao_simples •
-   49 expressao_simples: expressao_simples • MAIS termo
-   50                  | expressao_simples • MENOS termo
+   16 declara_var: $@5 lista_id_var DOIS_PONTOS tipo $@6 PONTO_E_VIRGULA •
 
-    MAIS   deslocar, e ir ao estado 76
-    MENOS  deslocar, e ir ao estado 77
-
-    $padrão  reduzir usando a regra 46 (expressao)
+    $padrão  reduzir usando a regra 16 (declara_var)
 
 
 Estado 99
 
-   67 if_then: IF expressao $@8 THEN • comando_sem_rotulo
+   52 expressao_simples: expressao_simples • MAIS termo
+   53                  | expressao_simples • MENOS termo
+   59 atribuicao: IDENT $@8 ATRIBUICAO expressao_simples •
 
-    T_BEGIN  deslocar, e ir ao estado 26
-    IDENT    deslocar, e ir ao estado 31
-    IF       deslocar, e ir ao estado 32
-    READ     deslocar, e ir ao estado 34
-    WRITE    deslocar, e ir ao estado 35
+    MAIS   deslocar, e ir ao estado 85
+    MENOS  deslocar, e ir ao estado 86
 
-    $padrão  reduzir usando a regra 60 ($@6)
-
-    comando_composto     ir ao estado 36
-    comando_sem_rotulo   ir ao estado 110
-    leitura              ir ao estado 40
-    escrita              ir ao estado 41
-    atribuicao           ir ao estado 42
-    comando_repetitivo   ir ao estado 44
-    $@6                  ir ao estado 45
-    comando_condicional  ir ao estado 46
-    if_then              ir ao estado 47
+    $padrão  reduzir usando a regra 59 (atribuicao)
 
 
 Estado 100
 
-   49 expressao_simples: expressao_simples MAIS termo •
-   52 termo: termo • ASTERISCO fator
-   53      | termo • DIV fator
+   45 expressao: expressao IGUAL expressao_simples •
+   52 expressao_simples: expressao_simples • MAIS termo
+   53                  | expressao_simples • MENOS termo
 
-    DIV        deslocar, e ir ao estado 78
-    ASTERISCO  deslocar, e ir ao estado 79
+    MAIS   deslocar, e ir ao estado 85
+    MENOS  deslocar, e ir ao estado 86
 
-    $padrão  reduzir usando a regra 49 (expressao_simples)
+    $padrão  reduzir usando a regra 45 (expressao)
 
 
 Estado 101
 
-   50 expressao_simples: expressao_simples MENOS termo •
-   52 termo: termo • ASTERISCO fator
-   53      | termo • DIV fator
+   46 expressao: expressao DIFERENTE expressao_simples •
+   52 expressao_simples: expressao_simples • MAIS termo
+   53                  | expressao_simples • MENOS termo
 
-    DIV        deslocar, e ir ao estado 78
-    ASTERISCO  deslocar, e ir ao estado 79
+    MAIS   deslocar, e ir ao estado 85
+    MENOS  deslocar, e ir ao estado 86
 
-    $padrão  reduzir usando a regra 50 (expressao_simples)
+    $padrão  reduzir usando a regra 46 (expressao)
 
 
 Estado 102
 
-   53 termo: termo DIV fator •
+   48 expressao: expressao MENOR_IGUAL expressao_simples •
+   52 expressao_simples: expressao_simples • MAIS termo
+   53                  | expressao_simples • MENOS termo
 
-    $padrão  reduzir usando a regra 53 (termo)
+    MAIS   deslocar, e ir ao estado 85
+    MENOS  deslocar, e ir ao estado 86
+
+    $padrão  reduzir usando a regra 48 (expressao)
 
 
 Estado 103
 
-   52 termo: termo ASTERISCO fator •
+   50 expressao: expressao MAIOR_IGUAL expressao_simples •
+   52 expressao_simples: expressao_simples • MAIS termo
+   53                  | expressao_simples • MENOS termo
 
-    $padrão  reduzir usando a regra 52 (termo)
+    MAIS   deslocar, e ir ao estado 85
+    MENOS  deslocar, e ir ao estado 86
+
+    $padrão  reduzir usando a regra 50 (expressao)
 
 
 Estado 104
 
-   35 leitura: READ ABRE_PARENTESES lista_leituras FECHA_PARENTESES •
+   47 expressao: expressao MENOR expressao_simples •
+   52 expressao_simples: expressao_simples • MAIS termo
+   53                  | expressao_simples • MENOS termo
 
-    $padrão  reduzir usando a regra 35 (leitura)
+    MAIS   deslocar, e ir ao estado 85
+    MENOS  deslocar, e ir ao estado 86
+
+    $padrão  reduzir usando a regra 47 (expressao)
 
 
 Estado 105
 
-   36 lista_leituras: lista_leituras VIRGULA • simb_leitura
+   49 expressao: expressao MAIOR expressao_simples •
+   52 expressao_simples: expressao_simples • MAIS termo
+   53                  | expressao_simples • MENOS termo
 
-    IDENT  deslocar, e ir ao estado 80
+    MAIS   deslocar, e ir ao estado 85
+    MENOS  deslocar, e ir ao estado 86
 
-    simb_leitura  ir ao estado 111
+    $padrão  reduzir usando a regra 49 (expressao)
 
 
 Estado 106
 
-   39 escrita: WRITE ABRE_PARENTESES lista_escritas FECHA_PARENTESES •
+   70 if_then: IF expressao $@11 THEN • comando_sem_rotulo
+
+    T_BEGIN  deslocar, e ir ao estado 34
+    IDENT    deslocar, e ir ao estado 39
+    IF       deslocar, e ir ao estado 40
+    READ     deslocar, e ir ao estado 42
+    WRITE    deslocar, e ir ao estado 43
+
+    $padrão  reduzir usando a regra 63 ($@9)
 
-    $padrão  reduzir usando a regra 39 (escrita)
+    comando_composto     ir ao estado 44
+    comando_sem_rotulo   ir ao estado 116
+    leitura              ir ao estado 48
+    escrita              ir ao estado 49
+    atribuicao           ir ao estado 50
+    comando_repetitivo   ir ao estado 52
+    $@9                  ir ao estado 53
+    comando_condicional  ir ao estado 54
+    if_then              ir ao estado 55
 
 
 Estado 107
 
-   40 lista_escritas: lista_escritas VIRGULA • expressao_simples
+   52 expressao_simples: expressao_simples MAIS termo •
+   55 termo: termo • ASTERISCO fator
+   56      | termo • DIV fator
 
-    IDENT   deslocar, e ir ao estado 52
-    NUMERO  deslocar, e ir ao estado 53
+    DIV        deslocar, e ir ao estado 87
+    ASTERISCO  deslocar, e ir ao estado 88
 
-    expressao_simples  ir ao estado 112
-    termo              ir ao estado 56
-    fator              ir ao estado 57
+    $padrão  reduzir usando a regra 52 (expressao_simples)
 
 
 Estado 108
 
-   62 comando_repetitivo: $@6 WHILE expressao DO • $@7 comando_sem_rotulo
+   53 expressao_simples: expressao_simples MENOS termo •
+   55 termo: termo • ASTERISCO fator
+   56      | termo • DIV fator
 
-    $padrão  reduzir usando a regra 61 ($@7)
+    DIV        deslocar, e ir ao estado 87
+    ASTERISCO  deslocar, e ir ao estado 88
 
-    $@7  ir ao estado 113
+    $padrão  reduzir usando a regra 53 (expressao_simples)
 
 
 Estado 109
 
-   14 declara_var: $@3 lista_id_var DOIS_PONTOS tipo $@4 • PONTO_E_VIRGULA
+   56 termo: termo DIV fator •
 
-    PONTO_E_VIRGULA  deslocar, e ir ao estado 114
+    $padrão  reduzir usando a regra 56 (termo)
 
 
 Estado 110
 
-   67 if_then: IF expressao $@8 THEN comando_sem_rotulo •
+   55 termo: termo ASTERISCO fator •
 
-    $padrão  reduzir usando a regra 67 (if_then)
+    $padrão  reduzir usando a regra 55 (termo)
 
 
 Estado 111
 
-   36 lista_leituras: lista_leituras VIRGULA simb_leitura •
+   38 leitura: READ ABRE_PARENTESES lista_leituras FECHA_PARENTESES •
 
-    $padrão  reduzir usando a regra 36 (lista_leituras)
+    $padrão  reduzir usando a regra 38 (leitura)
 
 
 Estado 112
 
-   40 lista_escritas: lista_escritas VIRGULA expressao_simples •
-   49 expressao_simples: expressao_simples • MAIS termo
-   50                  | expressao_simples • MENOS termo
+   39 lista_leituras: lista_leituras VIRGULA • simb_leitura
 
-    MAIS   deslocar, e ir ao estado 76
-    MENOS  deslocar, e ir ao estado 77
+    IDENT  deslocar, e ir ao estado 89
 
-    $padrão  reduzir usando a regra 40 (lista_escritas)
+    simb_leitura  ir ao estado 117
 
 
 Estado 113
 
-   62 comando_repetitivo: $@6 WHILE expressao DO $@7 • comando_sem_rotulo
-
-    T_BEGIN  deslocar, e ir ao estado 26
-    IDENT    deslocar, e ir ao estado 31
-    IF       deslocar, e ir ao estado 32
-    READ     deslocar, e ir ao estado 34
-    WRITE    deslocar, e ir ao estado 35
+   42 escrita: WRITE ABRE_PARENTESES lista_escritas FECHA_PARENTESES •
 
-    $padrão  reduzir usando a regra 60 ($@6)
-
-    comando_composto     ir ao estado 36
-    comando_sem_rotulo   ir ao estado 115
-    leitura              ir ao estado 40
-    escrita              ir ao estado 41
-    atribuicao           ir ao estado 42
-    comando_repetitivo   ir ao estado 44
-    $@6                  ir ao estado 45
-    comando_condicional  ir ao estado 46
-    if_then              ir ao estado 47
+    $padrão  reduzir usando a regra 42 (escrita)
 
 
 Estado 114
 
-   14 declara_var: $@3 lista_id_var DOIS_PONTOS tipo $@4 PONTO_E_VIRGULA •
+   43 lista_escritas: lista_escritas VIRGULA • expressao_simples
+
+    IDENT   deslocar, e ir ao estado 61
+    NUMERO  deslocar, e ir ao estado 62
 
-    $padrão  reduzir usando a regra 14 (declara_var)
+    expressao_simples  ir ao estado 118
+    termo              ir ao estado 65
+    fator              ir ao estado 66
 
 
 Estado 115
 
-   62 comando_repetitivo: $@6 WHILE expressao DO $@7 comando_sem_rotulo •
+   65 comando_repetitivo: $@9 WHILE expressao DO • $@10 comando_sem_rotulo
+
+    $padrão  reduzir usando a regra 64 ($@10)
+
+    $@10  ir ao estado 119
+
+
+Estado 116
+
+   70 if_then: IF expressao $@11 THEN comando_sem_rotulo •
+
+    $padrão  reduzir usando a regra 70 (if_then)
+
+
+Estado 117
+
+   39 lista_leituras: lista_leituras VIRGULA simb_leitura •
+
+    $padrão  reduzir usando a regra 39 (lista_leituras)
+
+
+Estado 118
+
+   43 lista_escritas: lista_escritas VIRGULA expressao_simples •
+   52 expressao_simples: expressao_simples • MAIS termo
+   53                  | expressao_simples • MENOS termo
+
+    MAIS   deslocar, e ir ao estado 85
+    MENOS  deslocar, e ir ao estado 86
+
+    $padrão  reduzir usando a regra 43 (lista_escritas)
+
+
+Estado 119
+
+   65 comando_repetitivo: $@9 WHILE expressao DO $@10 • comando_sem_rotulo
+
+    T_BEGIN  deslocar, e ir ao estado 34
+    IDENT    deslocar, e ir ao estado 39
+    IF       deslocar, e ir ao estado 40
+    READ     deslocar, e ir ao estado 42
+    WRITE    deslocar, e ir ao estado 43
+
+    $padrão  reduzir usando a regra 63 ($@9)
+
+    comando_composto     ir ao estado 44
+    comando_sem_rotulo   ir ao estado 120
+    leitura              ir ao estado 48
+    escrita              ir ao estado 49
+    atribuicao           ir ao estado 50
+    comando_repetitivo   ir ao estado 52
+    $@9                  ir ao estado 53
+    comando_condicional  ir ao estado 54
+    if_then              ir ao estado 55
+
+
+Estado 120
+
+   65 comando_repetitivo: $@9 WHILE expressao DO $@10 comando_sem_rotulo •
 
-    $padrão  reduzir usando a regra 62 (comando_repetitivo)
+    $padrão  reduzir usando a regra 65 (comando_repetitivo)
diff --git a/compilador.tab.c b/compilador.tab.c
index 7aa196fadfd7032162ab9d1495d75b42e96a7024..4ab7d2eedc92a4d2ba6575178efe973ac6f85f9d 100644
--- a/compilador.tab.c
+++ b/compilador.tab.c
@@ -163,42 +163,45 @@ enum yysymbol_kind_t
   YYSYMBOL_programa = 44,                  /* programa  */
   YYSYMBOL_45_1 = 45,                      /* $@1  */
   YYSYMBOL_bloco = 46,                     /* bloco  */
-  YYSYMBOL_parte_declara_rotulos = 47,     /* parte_declara_rotulos  */
-  YYSYMBOL_parte_declara_vars = 48,        /* parte_declara_vars  */
-  YYSYMBOL_var = 49,                       /* var  */
-  YYSYMBOL_50_2 = 50,                      /* $@2  */
-  YYSYMBOL_declara_vars = 51,              /* declara_vars  */
-  YYSYMBOL_declara_var = 52,               /* declara_var  */
-  YYSYMBOL_53_3 = 53,                      /* $@3  */
-  YYSYMBOL_54_4 = 54,                      /* $@4  */
-  YYSYMBOL_tipo = 55,                      /* tipo  */
-  YYSYMBOL_lista_id_var = 56,              /* lista_id_var  */
-  YYSYMBOL_lista_idents = 57,              /* lista_idents  */
-  YYSYMBOL_parte_declara_subrotinas = 58,  /* parte_declara_subrotinas  */
-  YYSYMBOL_declaracao_procedimento = 59,   /* declaracao_procedimento  */
-  YYSYMBOL_comando_composto = 60,          /* comando_composto  */
-  YYSYMBOL_comandos = 61,                  /* comandos  */
-  YYSYMBOL_comando = 62,                   /* comando  */
-  YYSYMBOL_comando_sem_rotulo = 63,        /* comando_sem_rotulo  */
-  YYSYMBOL_leitura = 64,                   /* leitura  */
-  YYSYMBOL_lista_leituras = 65,            /* lista_leituras  */
-  YYSYMBOL_simb_leitura = 66,              /* simb_leitura  */
-  YYSYMBOL_escrita = 67,                   /* escrita  */
-  YYSYMBOL_lista_escritas = 68,            /* lista_escritas  */
-  YYSYMBOL_expressao = 69,                 /* expressao  */
-  YYSYMBOL_expressao_simples = 70,         /* expressao_simples  */
-  YYSYMBOL_termo = 71,                     /* termo  */
-  YYSYMBOL_atribuicao = 72,                /* atribuicao  */
-  YYSYMBOL_73_5 = 73,                      /* $@5  */
-  YYSYMBOL_fator = 74,                     /* fator  */
-  YYSYMBOL_numero = 75,                    /* numero  */
-  YYSYMBOL_comando_repetitivo = 76,        /* comando_repetitivo  */
-  YYSYMBOL_77_6 = 77,                      /* $@6  */
-  YYSYMBOL_78_7 = 78,                      /* $@7  */
-  YYSYMBOL_comando_condicional = 79,       /* comando_condicional  */
-  YYSYMBOL_cond_else = 80,                 /* cond_else  */
-  YYSYMBOL_if_then = 81,                   /* if_then  */
-  YYSYMBOL_82_8 = 82                       /* $@8  */
+  YYSYMBOL_47_2 = 47,                      /* $@2  */
+  YYSYMBOL_48_3 = 48,                      /* $@3  */
+  YYSYMBOL_parte_declara_rotulos = 49,     /* parte_declara_rotulos  */
+  YYSYMBOL_parte_declara_vars = 50,        /* parte_declara_vars  */
+  YYSYMBOL_var = 51,                       /* var  */
+  YYSYMBOL_52_4 = 52,                      /* $@4  */
+  YYSYMBOL_declara_vars = 53,              /* declara_vars  */
+  YYSYMBOL_declara_var = 54,               /* declara_var  */
+  YYSYMBOL_55_5 = 55,                      /* $@5  */
+  YYSYMBOL_56_6 = 56,                      /* $@6  */
+  YYSYMBOL_tipo = 57,                      /* tipo  */
+  YYSYMBOL_lista_id_var = 58,              /* lista_id_var  */
+  YYSYMBOL_lista_idents = 59,              /* lista_idents  */
+  YYSYMBOL_parte_declara_subrotinas = 60,  /* parte_declara_subrotinas  */
+  YYSYMBOL_declaracao_procedimento = 61,   /* declaracao_procedimento  */
+  YYSYMBOL_62_7 = 62,                      /* $@7  */
+  YYSYMBOL_comando_composto = 63,          /* comando_composto  */
+  YYSYMBOL_comandos = 64,                  /* comandos  */
+  YYSYMBOL_comando = 65,                   /* comando  */
+  YYSYMBOL_comando_sem_rotulo = 66,        /* comando_sem_rotulo  */
+  YYSYMBOL_leitura = 67,                   /* leitura  */
+  YYSYMBOL_lista_leituras = 68,            /* lista_leituras  */
+  YYSYMBOL_simb_leitura = 69,              /* simb_leitura  */
+  YYSYMBOL_escrita = 70,                   /* escrita  */
+  YYSYMBOL_lista_escritas = 71,            /* lista_escritas  */
+  YYSYMBOL_expressao = 72,                 /* expressao  */
+  YYSYMBOL_expressao_simples = 73,         /* expressao_simples  */
+  YYSYMBOL_termo = 74,                     /* termo  */
+  YYSYMBOL_atribuicao = 75,                /* atribuicao  */
+  YYSYMBOL_76_8 = 76,                      /* $@8  */
+  YYSYMBOL_fator = 77,                     /* fator  */
+  YYSYMBOL_numero = 78,                    /* numero  */
+  YYSYMBOL_comando_repetitivo = 79,        /* comando_repetitivo  */
+  YYSYMBOL_80_9 = 80,                      /* $@9  */
+  YYSYMBOL_81_10 = 81,                     /* $@10  */
+  YYSYMBOL_comando_condicional = 82,       /* comando_condicional  */
+  YYSYMBOL_cond_else = 83,                 /* cond_else  */
+  YYSYMBOL_if_then = 84,                   /* if_then  */
+  YYSYMBOL_85_11 = 85                      /* $@11  */
 };
 typedef enum yysymbol_kind_t yysymbol_kind_t;
 
@@ -526,16 +529,16 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   97
+#define YYLAST   105
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  43
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  40
+#define YYNNTS  43
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  68
+#define YYNRULES  71
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  116
+#define YYNSTATES  121
 
 /* YYMAXUTOK -- Last valid token kind.  */
 #define YYMAXUTOK   297
@@ -588,13 +591,14 @@ static const yytype_int8 yytranslate[] =
 /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,    42,    42,    42,    55,    69,    70,    73,    77,    77,
-      78,    81,    82,    85,    88,    85,    96,   109,   118,   129,
-     130,   134,   138,   139,   143,   146,   147,   148,   151,   152,
-     155,   156,   157,   158,   159,   160,   166,   169,   170,   173,
-     182,   185,   188,   193,   196,   199,   202,   205,   208,   211,
-     214,   217,   220,   223,   226,   229,   232,   232,   249,   260,
-     267,   269,   276,   269,   302,   309,   311,   314,   314
+       0,    42,    42,    42,    58,    69,    55,    85,    86,    89,
+      93,    93,    94,    97,    98,   101,   104,   101,   112,   125,
+     134,   145,   146,   150,   152,   156,   156,   178,   181,   182,
+     183,   186,   187,   190,   191,   192,   193,   194,   195,   201,
+     204,   205,   208,   217,   220,   223,   228,   231,   234,   237,
+     240,   243,   246,   249,   252,   255,   258,   261,   264,   267,
+     267,   284,   295,   302,   304,   311,   304,   337,   344,   346,
+     349,   349
 };
 #endif
 
@@ -617,15 +621,15 @@ static const char *const yytname[] =
   "ELSE", "WHILE", "DO", "OR", "DIV", "AND", "NOT", "IGUAL", "DIFERENTE",
   "MENOR_IGUAL", "MAIOR_IGUAL", "MENOR", "MAIOR", "MAIS", "MENOS",
   "ASTERISCO", "NUMERO", "READ", "WRITE", "LOWER_THAN_ELSE", "$accept",
-  "programa", "$@1", "bloco", "parte_declara_rotulos",
-  "parte_declara_vars", "var", "$@2", "declara_vars", "declara_var", "$@3",
-  "$@4", "tipo", "lista_id_var", "lista_idents",
-  "parte_declara_subrotinas", "declaracao_procedimento",
+  "programa", "$@1", "bloco", "$@2", "$@3", "parte_declara_rotulos",
+  "parte_declara_vars", "var", "$@4", "declara_vars", "declara_var", "$@5",
+  "$@6", "tipo", "lista_id_var", "lista_idents",
+  "parte_declara_subrotinas", "declaracao_procedimento", "$@7",
   "comando_composto", "comandos", "comando", "comando_sem_rotulo",
   "leitura", "lista_leituras", "simb_leitura", "escrita", "lista_escritas",
-  "expressao", "expressao_simples", "termo", "atribuicao", "$@5", "fator",
-  "numero", "comando_repetitivo", "$@6", "$@7", "comando_condicional",
-  "cond_else", "if_then", "$@8", YY_NULLPTR
+  "expressao", "expressao_simples", "termo", "atribuicao", "$@8", "fator",
+  "numero", "comando_repetitivo", "$@9", "$@10", "comando_condicional",
+  "cond_else", "if_then", "$@11", YY_NULLPTR
 };
 
 static const char *
@@ -635,12 +639,12 @@ yysymbol_name (yysymbol_kind_t yysymbol)
 }
 #endif
 
-#define YYPACT_NINF (-63)
+#define YYPACT_NINF (-72)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
 
-#define YYTABLE_NINF (-62)
+#define YYTABLE_NINF (-65)
 
 #define yytable_value_is_error(Yyn) \
   0
@@ -649,18 +653,19 @@ yysymbol_name (yysymbol_kind_t yysymbol)
    STATE-NUM.  */
 static const yytype_int8 yypact[] =
 {
-     -63,     5,    16,   -63,     8,    26,    19,   -63,     3,    31,
-      32,    35,   -63,    56,    57,    53,   -63,   -63,    49,   -63,
-      58,    55,    59,   -63,   -63,   -63,     7,   -63,    60,   -63,
-      61,   -63,   -10,   -63,    67,    68,   -63,    64,    69,   -63,
-     -63,   -63,   -63,    70,   -63,    62,   -63,    54,   -63,   -63,
-      -2,    65,   -63,   -63,    24,   -13,   -20,   -63,    71,   -10,
-     -63,     7,    12,   -10,    12,   -63,    72,    74,   -10,   -10,
-     -10,   -10,   -10,   -10,   -10,    66,   -10,   -10,   -10,   -10,
-     -63,    21,   -63,    30,   -13,   -63,   -63,     9,   -63,   -63,
-     -63,   -63,   -13,   -13,   -13,   -13,   -13,   -13,   -13,    12,
-     -20,   -20,   -63,   -63,   -63,    71,   -63,   -10,   -63,    73,
-     -63,   -63,   -13,    12,   -63,   -63
+     -72,    28,     5,   -72,     9,    26,    19,   -72,    -1,    53,
+      33,    48,   -72,    58,    56,    54,   -72,   -72,   -72,   -72,
+      55,   -72,   -72,    50,    57,   -72,    59,    60,    61,   -72,
+     -72,   -72,    13,   -72,    10,   -72,    62,    63,    67,   -72,
+     -10,   -72,    65,    73,   -72,    68,    71,   -72,   -72,   -72,
+     -72,    72,   -72,    64,   -72,    66,   -72,   -72,   -72,    48,
+      69,   -72,   -72,    22,   -12,   -20,   -72,    74,   -10,   -72,
+      10,    -4,   -10,    -4,   -72,    75,   -72,   -10,   -10,   -10,
+     -10,   -10,   -10,   -10,    70,   -10,   -10,   -10,   -10,   -72,
+      21,   -72,    39,   -12,   -72,   -72,     8,   -72,   -72,   -12,
+     -12,   -12,   -12,   -12,   -12,   -12,    -4,   -20,   -20,   -72,
+     -72,   -72,    74,   -72,   -10,   -72,   -72,   -72,   -12,    -4,
+     -72
 };
 
 /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -668,36 +673,39 @@ static const yytype_int8 yypact[] =
    means the default is an error.  */
 static const yytype_int8 yydefact[] =
 {
-       2,     0,     0,     1,     0,     0,     0,    20,     0,     0,
-       0,     6,    19,     0,     0,    10,     5,     3,    23,     7,
-       0,     0,     0,    21,    13,    22,    27,     4,     9,    12,
-       0,    56,     0,    60,     0,     0,    31,     0,     0,    29,
-      34,    35,    30,     0,    33,     0,    32,    66,    11,    18,
-       0,     0,    58,    59,    67,    49,    52,    55,     0,     0,
-      24,    26,    61,     0,    61,    64,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      39,     0,    38,     0,    42,    25,    28,     0,    65,    17,
-      16,    14,    57,    43,    44,    46,    48,    45,    47,    61,
-      50,    51,    54,    53,    36,     0,    40,     0,    62,     0,
-      68,    37,    41,    61,    15,    63
+       2,     0,     0,     1,     0,     0,     0,    22,     0,     0,
+       0,     8,    21,     0,     0,    12,     7,     3,     4,     9,
+       0,    24,    15,     5,    11,    14,     0,     0,     0,    23,
+      13,    20,     0,    25,    30,     6,     0,     0,     0,    59,
+       0,    63,     0,     0,    34,     0,     0,    32,    37,    38,
+      33,     0,    36,     0,    35,    69,    19,    18,    16,     8,
+       0,    61,    62,    70,    52,    55,    58,     0,     0,    27,
+      29,    64,     0,    64,    67,     0,    26,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    42,
+       0,    41,     0,    45,    28,    31,     0,    68,    17,    60,
+      46,    47,    49,    51,    48,    50,    64,    53,    54,    57,
+      56,    39,     0,    43,     0,    65,    71,    40,    44,    64,
+      66
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] =
 {
-     -63,   -63,   -63,   -63,   -63,   -63,   -63,   -63,   -63,    63,
-     -63,   -63,   -63,   -63,   -63,   -63,   -63,    75,    20,   -63,
-     -62,   -63,   -63,   -23,   -63,   -63,    27,   -58,   -16,   -63,
-     -63,   -15,   -63,   -63,   -63,   -63,   -63,   -63,   -63,   -63
+     -72,   -72,   -72,    25,   -72,   -72,   -72,   -72,   -72,   -72,
+     -72,    76,   -72,   -72,   -72,   -72,   -72,   -72,   -72,   -72,
+      77,    11,   -72,   -71,   -72,   -72,   -22,   -72,   -72,    14,
+     -67,   -27,   -72,   -72,   -26,   -72,   -72,   -72,   -72,   -72,
+     -72,   -72,   -72
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int8 yydefgoto[] =
 {
-       0,     1,     2,    14,    15,    18,    19,    20,    28,    29,
-      30,   109,    91,    50,     8,    22,    23,    36,    37,    38,
-      39,    40,    81,    82,    41,    83,    54,    55,    56,    42,
-      51,    57,    43,    44,    45,   113,    46,    65,    47,    75
+       0,     1,     2,    14,    21,    28,    15,    18,    19,    20,
+      24,    25,    26,    75,    58,    32,     8,    23,    29,    38,
+      44,    45,    46,    47,    48,    90,    91,    49,    92,    63,
+      64,    65,    50,    60,    66,    51,    52,    53,   119,    54,
+      74,    55,    84
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -705,72 +713,77 @@ static const yytype_int8 yydefgoto[] =
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int8 yytable[] =
 {
-      86,    84,    88,    52,    66,     3,    67,    78,     9,    10,
-      92,    93,    94,    95,    96,    97,    98,    26,    79,     4,
-      31,     5,    26,    76,    77,    31,   104,   105,    32,    53,
-       6,   -61,     7,    32,   108,   106,   107,   110,    11,    69,
-      70,    71,    72,    73,    74,    12,    33,    34,    35,   112,
-      13,   115,    34,    35,    69,    70,    71,    72,    73,    74,
-     100,   101,    16,   102,   103,    -8,    17,    21,    25,    26,
-      24,    58,    59,   -13,    49,    60,    61,    64,    62,    68,
-     114,    85,   111,     0,    80,    89,    63,    90,    99,     0,
-      87,    48,     0,     0,     0,     0,     0,    27
+      95,    93,    97,    61,     9,    10,    34,    87,     4,    39,
+      99,   100,   101,   102,   103,   104,   105,    40,    88,    36,
+      34,    37,     5,    39,    85,    86,   111,   112,     3,    62,
+       6,    40,     7,   115,   -64,   116,    42,    43,    78,    79,
+      80,    81,    82,    83,   113,   114,    12,   118,   120,    41,
+      42,    43,    78,    79,    80,    81,    82,    83,   107,   108,
+      11,   109,   110,    13,    16,    17,   -10,    22,    27,    67,
+     -15,    34,    31,    33,    59,    56,    57,    68,    70,    69,
+      71,    94,    98,    77,    76,     0,    96,    89,    72,    73,
+     117,     0,   106,     0,     0,     0,     0,     0,     0,     0,
+      30,     0,     0,     0,     0,    35
 };
 
 static const yytype_int8 yycheck[] =
 {
-      62,    59,    64,    13,     6,     0,     8,    27,     5,     6,
-      68,    69,    70,    71,    72,    73,    74,    10,    38,     3,
-      13,    13,    10,    36,    37,    13,     5,     6,    21,    39,
-       4,    24,    13,    21,    25,     5,     6,    99,     7,    30,
-      31,    32,    33,    34,    35,    13,    39,    40,    41,   107,
-      15,   113,    40,    41,    30,    31,    32,    33,    34,    35,
-      76,    77,     6,    78,    79,    12,     9,    18,    13,    10,
-      12,     4,     4,    13,    13,    11,     7,    23,     8,    14,
-       7,    61,   105,    -1,    13,    13,    24,    13,    22,    -1,
-      63,    28,    -1,    -1,    -1,    -1,    -1,    22
+      71,    68,    73,    13,     5,     6,    10,    27,     3,    13,
+      77,    78,    79,    80,    81,    82,    83,    21,    38,     6,
+      10,     8,    13,    13,    36,    37,     5,     6,     0,    39,
+       4,    21,    13,    25,    24,   106,    40,    41,    30,    31,
+      32,    33,    34,    35,     5,     6,    13,   114,   119,    39,
+      40,    41,    30,    31,    32,    33,    34,    35,    85,    86,
+       7,    87,    88,    15,     6,     9,    12,    12,    18,     4,
+      13,    10,    13,    13,     7,    13,    13,     4,     7,    11,
+       8,    70,     7,    14,    59,    -1,    72,    13,    24,    23,
+     112,    -1,    22,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      24,    -1,    -1,    -1,    -1,    28
 };
 
 /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
    state STATE-NUM.  */
 static const yytype_int8 yystos[] =
 {
-       0,    44,    45,     0,     3,    13,     4,    13,    57,     5,
-       6,     7,    13,    15,    46,    47,     6,     9,    48,    49,
-      50,    18,    58,    59,    12,    13,    10,    60,    51,    52,
-      53,    13,    21,    39,    40,    41,    60,    61,    62,    63,
-      64,    67,    72,    75,    76,    77,    79,    81,    52,    13,
-      56,    73,    13,    39,    69,    70,    71,    74,     4,     4,
-      11,     7,     8,    24,    23,    80,     6,     8,    14,    30,
-      31,    32,    33,    34,    35,    82,    36,    37,    27,    38,
-      13,    65,    66,    68,    70,    61,    63,    69,    63,    13,
-      13,    55,    70,    70,    70,    70,    70,    70,    70,    22,
-      71,    71,    74,    74,     5,     6,     5,     6,    25,    54,
-      63,    66,    70,    78,     7,    63
+       0,    44,    45,     0,     3,    13,     4,    13,    59,     5,
+       6,     7,    13,    15,    46,    49,     6,     9,    50,    51,
+      52,    47,    12,    60,    53,    54,    55,    18,    48,    61,
+      54,    13,    58,    13,    10,    63,     6,     8,    62,    13,
+      21,    39,    40,    41,    63,    64,    65,    66,    67,    70,
+      75,    78,    79,    80,    82,    84,    13,    13,    57,     7,
+      76,    13,    39,    72,    73,    74,    77,     4,     4,    11,
+       7,     8,    24,    23,    83,    56,    46,    14,    30,    31,
+      32,    33,    34,    35,    85,    36,    37,    27,    38,    13,
+      68,    69,    71,    73,    64,    66,    72,    66,     7,    73,
+      73,    73,    73,    73,    73,    73,    22,    74,    74,    77,
+      77,     5,     6,     5,     6,    25,    66,    69,    73,    81,
+      66
 };
 
 /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM.  */
 static const yytype_int8 yyr1[] =
 {
-       0,    43,    45,    44,    46,    47,    47,    48,    50,    49,
-      49,    51,    51,    53,    54,    52,    55,    56,    56,    57,
-      57,    58,    59,    59,    60,    61,    61,    61,    62,    62,
-      63,    63,    63,    63,    63,    63,    64,    65,    65,    66,
-      67,    68,    68,    69,    69,    69,    69,    69,    69,    69,
-      70,    70,    70,    71,    71,    71,    73,    72,    74,    74,
-      75,    77,    78,    76,    79,    80,    80,    82,    81
+       0,    43,    45,    44,    47,    48,    46,    49,    49,    50,
+      52,    51,    51,    53,    53,    55,    56,    54,    57,    58,
+      58,    59,    59,    60,    60,    62,    61,    63,    64,    64,
+      64,    65,    65,    66,    66,    66,    66,    66,    66,    67,
+      68,    68,    69,    70,    71,    71,    72,    72,    72,    72,
+      72,    72,    72,    73,    73,    73,    74,    74,    74,    76,
+      75,    77,    77,    78,    80,    81,    79,    82,    83,    83,
+      85,    84
 };
 
 /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM.  */
 static const yytype_int8 yyr2[] =
 {
-       0,     2,     0,     9,     4,     2,     0,     1,     0,     3,
-       0,     2,     1,     0,     0,     6,     1,     3,     1,     3,
-       1,     1,     2,     0,     3,     3,     2,     0,     3,     1,
-       1,     1,     1,     1,     1,     1,     4,     3,     1,     1,
-       4,     3,     1,     3,     3,     3,     3,     3,     3,     1,
-       3,     3,     1,     3,     3,     1,     0,     4,     1,     1,
-       1,     0,     0,     6,     2,     2,     0,     0,     5
+       0,     2,     0,     9,     0,     0,     6,     2,     0,     1,
+       0,     3,     0,     2,     1,     0,     0,     6,     1,     3,
+       1,     3,     1,     2,     0,     0,     5,     3,     3,     2,
+       0,     3,     1,     1,     1,     1,     1,     1,     1,     4,
+       3,     1,     1,     4,     3,     1,     3,     3,     3,     3,
+       3,     3,     1,     3,     3,     1,     3,     3,     1,     0,
+       4,     1,     1,     1,     0,     0,     6,     2,     2,     0,
+       0,     5
 };
 
 
@@ -1238,7 +1251,7 @@ yyreduce:
              {
              geraCodigo (NULL, "INPP");
              }
-#line 1242 "compilador.tab.c"
+#line 1255 "compilador.tab.c"
     break;
 
   case 3: /* programa: $@1 PROGRAM IDENT ABRE_PARENTESES lista_idents FECHA_PARENTESES PONTO_E_VIRGULA bloco PONTO  */
@@ -1246,11 +1259,36 @@ yyreduce:
              {
                geraCodigo (NULL, "PARA");
              }
-#line 1250 "compilador.tab.c"
+#line 1263 "compilador.tab.c"
     break;
 
-  case 4: /* bloco: parte_declara_rotulos parte_declara_vars parte_declara_subrotinas comando_composto  */
-#line 59 "compilador.y"
+  case 4: /* $@2: %empty  */
+#line 58 "compilador.y"
+         {
+            char r_main[4];
+            sprintf(r_main, "R%02d", rot_id);
+            empilha(r_main, rot);
+            rot_id += 1;
+            char buffer[50];
+            strcpy(buffer,"DSVS ");
+            strcat(buffer,r_main);
+            geraCodigo(NULL,buffer);
+         }
+#line 1278 "compilador.tab.c"
+    break;
+
+  case 5: /* $@3: %empty  */
+#line 69 "compilador.y"
+         {
+            char r_main[4];
+            desempilha(r_main,rot);
+            geraCodigo(r_main,"NADA");
+         }
+#line 1288 "compilador.tab.c"
+    break;
+
+  case 6: /* bloco: parte_declara_rotulos parte_declara_vars $@2 parte_declara_subrotinas $@3 comando_composto  */
+#line 75 "compilador.y"
                           {
             retira(desloc,ts);
             char buffer[50];
@@ -1258,33 +1296,33 @@ yyreduce:
             geraCodigo(NULL,buffer);
             desloc = 0;
          }
-#line 1262 "compilador.tab.c"
+#line 1300 "compilador.tab.c"
     break;
 
-  case 8: /* $@2: %empty  */
-#line 77 "compilador.y"
+  case 10: /* $@4: %empty  */
+#line 93 "compilador.y"
               { }
-#line 1268 "compilador.tab.c"
+#line 1306 "compilador.tab.c"
     break;
 
-  case 13: /* $@3: %empty  */
-#line 85 "compilador.y"
+  case 15: /* $@5: %empty  */
+#line 101 "compilador.y"
               { num_vars = 0; }
-#line 1274 "compilador.tab.c"
+#line 1312 "compilador.tab.c"
     break;
 
-  case 14: /* $@4: %empty  */
-#line 88 "compilador.y"
+  case 16: /* $@6: %empty  */
+#line 104 "compilador.y"
               { /* AMEM num_vars */
                char buffer[50];
                sprintf(buffer, "AMEM %d", num_vars);
                geraCodigo(NULL, buffer);
               }
-#line 1284 "compilador.tab.c"
+#line 1322 "compilador.tab.c"
     break;
 
-  case 16: /* tipo: IDENT  */
-#line 97 "compilador.y"
+  case 18: /* tipo: IDENT  */
+#line 113 "compilador.y"
                {
                 if (strcmp(token, "integer") == 0) {
                     atualiza_tipo(num_vars, INTEIRO, ts);
@@ -1295,11 +1333,11 @@ yyreduce:
                 }
                 //mostra_ts(ts); // Mostra a tabela após a inserção
                }
-#line 1299 "compilador.tab.c"
+#line 1337 "compilador.tab.c"
     break;
 
-  case 17: /* lista_id_var: lista_id_var VIRGULA IDENT  */
-#line 110 "compilador.y"
+  case 19: /* lista_id_var: lista_id_var VIRGULA IDENT  */
+#line 126 "compilador.y"
               { /* insere �ltima vars na tabela de s�mbolos */ 
                num_vars += 1;
                info_t info;
@@ -1308,11 +1346,11 @@ yyreduce:
                insere_ts(token,VS,nivel_lexico,info,ts);
                desloc += 1;
               }
-#line 1312 "compilador.tab.c"
+#line 1350 "compilador.tab.c"
     break;
 
-  case 18: /* lista_id_var: IDENT  */
-#line 118 "compilador.y"
+  case 20: /* lista_id_var: IDENT  */
+#line 134 "compilador.y"
                     { 
                num_vars += 1;
                info_t info;
@@ -1322,11 +1360,39 @@ yyreduce:
                desloc += 1;
                /* insere vars na tabela de s�mbolos */
             }
-#line 1326 "compilador.tab.c"
+#line 1364 "compilador.tab.c"
     break;
 
-  case 39: /* simb_leitura: IDENT  */
-#line 173 "compilador.y"
+  case 25: /* $@7: %empty  */
+#line 156 "compilador.y"
+                                         {
+             // Insere o procedimento na tabela de símbolos
+            info_t info;
+            char r_proc[4];
+            sprintf(r_proc, "R%02d", rot_id);
+            rot_id += 1;
+            info.pr.rot = r_proc;
+            info.pr.quant = 0;
+            info.pr.param = NULL;
+            nivel_lexico += 1;
+            insere_ts(token, PR, nivel_lexico, info, ts);
+
+            char buffer[50];
+            sprintf(buffer,"ENPR %d",nivel_lexico);
+            geraCodigo(r_proc,buffer);
+            //mostra_ts(ts);
+            }
+#line 1386 "compilador.tab.c"
+    break;
+
+  case 26: /* declaracao_procedimento: PROCEDURE IDENT $@7 PONTO_E_VIRGULA bloco  */
+#line 174 "compilador.y"
+            { nivel_lexico -= 1; }
+#line 1392 "compilador.tab.c"
+    break;
+
+  case 42: /* simb_leitura: IDENT  */
+#line 208 "compilador.y"
                     {
                geraCodigo(NULL, "LEIT");
                l_elem = busca(token,ts);
@@ -1334,107 +1400,107 @@ yyreduce:
                sprintf(buffer,"ARMZ %d,%d",l_elem->nivel,l_elem->info.vs.desloc);
                geraCodigo(NULL,buffer);
             }
-#line 1338 "compilador.tab.c"
+#line 1404 "compilador.tab.c"
     break;
 
-  case 41: /* lista_escritas: lista_escritas VIRGULA expressao_simples  */
-#line 185 "compilador.y"
+  case 44: /* lista_escritas: lista_escritas VIRGULA expressao_simples  */
+#line 220 "compilador.y"
                                                          {
                geraCodigo(NULL,"IMPR");
             }
-#line 1346 "compilador.tab.c"
+#line 1412 "compilador.tab.c"
     break;
 
-  case 42: /* lista_escritas: expressao_simples  */
-#line 188 "compilador.y"
+  case 45: /* lista_escritas: expressao_simples  */
+#line 223 "compilador.y"
                                 {
                geraCodigo(NULL,"IMPR");
             }
-#line 1354 "compilador.tab.c"
+#line 1420 "compilador.tab.c"
     break;
 
-  case 43: /* expressao: expressao IGUAL expressao_simples  */
-#line 193 "compilador.y"
+  case 46: /* expressao: expressao IGUAL expressao_simples  */
+#line 228 "compilador.y"
                                              {
             geraCodigo(NULL, "CMIG"); // Adiciona operação de cmig
          }
-#line 1362 "compilador.tab.c"
+#line 1428 "compilador.tab.c"
     break;
 
-  case 44: /* expressao: expressao DIFERENTE expressao_simples  */
-#line 196 "compilador.y"
+  case 47: /* expressao: expressao DIFERENTE expressao_simples  */
+#line 231 "compilador.y"
                                                 {
             geraCodigo(NULL, "CMDG"); // Adiciona operação de cmdg
          }
-#line 1370 "compilador.tab.c"
+#line 1436 "compilador.tab.c"
     break;
 
-  case 45: /* expressao: expressao MENOR expressao_simples  */
-#line 199 "compilador.y"
+  case 48: /* expressao: expressao MENOR expressao_simples  */
+#line 234 "compilador.y"
                                              {
             geraCodigo(NULL, "CMME"); // Adiciona operação de cmme
          }
-#line 1378 "compilador.tab.c"
+#line 1444 "compilador.tab.c"
     break;
 
-  case 46: /* expressao: expressao MENOR_IGUAL expressao_simples  */
-#line 202 "compilador.y"
+  case 49: /* expressao: expressao MENOR_IGUAL expressao_simples  */
+#line 237 "compilador.y"
                                                    {
             geraCodigo(NULL, "CMEG"); // Adiciona operação de cmeg
          }
-#line 1386 "compilador.tab.c"
+#line 1452 "compilador.tab.c"
     break;
 
-  case 47: /* expressao: expressao MAIOR expressao_simples  */
-#line 205 "compilador.y"
+  case 50: /* expressao: expressao MAIOR expressao_simples  */
+#line 240 "compilador.y"
                                              {
             geraCodigo(NULL, "CMMA"); // Adiciona operação de cmma
          }
-#line 1394 "compilador.tab.c"
+#line 1460 "compilador.tab.c"
     break;
 
-  case 48: /* expressao: expressao MAIOR_IGUAL expressao_simples  */
-#line 208 "compilador.y"
+  case 51: /* expressao: expressao MAIOR_IGUAL expressao_simples  */
+#line 243 "compilador.y"
                                                    {
             geraCodigo(NULL, "CMAG"); // Adiciona operação de cmag
          }
-#line 1402 "compilador.tab.c"
+#line 1468 "compilador.tab.c"
     break;
 
-  case 50: /* expressao_simples: expressao_simples MAIS termo  */
-#line 214 "compilador.y"
+  case 53: /* expressao_simples: expressao_simples MAIS termo  */
+#line 249 "compilador.y"
                                                 {
                geraCodigo(NULL, "SOMA"); // Adiciona operação de soma
             }
-#line 1410 "compilador.tab.c"
+#line 1476 "compilador.tab.c"
     break;
 
-  case 51: /* expressao_simples: expressao_simples MENOS termo  */
-#line 217 "compilador.y"
+  case 54: /* expressao_simples: expressao_simples MENOS termo  */
+#line 252 "compilador.y"
                                             {
                geraCodigo(NULL, "SUBT"); // Adiciona operação de subt
             }
-#line 1418 "compilador.tab.c"
+#line 1484 "compilador.tab.c"
     break;
 
-  case 53: /* termo: termo ASTERISCO fator  */
-#line 223 "compilador.y"
+  case 56: /* termo: termo ASTERISCO fator  */
+#line 258 "compilador.y"
                              {
                geraCodigo(NULL, "MULT"); // Adiciona operação de mult
             }
-#line 1426 "compilador.tab.c"
+#line 1492 "compilador.tab.c"
     break;
 
-  case 54: /* termo: termo DIV fator  */
-#line 226 "compilador.y"
+  case 57: /* termo: termo DIV fator  */
+#line 261 "compilador.y"
                               {
                geraCodigo(NULL, "DIVI"); // Adiciona operação de divi
             }
-#line 1434 "compilador.tab.c"
+#line 1500 "compilador.tab.c"
     break;
 
-  case 56: /* $@5: %empty  */
-#line 232 "compilador.y"
+  case 59: /* $@8: %empty  */
+#line 267 "compilador.y"
                   {
     // Busca variável no lado esquerdo
     l_elem = busca(token, ts);
@@ -1445,22 +1511,22 @@ yyreduce:
         destino_desloc = l_elem->info.vs.desloc;
     }
 }
-#line 1449 "compilador.tab.c"
+#line 1515 "compilador.tab.c"
     break;
 
-  case 57: /* atribuicao: IDENT $@5 ATRIBUICAO expressao_simples  */
-#line 241 "compilador.y"
+  case 60: /* atribuicao: IDENT $@8 ATRIBUICAO expressao_simples  */
+#line 276 "compilador.y"
                                {
     // Gera código ARMZ para armazenar valor
     char buffer[50];
     sprintf(buffer, "ARMZ %d,%d", destino_nivel, destino_desloc);
     geraCodigo(NULL, buffer);
 }
-#line 1460 "compilador.tab.c"
+#line 1526 "compilador.tab.c"
     break;
 
-  case 58: /* fator: IDENT  */
-#line 249 "compilador.y"
+  case 61: /* fator: IDENT  */
+#line 284 "compilador.y"
              {
     // Carrega variável
     l_elem = busca(token, ts);
@@ -1472,22 +1538,22 @@ yyreduce:
         geraCodigo(NULL, buffer);
     }
 }
-#line 1476 "compilador.tab.c"
+#line 1542 "compilador.tab.c"
     break;
 
-  case 59: /* fator: NUMERO  */
-#line 260 "compilador.y"
+  case 62: /* fator: NUMERO  */
+#line 295 "compilador.y"
          {
     // Empilha constante
     char buffer[50];
     sprintf(buffer, "CRCT %s", token);
     geraCodigo(NULL, buffer);
 }
-#line 1487 "compilador.tab.c"
+#line 1553 "compilador.tab.c"
     break;
 
-  case 61: /* $@6: %empty  */
-#line 269 "compilador.y"
+  case 64: /* $@9: %empty  */
+#line 304 "compilador.y"
                     {
                char r_ini[4];
                sprintf(r_ini, "R%02d", rot_id);
@@ -1495,11 +1561,11 @@ yyreduce:
                rot_id += 1;
                geraCodigo(r_ini,"NADA");
             }
-#line 1499 "compilador.tab.c"
+#line 1565 "compilador.tab.c"
     break;
 
-  case 62: /* $@7: %empty  */
-#line 276 "compilador.y"
+  case 65: /* $@10: %empty  */
+#line 311 "compilador.y"
                                {
                char r_fim[4];
                sprintf(r_fim, "R%02d", rot_id);
@@ -1510,11 +1576,11 @@ yyreduce:
                strcat(buffer,r_fim);
                geraCodigo(NULL,buffer);
             }
-#line 1514 "compilador.tab.c"
+#line 1580 "compilador.tab.c"
     break;
 
-  case 63: /* comando_repetitivo: $@6 WHILE expressao DO $@7 comando_sem_rotulo  */
-#line 286 "compilador.y"
+  case 66: /* comando_repetitivo: $@9 WHILE expressao DO $@10 comando_sem_rotulo  */
+#line 321 "compilador.y"
                                {
                char r_ini[4];
                char r_fim[4];
@@ -1529,21 +1595,21 @@ yyreduce:
 
                geraCodigo(r_fim,"NADA");
             }
-#line 1533 "compilador.tab.c"
+#line 1599 "compilador.tab.c"
     break;
 
-  case 64: /* comando_condicional: if_then cond_else  */
-#line 302 "compilador.y"
+  case 67: /* comando_condicional: if_then cond_else  */
+#line 337 "compilador.y"
                                        {
                char r_fim[4];
                desempilha(r_fim,rot);
                geraCodigo(r_fim,"NADA");
             }
-#line 1543 "compilador.tab.c"
+#line 1609 "compilador.tab.c"
     break;
 
-  case 67: /* $@8: %empty  */
-#line 314 "compilador.y"
+  case 70: /* $@11: %empty  */
+#line 349 "compilador.y"
                       {
                char r_else[4];
                sprintf(r_else,"R%02d",rot_id);
@@ -1559,11 +1625,11 @@ yyreduce:
                empilha(r_fim, rot);
                rot_id += 1;
             }
-#line 1563 "compilador.tab.c"
+#line 1629 "compilador.tab.c"
     break;
 
-  case 68: /* if_then: IF expressao $@8 THEN comando_sem_rotulo  */
-#line 329 "compilador.y"
+  case 71: /* if_then: IF expressao $@11 THEN comando_sem_rotulo  */
+#line 364 "compilador.y"
                                     {
                char r_fim[4];
                desempilha(r_fim,rot);
@@ -1578,11 +1644,11 @@ yyreduce:
 
                geraCodigo(r_else,"NADA");
             }
-#line 1582 "compilador.tab.c"
+#line 1648 "compilador.tab.c"
     break;
 
 
-#line 1586 "compilador.tab.c"
+#line 1652 "compilador.tab.c"
 
       default: break;
     }
@@ -1775,7 +1841,7 @@ yyreturnlab:
   return yyresult;
 }
 
-#line 346 "compilador.y"
+#line 381 "compilador.y"
 
 
 int main (int argc, char** argv) {
diff --git a/compilador.y b/compilador.y
index 5f266212c596a3d87c2f5405a9780a8a17e98713..d231df921b8ba07c3a6282616c928e905b5a1746 100644
--- a/compilador.y
+++ b/compilador.y
@@ -54,7 +54,23 @@ programa    :{
 bloco       :
 	      parte_declara_rotulos
          parte_declara_vars
+
+         {
+            char r_main[4];
+            sprintf(r_main, "R%02d", rot_id);
+            empilha(r_main, rot);
+            rot_id += 1;
+            char buffer[50];
+            strcpy(buffer,"DSVS ");
+            strcat(buffer,r_main);
+            geraCodigo(NULL,buffer);
+         }
 	      parte_declara_subrotinas
+         {
+            char r_main[4];
+            desempilha(r_main,rot);
+            geraCodigo(r_main,"NADA");
+         }
 
          comando_composto {
             retira(desloc,ts);
@@ -131,12 +147,31 @@ lista_idents: lista_idents VIRGULA IDENT
 ;
 
 // REGRA 11
-parte_declara_subrotinas: declaracao_procedimento 
+parte_declara_subrotinas: parte_declara_subrotinas
+            declaracao_procedimento 
+            |
 ;
 
 // REGRA 12
-declaracao_procedimento: PROCEDURE IDENT
-            |
+declaracao_procedimento: PROCEDURE IDENT {
+             // Insere o procedimento na tabela de símbolos
+            info_t info;
+            char r_proc[4];
+            sprintf(r_proc, "R%02d", rot_id);
+            rot_id += 1;
+            info.pr.rot = r_proc;
+            info.pr.quant = 0;
+            info.pr.param = NULL;
+            nivel_lexico += 1;
+            insere_ts(token, PR, nivel_lexico, info, ts);
+
+            char buffer[50];
+            sprintf(buffer,"ENPR %d",nivel_lexico);
+            geraCodigo(r_proc,buffer);
+            //mostra_ts(ts);
+            }
+            PONTO_E_VIRGULA bloco
+            { nivel_lexico -= 1; }
 ;
 
 
diff --git a/teste6.pas b/teste6.pas
index d72b688918ae7f953f310c3e404f71de9b2c193f..52ee27eb605a7574abaf28dd72792427474d6354 100644
--- a/teste6.pas
+++ b/teste6.pas
@@ -1,5 +1,10 @@
 program proc1 (input, output);
     var x: integer;
+    procedure p;
+    var z: integer;
+    begin
+        z := 3;
+    end
 begin
     x := 8;
 end.
\ No newline at end of file