diff --git a/MEPA b/MEPA
index 4c145d867255a722b297b6e5777dd85f14ec8e34..94c8cc4ee473269407a817fff459fe29bdbbde73 100644
--- a/MEPA
+++ b/MEPA
@@ -1,15 +1,15 @@
      INPP
      AMEM 1
-     DSVS R00
-R01: ENPR 1 
      AMEM 1
-     DSVS R02
-R02: NADA 
-     CRCT 3
-     ARMZ 1,1
-     DMEM 2
+     DSVS R00
 R00: NADA 
-     CRCT 8
+     CRCT 5
      ARMZ 0,0
-     DMEM 0
+     CRVL 0,1
+     CRCT 5
+     CRCT 2
+     MULT
+     SOMA
+     ARMZ 0,1
+     DMEM 2
      PARA
diff --git a/compilador b/compilador
index fc42e009c85e53b9b110f44d7c8229b032d97328..66d4937bcc57708d219cd2e69fa3fca1f4554c37 100755
Binary files a/compilador and b/compilador differ
diff --git a/compilador.output b/compilador.output
index 903e78d82b740fe99001e59ba71e3f2577130750..37a9853ae61b8286a4186153f5aab9c46d8ef4cf 100644
--- a/compilador.output
+++ b/compilador.output
@@ -9,7 +9,7 @@ Terminais sem uso na gramática
     NOT
 
 
-Estado 70 conflitos: 1 de redução/redução
+Estado 71 conflitos: 1 de redução/redução
 
 
 Gramática
@@ -75,58 +75,61 @@ Gramática
    35                   | comando_repetitivo
    36                   | leitura
    37                   | escrita
+   38                   | chamada_procedimento
 
-   38 leitura: READ ABRE_PARENTESES lista_leituras FECHA_PARENTESES
+   39 chamada_procedimento: ε
 
-   39 lista_leituras: lista_leituras VIRGULA simb_leitura
-   40               | simb_leitura
+   40 leitura: READ ABRE_PARENTESES lista_leituras FECHA_PARENTESES
 
-   41 simb_leitura: IDENT
+   41 lista_leituras: lista_leituras VIRGULA simb_leitura
+   42               | simb_leitura
 
-   42 escrita: WRITE ABRE_PARENTESES lista_escritas FECHA_PARENTESES
+   43 simb_leitura: IDENT
 
-   43 lista_escritas: lista_escritas VIRGULA expressao_simples
-   44               | expressao_simples
+   44 escrita: WRITE ABRE_PARENTESES lista_escritas FECHA_PARENTESES
 
-   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
+   45 lista_escritas: lista_escritas VIRGULA expressao_simples
+   46               | expressao_simples
 
-   52 expressao_simples: expressao_simples MAIS termo
-   53                  | expressao_simples MENOS termo
-   54                  | termo
+   47 expressao: expressao IGUAL expressao_simples
+   48          | expressao DIFERENTE expressao_simples
+   49          | expressao MENOR expressao_simples
+   50          | expressao MENOR_IGUAL expressao_simples
+   51          | expressao MAIOR expressao_simples
+   52          | expressao MAIOR_IGUAL expressao_simples
+   53          | expressao_simples
 
-   55 termo: termo ASTERISCO fator
-   56      | termo DIV fator
-   57      | fator
+   54 expressao_simples: expressao_simples MAIS termo
+   55                  | expressao_simples MENOS termo
+   56                  | termo
 
-   58 $@8: ε
+   57 termo: termo ASTERISCO fator
+   58      | termo DIV fator
+   59      | fator
 
-   59 atribuicao: IDENT $@8 ATRIBUICAO expressao_simples
+   60 $@8: ε
 
-   60 fator: IDENT
-   61      | NUMERO
+   61 atribuicao: IDENT $@8 ATRIBUICAO expressao_simples
 
-   62 numero: NUMERO
+   62 fator: IDENT
+   63      | NUMERO
 
-   63 $@9: ε
+   64 numero: NUMERO
 
-   64 $@10: ε
+   65 $@9: ε
 
-   65 comando_repetitivo: $@9 WHILE expressao DO $@10 comando_sem_rotulo
+   66 $@10: ε
 
-   66 comando_condicional: if_then cond_else
+   67 comando_repetitivo: $@9 WHILE expressao DO $@10 comando_sem_rotulo
 
-   67 cond_else: ELSE comando_sem_rotulo
-   68          | ε
+   68 comando_condicional: if_then cond_else
 
-   69 $@11: ε
+   69 cond_else: ELSE comando_sem_rotulo
+   70          | ε
 
-   70 if_then: IF expressao $@11 THEN comando_sem_rotulo
+   71 $@11: ε
+
+   72 if_then: IF expressao $@11 THEN comando_sem_rotulo
 
 
 Terminais, com as regras onde eles aparecem
@@ -134,44 +137,44 @@ Terminais, com as regras onde eles aparecem
     $end (0) 0
     error (256)
     PROGRAM (258) 2
-    ABRE_PARENTESES (259) 2 38 42
-    FECHA_PARENTESES (260) 2 38 42
-    VIRGULA (261) 6 18 20 39 43
+    ABRE_PARENTESES (259) 2 40 44
+    FECHA_PARENTESES (260) 2 40 44
+    VIRGULA (261) 6 18 20 41 45
     PONTO_E_VIRGULA (262) 2 16 25 27 28
     DOIS_PONTOS (263) 16 30
     PONTO (264) 2
     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
+    IDENT (268) 2 17 18 19 20 21 25 43 61 62
+    ATRIBUICAO (269) 61
     LABEL (270) 6
     TYPE (271)
     ARRAY (272)
     PROCEDURE (273) 25
     FUNCTION (274)
     GOTO (275)
-    IF (276) 70
-    THEN (277) 70
-    ELSE (278) 67
-    WHILE (279) 65
-    DO (280) 65
+    IF (276) 72
+    THEN (277) 72
+    ELSE (278) 69
+    WHILE (279) 67
+    DO (280) 67
     OR (281)
-    DIV (282) 56
+    DIV (282) 58
     AND (283)
     NOT (284)
-    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
+    IGUAL (285) 47
+    DIFERENTE (286) 48
+    MENOR_IGUAL (287) 50
+    MAIOR_IGUAL (288) 52
+    MENOR (289) 49
+    MAIOR (290) 51
+    MAIS (291) 54
+    MENOS (292) 55
+    ASTERISCO (293) 57
+    NUMERO (294) 63 64
+    READ (295) 40
+    WRITE (296) 44
     LOWER_THAN_ELSE (297)
 
 
@@ -246,65 +249,68 @@ Não terminais com as regras onde eles aparecem
         à 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
+        à esquerda: 32 33 34 35 36 37 38
+        à direita: 30 31 67 69 72
+    chamada_procedimento (67)
+        à esquerda: 39
+        à direita: 38
+    leitura (68)
+        à esquerda: 40
         à direita: 36
-    lista_leituras (68)
-        à esquerda: 39 40
-        à direita: 38 39
-    simb_leitura (69)
-        à esquerda: 41
-        à direita: 39 40
-    escrita (70)
-        à esquerda: 42
+    lista_leituras (69)
+        à esquerda: 41 42
+        à direita: 40 41
+    simb_leitura (70)
+        à esquerda: 43
+        à direita: 41 42
+    escrita (71)
+        à esquerda: 44
         à 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: 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
+    lista_escritas (72)
+        à esquerda: 45 46
+        à direita: 44 45
+    expressao (73)
+        à esquerda: 47 48 49 50 51 52 53
+        à direita: 47 48 49 50 51 52 67 72
+    expressao_simples (74)
+        à esquerda: 54 55 56
+        à direita: 45 46 47 48 49 50 51 52 53 54 55 61
+    termo (75)
+        à esquerda: 57 58 59
+        à direita: 54 55 56 57 58
+    atribuicao (76)
+        à esquerda: 61
         à direita: 32
-    $@8 (76)
-        à esquerda: 58
-        à direita: 59
-    fator (77)
-        à esquerda: 60 61
-        à direita: 55 56 57
-    numero (78)
-        à esquerda: 62
+    $@8 (77)
+        à esquerda: 60
+        à direita: 61
+    fator (78)
+        à esquerda: 62 63
+        à direita: 57 58 59
+    numero (79)
+        à esquerda: 64
         à direita: 30
-    comando_repetitivo (79)
-        à esquerda: 65
+    comando_repetitivo (80)
+        à esquerda: 67
         à direita: 35
-    $@9 (80)
-        à esquerda: 63
-        à direita: 65
-    $@10 (81)
-        à esquerda: 64
-        à direita: 65
-    comando_condicional (82)
+    $@9 (81)
+        à esquerda: 65
+        à direita: 67
+    $@10 (82)
         à esquerda: 66
+        à direita: 67
+    comando_condicional (83)
+        à esquerda: 68
         à direita: 34
-    cond_else (83)
-        à esquerda: 67 68
-        à direita: 66
-    if_then (84)
-        à esquerda: 70
-        à direita: 66
-    $@11 (85)
-        à esquerda: 69
-        à direita: 70
+    cond_else (84)
+        à esquerda: 69 70
+        à direita: 68
+    if_then (85)
+        à esquerda: 72
+        à direita: 68
+    $@11 (86)
+        à esquerda: 71
+        à direita: 72
 
 
 Estado 0
@@ -600,21 +606,23 @@ Estado 34
     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
+    PONTO_E_VIRGULA  reduzir usando a regra 39 (chamada_procedimento)
+    WHILE            reduzir usando a regra 65 ($@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
+    chamada_procedimento  ir ao estado 48
+    leitura               ir ao estado 49
+    escrita               ir ao estado 50
+    atribuicao            ir ao estado 51
+    numero                ir ao estado 52
+    comando_repetitivo    ir ao estado 53
+    $@9                   ir ao estado 54
+    comando_condicional   ir ao estado 55
+    if_then               ir ao estado 56
 
 
 Estado 35
@@ -628,66 +636,66 @@ Estado 36
 
    18 lista_id_var: lista_id_var VIRGULA • IDENT
 
-    IDENT  deslocar, e ir ao estado 56
+    IDENT  deslocar, e ir ao estado 57
 
 
 Estado 37
 
    16 declara_var: $@5 lista_id_var DOIS_PONTOS • tipo $@6 PONTO_E_VIRGULA
 
-    IDENT  deslocar, e ir ao estado 57
+    IDENT  deslocar, e ir ao estado 58
 
-    tipo  ir ao estado 58
+    tipo  ir ao estado 59
 
 
 Estado 38
 
    25 declaracao_procedimento: PROCEDURE IDENT $@7 • PONTO_E_VIRGULA bloco
 
-    PONTO_E_VIRGULA  deslocar, e ir ao estado 59
+    PONTO_E_VIRGULA  deslocar, e ir ao estado 60
 
 
 Estado 39
 
-   59 atribuicao: IDENT • $@8 ATRIBUICAO expressao_simples
+   61 atribuicao: IDENT • $@8 ATRIBUICAO expressao_simples
 
-    $padrão  reduzir usando a regra 58 ($@8)
+    $padrão  reduzir usando a regra 60 ($@8)
 
-    $@8  ir ao estado 60
+    $@8  ir ao estado 61
 
 
 Estado 40
 
-   70 if_then: IF • expressao $@11 THEN comando_sem_rotulo
+   72 if_then: IF • expressao $@11 THEN comando_sem_rotulo
 
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
 
-    expressao          ir ao estado 63
-    expressao_simples  ir ao estado 64
-    termo              ir ao estado 65
-    fator              ir ao estado 66
+    expressao          ir ao estado 64
+    expressao_simples  ir ao estado 65
+    termo              ir ao estado 66
+    fator              ir ao estado 67
 
 
 Estado 41
 
-   62 numero: NUMERO •
+   64 numero: NUMERO •
 
-    $padrão  reduzir usando a regra 62 (numero)
+    $padrão  reduzir usando a regra 64 (numero)
 
 
 Estado 42
 
-   38 leitura: READ • ABRE_PARENTESES lista_leituras FECHA_PARENTESES
+   40 leitura: READ • ABRE_PARENTESES lista_leituras FECHA_PARENTESES
 
-    ABRE_PARENTESES  deslocar, e ir ao estado 67
+    ABRE_PARENTESES  deslocar, e ir ao estado 68
 
 
 Estado 43
 
-   42 escrita: WRITE • ABRE_PARENTESES lista_escritas FECHA_PARENTESES
+   44 escrita: WRITE • ABRE_PARENTESES lista_escritas FECHA_PARENTESES
 
-    ABRE_PARENTESES  deslocar, e ir ao estado 68
+    ABRE_PARENTESES  deslocar, e ir ao estado 69
 
 
 Estado 44
@@ -701,7 +709,7 @@ Estado 45
 
    26 comando_composto: T_BEGIN comandos • T_END
 
-    T_END  deslocar, e ir ao estado 69
+    T_END  deslocar, e ir ao estado 70
 
 
 Estado 46
@@ -709,7 +717,7 @@ Estado 46
    27 comandos: comando • PONTO_E_VIRGULA comandos
    28         | comando • PONTO_E_VIRGULA
 
-    PONTO_E_VIRGULA  deslocar, e ir ao estado 70
+    PONTO_E_VIRGULA  deslocar, e ir ao estado 71
 
 
 Estado 47
@@ -721,88 +729,95 @@ Estado 47
 
 Estado 48
 
+   38 comando_sem_rotulo: chamada_procedimento •
+
+    $padrão  reduzir usando a regra 38 (comando_sem_rotulo)
+
+
+Estado 49
+
    36 comando_sem_rotulo: leitura •
 
     $padrão  reduzir usando a regra 36 (comando_sem_rotulo)
 
 
-Estado 49
+Estado 50
 
    37 comando_sem_rotulo: escrita •
 
     $padrão  reduzir usando a regra 37 (comando_sem_rotulo)
 
 
-Estado 50
+Estado 51
 
    32 comando_sem_rotulo: atribuicao •
 
     $padrão  reduzir usando a regra 32 (comando_sem_rotulo)
 
 
-Estado 51
+Estado 52
 
    30 comando: numero • DOIS_PONTOS comando_sem_rotulo
 
-    DOIS_PONTOS  deslocar, e ir ao estado 71
+    DOIS_PONTOS  deslocar, e ir ao estado 72
 
 
-Estado 52
+Estado 53
 
    35 comando_sem_rotulo: comando_repetitivo •
 
     $padrão  reduzir usando a regra 35 (comando_sem_rotulo)
 
 
-Estado 53
+Estado 54
 
-   65 comando_repetitivo: $@9 • WHILE expressao DO $@10 comando_sem_rotulo
+   67 comando_repetitivo: $@9 • WHILE expressao DO $@10 comando_sem_rotulo
 
-    WHILE  deslocar, e ir ao estado 72
+    WHILE  deslocar, e ir ao estado 73
 
 
-Estado 54
+Estado 55
 
    34 comando_sem_rotulo: comando_condicional •
 
     $padrão  reduzir usando a regra 34 (comando_sem_rotulo)
 
 
-Estado 55
+Estado 56
 
-   66 comando_condicional: if_then • cond_else
+   68 comando_condicional: if_then • cond_else
 
-    ELSE  deslocar, e ir ao estado 73
+    ELSE  deslocar, e ir ao estado 74
 
-    $padrão  reduzir usando a regra 68 (cond_else)
+    $padrão  reduzir usando a regra 70 (cond_else)
 
-    cond_else  ir ao estado 74
+    cond_else  ir ao estado 75
 
 
-Estado 56
+Estado 57
 
    18 lista_id_var: lista_id_var VIRGULA IDENT •
 
     $padrão  reduzir usando a regra 18 (lista_id_var)
 
 
-Estado 57
+Estado 58
 
    17 tipo: IDENT •
 
     $padrão  reduzir usando a regra 17 (tipo)
 
 
-Estado 58
+Estado 59
 
    16 declara_var: $@5 lista_id_var DOIS_PONTOS tipo • $@6 PONTO_E_VIRGULA
 
     $padrão  reduzir usando a regra 15 ($@6)
 
-    $@6  ir ao estado 75
+    $@6  ir ao estado 76
 
 
-Estado 59
+Estado 60
 
    25 declaracao_procedimento: PROCEDURE IDENT $@7 PONTO_E_VIRGULA • bloco
 
@@ -810,115 +825,115 @@ Estado 59
 
     $padrão  reduzir usando a regra 7 (parte_declara_rotulos)
 
-    bloco                  ir ao estado 76
+    bloco                  ir ao estado 77
     parte_declara_rotulos  ir ao estado 15
 
 
-Estado 60
-
-   59 atribuicao: IDENT $@8 • ATRIBUICAO expressao_simples
-
-    ATRIBUICAO  deslocar, e ir ao estado 77
-
-
 Estado 61
 
-   60 fator: IDENT •
+   61 atribuicao: IDENT $@8 • ATRIBUICAO expressao_simples
 
-    $padrão  reduzir usando a regra 60 (fator)
+    ATRIBUICAO  deslocar, e ir ao estado 78
 
 
 Estado 62
 
-   61 fator: NUMERO •
+   62 fator: IDENT •
 
-    $padrão  reduzir usando a regra 61 (fator)
+    $padrão  reduzir usando a regra 62 (fator)
 
 
 Estado 63
 
-   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
-
-    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
+   63 fator: NUMERO •
 
-    $padrão  reduzir usando a regra 69 ($@11)
-
-    $@11  ir ao estado 84
+    $padrão  reduzir usando a regra 63 (fator)
 
 
 Estado 64
 
-   51 expressao: expressao_simples •
-   52 expressao_simples: expressao_simples • MAIS termo
-   53                  | expressao_simples • MENOS termo
+   47 expressao: expressao • IGUAL expressao_simples
+   48          | expressao • DIFERENTE expressao_simples
+   49          | expressao • MENOR expressao_simples
+   50          | expressao • MENOR_IGUAL expressao_simples
+   51          | expressao • MAIOR expressao_simples
+   52          | expressao • MAIOR_IGUAL expressao_simples
+   72 if_then: IF expressao • $@11 THEN comando_sem_rotulo
 
-    MAIS   deslocar, e ir ao estado 85
-    MENOS  deslocar, e ir ao estado 86
+    IGUAL        deslocar, e ir ao estado 79
+    DIFERENTE    deslocar, e ir ao estado 80
+    MENOR_IGUAL  deslocar, e ir ao estado 81
+    MAIOR_IGUAL  deslocar, e ir ao estado 82
+    MENOR        deslocar, e ir ao estado 83
+    MAIOR        deslocar, e ir ao estado 84
 
-    $padrão  reduzir usando a regra 51 (expressao)
+    $padrão  reduzir usando a regra 71 ($@11)
+
+    $@11  ir ao estado 85
 
 
 Estado 65
 
-   54 expressao_simples: termo •
-   55 termo: termo • ASTERISCO fator
-   56      | termo • DIV fator
+   53 expressao: expressao_simples •
+   54 expressao_simples: expressao_simples • MAIS termo
+   55                  | expressao_simples • MENOS termo
 
-    DIV        deslocar, e ir ao estado 87
-    ASTERISCO  deslocar, e ir ao estado 88
+    MAIS   deslocar, e ir ao estado 86
+    MENOS  deslocar, e ir ao estado 87
 
-    $padrão  reduzir usando a regra 54 (expressao_simples)
+    $padrão  reduzir usando a regra 53 (expressao)
 
 
 Estado 66
 
-   57 termo: fator •
+   56 expressao_simples: termo •
+   57 termo: termo • ASTERISCO fator
+   58      | termo • DIV fator
 
-    $padrão  reduzir usando a regra 57 (termo)
+    DIV        deslocar, e ir ao estado 88
+    ASTERISCO  deslocar, e ir ao estado 89
 
+    $padrão  reduzir usando a regra 56 (expressao_simples)
 
-Estado 67
 
-   38 leitura: READ ABRE_PARENTESES • lista_leituras FECHA_PARENTESES
+Estado 67
 
-    IDENT  deslocar, e ir ao estado 89
+   59 termo: fator •
 
-    lista_leituras  ir ao estado 90
-    simb_leitura    ir ao estado 91
+    $padrão  reduzir usando a regra 59 (termo)
 
 
 Estado 68
 
-   42 escrita: WRITE ABRE_PARENTESES • lista_escritas FECHA_PARENTESES
+   40 leitura: READ ABRE_PARENTESES • lista_leituras FECHA_PARENTESES
 
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+    IDENT  deslocar, e ir ao estado 90
 
-    lista_escritas     ir ao estado 92
-    expressao_simples  ir ao estado 93
-    termo              ir ao estado 65
-    fator              ir ao estado 66
+    lista_leituras  ir ao estado 91
+    simb_leitura    ir ao estado 92
 
 
 Estado 69
 
+   44 escrita: WRITE ABRE_PARENTESES • lista_escritas FECHA_PARENTESES
+
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
+
+    lista_escritas     ir ao estado 93
+    expressao_simples  ir ao estado 94
+    termo              ir ao estado 66
+    fator              ir ao estado 67
+
+
+Estado 70
+
    26 comando_composto: T_BEGIN comandos T_END •
 
     $padrão  reduzir usando a regra 26 (comando_composto)
 
 
-Estado 70
+Estado 71
 
    27 comandos: comando PONTO_E_VIRGULA • comandos
    28         | comando PONTO_E_VIRGULA •
@@ -930,26 +945,28 @@ Estado 70
     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
+    PONTO_E_VIRGULA  reduzir usando a regra 39 (chamada_procedimento)
+    T_END            reduzir usando a regra 28 (comandos)
+    T_END            [reduzir usando a regra 29 (comandos)]
+    WHILE            reduzir usando a regra 65 ($@9)
+    $padrão          reduzir usando a regra 28 (comandos)
+
+    comando_composto      ir ao estado 44
+    comandos              ir ao estado 95
+    comando               ir ao estado 46
+    comando_sem_rotulo    ir ao estado 47
+    chamada_procedimento  ir ao estado 48
+    leitura               ir ao estado 49
+    escrita               ir ao estado 50
+    atribuicao            ir ao estado 51
+    numero                ir ao estado 52
+    comando_repetitivo    ir ao estado 53
+    $@9                   ir ao estado 54
+    comando_condicional   ir ao estado 55
+    if_then               ir ao estado 56
 
 
-Estado 71
+Estado 72
 
    30 comando: numero DOIS_PONTOS • comando_sem_rotulo
 
@@ -959,35 +976,37 @@ Estado 71
     READ     deslocar, e ir ao estado 42
     WRITE    deslocar, e ir ao estado 43
 
-    $padrão  reduzir usando a regra 63 ($@9)
+    WHILE    reduzir usando a regra 65 ($@9)
+    $padrão  reduzir usando a regra 39 (chamada_procedimento)
 
-    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
+    comando_composto      ir ao estado 44
+    comando_sem_rotulo    ir ao estado 96
+    chamada_procedimento  ir ao estado 48
+    leitura               ir ao estado 49
+    escrita               ir ao estado 50
+    atribuicao            ir ao estado 51
+    comando_repetitivo    ir ao estado 53
+    $@9                   ir ao estado 54
+    comando_condicional   ir ao estado 55
+    if_then               ir ao estado 56
 
 
-Estado 72
+Estado 73
 
-   65 comando_repetitivo: $@9 WHILE • expressao DO $@10 comando_sem_rotulo
+   67 comando_repetitivo: $@9 WHILE • expressao DO $@10 comando_sem_rotulo
 
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
 
-    expressao          ir ao estado 96
-    expressao_simples  ir ao estado 64
-    termo              ir ao estado 65
-    fator              ir ao estado 66
+    expressao          ir ao estado 97
+    expressao_simples  ir ao estado 65
+    termo              ir ao estado 66
+    fator              ir ao estado 67
 
 
-Estado 73
+Estado 74
 
-   67 cond_else: ELSE • comando_sem_rotulo
+   69 cond_else: ELSE • comando_sem_rotulo
 
     T_BEGIN  deslocar, e ir ao estado 34
     IDENT    deslocar, e ir ao estado 39
@@ -995,482 +1014,486 @@ Estado 73
     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 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
-
+    WHILE    reduzir usando a regra 65 ($@9)
+    $padrão  reduzir usando a regra 39 (chamada_procedimento)
 
-Estado 74
-
-   66 comando_condicional: if_then cond_else •
-
-    $padrão  reduzir usando a regra 66 (comando_condicional)
+    comando_composto      ir ao estado 44
+    comando_sem_rotulo    ir ao estado 98
+    chamada_procedimento  ir ao estado 48
+    leitura               ir ao estado 49
+    escrita               ir ao estado 50
+    atribuicao            ir ao estado 51
+    comando_repetitivo    ir ao estado 53
+    $@9                   ir ao estado 54
+    comando_condicional   ir ao estado 55
+    if_then               ir ao estado 56
 
 
 Estado 75
 
-   16 declara_var: $@5 lista_id_var DOIS_PONTOS tipo $@6 • PONTO_E_VIRGULA
+   68 comando_condicional: if_then cond_else •
 
-    PONTO_E_VIRGULA  deslocar, e ir ao estado 98
+    $padrão  reduzir usando a regra 68 (comando_condicional)
 
 
 Estado 76
 
-   25 declaracao_procedimento: PROCEDURE IDENT $@7 PONTO_E_VIRGULA bloco •
+   16 declara_var: $@5 lista_id_var DOIS_PONTOS tipo $@6 • PONTO_E_VIRGULA
 
-    $padrão  reduzir usando a regra 25 (declaracao_procedimento)
+    PONTO_E_VIRGULA  deslocar, e ir ao estado 99
 
 
 Estado 77
 
-   59 atribuicao: IDENT $@8 ATRIBUICAO • expressao_simples
-
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+   25 declaracao_procedimento: PROCEDURE IDENT $@7 PONTO_E_VIRGULA bloco •
 
-    expressao_simples  ir ao estado 99
-    termo              ir ao estado 65
-    fator              ir ao estado 66
+    $padrão  reduzir usando a regra 25 (declaracao_procedimento)
 
 
 Estado 78
 
-   45 expressao: expressao IGUAL • expressao_simples
+   61 atribuicao: IDENT $@8 ATRIBUICAO • expressao_simples
 
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
 
     expressao_simples  ir ao estado 100
-    termo              ir ao estado 65
-    fator              ir ao estado 66
+    termo              ir ao estado 66
+    fator              ir ao estado 67
 
 
 Estado 79
 
-   46 expressao: expressao DIFERENTE • expressao_simples
+   47 expressao: expressao IGUAL • expressao_simples
 
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
 
     expressao_simples  ir ao estado 101
-    termo              ir ao estado 65
-    fator              ir ao estado 66
+    termo              ir ao estado 66
+    fator              ir ao estado 67
 
 
 Estado 80
 
-   48 expressao: expressao MENOR_IGUAL • expressao_simples
+   48 expressao: expressao DIFERENTE • expressao_simples
 
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
 
     expressao_simples  ir ao estado 102
-    termo              ir ao estado 65
-    fator              ir ao estado 66
+    termo              ir ao estado 66
+    fator              ir ao estado 67
 
 
 Estado 81
 
-   50 expressao: expressao MAIOR_IGUAL • expressao_simples
+   50 expressao: expressao MENOR_IGUAL • expressao_simples
 
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
 
     expressao_simples  ir ao estado 103
-    termo              ir ao estado 65
-    fator              ir ao estado 66
+    termo              ir ao estado 66
+    fator              ir ao estado 67
 
 
 Estado 82
 
-   47 expressao: expressao MENOR • expressao_simples
+   52 expressao: expressao MAIOR_IGUAL • expressao_simples
 
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
 
     expressao_simples  ir ao estado 104
-    termo              ir ao estado 65
-    fator              ir ao estado 66
+    termo              ir ao estado 66
+    fator              ir ao estado 67
 
 
 Estado 83
 
-   49 expressao: expressao MAIOR • expressao_simples
+   49 expressao: expressao MENOR • expressao_simples
 
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
 
     expressao_simples  ir ao estado 105
-    termo              ir ao estado 65
-    fator              ir ao estado 66
+    termo              ir ao estado 66
+    fator              ir ao estado 67
 
 
 Estado 84
 
-   70 if_then: IF expressao $@11 • THEN comando_sem_rotulo
+   51 expressao: expressao MAIOR • expressao_simples
 
-    THEN  deslocar, e ir ao estado 106
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
 
+    expressao_simples  ir ao estado 106
+    termo              ir ao estado 66
+    fator              ir ao estado 67
 
-Estado 85
 
-   52 expressao_simples: expressao_simples MAIS • termo
+Estado 85
 
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+   72 if_then: IF expressao $@11 • THEN comando_sem_rotulo
 
-    termo  ir ao estado 107
-    fator  ir ao estado 66
+    THEN  deslocar, e ir ao estado 107
 
 
 Estado 86
 
-   53 expressao_simples: expressao_simples MENOS • termo
+   54 expressao_simples: expressao_simples MAIS • termo
 
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
 
     termo  ir ao estado 108
-    fator  ir ao estado 66
+    fator  ir ao estado 67
 
 
 Estado 87
 
-   56 termo: termo DIV • fator
+   55 expressao_simples: expressao_simples MENOS • termo
 
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
 
-    fator  ir ao estado 109
+    termo  ir ao estado 109
+    fator  ir ao estado 67
 
 
 Estado 88
 
-   55 termo: termo ASTERISCO • fator
+   58 termo: termo DIV • fator
 
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
 
     fator  ir ao estado 110
 
 
 Estado 89
 
-   41 simb_leitura: IDENT •
+   57 termo: termo ASTERISCO • fator
 
-    $padrão  reduzir usando a regra 41 (simb_leitura)
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
+
+    fator  ir ao estado 111
 
 
 Estado 90
 
-   38 leitura: READ ABRE_PARENTESES lista_leituras • FECHA_PARENTESES
-   39 lista_leituras: lista_leituras • VIRGULA simb_leitura
+   43 simb_leitura: IDENT •
 
-    FECHA_PARENTESES  deslocar, e ir ao estado 111
-    VIRGULA           deslocar, e ir ao estado 112
+    $padrão  reduzir usando a regra 43 (simb_leitura)
 
 
 Estado 91
 
-   40 lista_leituras: simb_leitura •
+   40 leitura: READ ABRE_PARENTESES lista_leituras • FECHA_PARENTESES
+   41 lista_leituras: lista_leituras • VIRGULA simb_leitura
 
-    $padrão  reduzir usando a regra 40 (lista_leituras)
+    FECHA_PARENTESES  deslocar, e ir ao estado 112
+    VIRGULA           deslocar, e ir ao estado 113
 
 
 Estado 92
 
-   42 escrita: WRITE ABRE_PARENTESES lista_escritas • FECHA_PARENTESES
-   43 lista_escritas: lista_escritas • VIRGULA expressao_simples
+   42 lista_leituras: simb_leitura •
 
-    FECHA_PARENTESES  deslocar, e ir ao estado 113
-    VIRGULA           deslocar, e ir ao estado 114
+    $padrão  reduzir usando a regra 42 (lista_leituras)
 
 
 Estado 93
 
-   44 lista_escritas: 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
+   44 escrita: WRITE ABRE_PARENTESES lista_escritas • FECHA_PARENTESES
+   45 lista_escritas: lista_escritas • VIRGULA expressao_simples
 
-    $padrão  reduzir usando a regra 44 (lista_escritas)
+    FECHA_PARENTESES  deslocar, e ir ao estado 114
+    VIRGULA           deslocar, e ir ao estado 115
 
 
 Estado 94
 
-   27 comandos: comando PONTO_E_VIRGULA comandos •
+   46 lista_escritas: expressao_simples •
+   54 expressao_simples: expressao_simples • MAIS termo
+   55                  | expressao_simples • MENOS termo
 
-    $padrão  reduzir usando a regra 27 (comandos)
+    MAIS   deslocar, e ir ao estado 86
+    MENOS  deslocar, e ir ao estado 87
+
+    $padrão  reduzir usando a regra 46 (lista_escritas)
 
 
 Estado 95
 
-   30 comando: numero DOIS_PONTOS comando_sem_rotulo •
+   27 comandos: comando PONTO_E_VIRGULA comandos •
 
-    $padrão  reduzir usando a regra 30 (comando)
+    $padrão  reduzir usando a regra 27 (comandos)
 
 
 Estado 96
 
-   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
+   30 comando: numero DOIS_PONTOS comando_sem_rotulo •
 
-    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
+    $padrão  reduzir usando a regra 30 (comando)
 
 
 Estado 97
 
-   67 cond_else: ELSE comando_sem_rotulo •
+   47 expressao: expressao • IGUAL expressao_simples
+   48          | expressao • DIFERENTE expressao_simples
+   49          | expressao • MENOR expressao_simples
+   50          | expressao • MENOR_IGUAL expressao_simples
+   51          | expressao • MAIOR expressao_simples
+   52          | expressao • MAIOR_IGUAL expressao_simples
+   67 comando_repetitivo: $@9 WHILE expressao • DO $@10 comando_sem_rotulo
 
-    $padrão  reduzir usando a regra 67 (cond_else)
+    DO           deslocar, e ir ao estado 116
+    IGUAL        deslocar, e ir ao estado 79
+    DIFERENTE    deslocar, e ir ao estado 80
+    MENOR_IGUAL  deslocar, e ir ao estado 81
+    MAIOR_IGUAL  deslocar, e ir ao estado 82
+    MENOR        deslocar, e ir ao estado 83
+    MAIOR        deslocar, e ir ao estado 84
 
 
 Estado 98
 
-   16 declara_var: $@5 lista_id_var DOIS_PONTOS tipo $@6 PONTO_E_VIRGULA •
+   69 cond_else: ELSE comando_sem_rotulo •
 
-    $padrão  reduzir usando a regra 16 (declara_var)
+    $padrão  reduzir usando a regra 69 (cond_else)
 
 
 Estado 99
 
-   52 expressao_simples: expressao_simples • MAIS termo
-   53                  | expressao_simples • MENOS termo
-   59 atribuicao: IDENT $@8 ATRIBUICAO expressao_simples •
-
-    MAIS   deslocar, e ir ao estado 85
-    MENOS  deslocar, e ir ao estado 86
+   16 declara_var: $@5 lista_id_var DOIS_PONTOS tipo $@6 PONTO_E_VIRGULA •
 
-    $padrão  reduzir usando a regra 59 (atribuicao)
+    $padrão  reduzir usando a regra 16 (declara_var)
 
 
 Estado 100
 
-   45 expressao: expressao IGUAL expressao_simples •
-   52 expressao_simples: expressao_simples • MAIS termo
-   53                  | expressao_simples • MENOS termo
+   54 expressao_simples: expressao_simples • MAIS termo
+   55                  | expressao_simples • MENOS termo
+   61 atribuicao: IDENT $@8 ATRIBUICAO expressao_simples •
 
-    MAIS   deslocar, e ir ao estado 85
-    MENOS  deslocar, e ir ao estado 86
+    MAIS   deslocar, e ir ao estado 86
+    MENOS  deslocar, e ir ao estado 87
 
-    $padrão  reduzir usando a regra 45 (expressao)
+    $padrão  reduzir usando a regra 61 (atribuicao)
 
 
 Estado 101
 
-   46 expressao: expressao DIFERENTE expressao_simples •
-   52 expressao_simples: expressao_simples • MAIS termo
-   53                  | expressao_simples • MENOS termo
+   47 expressao: expressao IGUAL expressao_simples •
+   54 expressao_simples: expressao_simples • MAIS termo
+   55                  | expressao_simples • MENOS termo
 
-    MAIS   deslocar, e ir ao estado 85
-    MENOS  deslocar, e ir ao estado 86
+    MAIS   deslocar, e ir ao estado 86
+    MENOS  deslocar, e ir ao estado 87
 
-    $padrão  reduzir usando a regra 46 (expressao)
+    $padrão  reduzir usando a regra 47 (expressao)
 
 
 Estado 102
 
-   48 expressao: expressao MENOR_IGUAL expressao_simples •
-   52 expressao_simples: expressao_simples • MAIS termo
-   53                  | expressao_simples • MENOS termo
+   48 expressao: expressao DIFERENTE expressao_simples •
+   54 expressao_simples: expressao_simples • MAIS termo
+   55                  | expressao_simples • MENOS termo
 
-    MAIS   deslocar, e ir ao estado 85
-    MENOS  deslocar, e ir ao estado 86
+    MAIS   deslocar, e ir ao estado 86
+    MENOS  deslocar, e ir ao estado 87
 
     $padrão  reduzir usando a regra 48 (expressao)
 
 
 Estado 103
 
-   50 expressao: expressao MAIOR_IGUAL expressao_simples •
-   52 expressao_simples: expressao_simples • MAIS termo
-   53                  | expressao_simples • MENOS termo
+   50 expressao: expressao MENOR_IGUAL expressao_simples •
+   54 expressao_simples: expressao_simples • MAIS termo
+   55                  | expressao_simples • MENOS termo
 
-    MAIS   deslocar, e ir ao estado 85
-    MENOS  deslocar, e ir ao estado 86
+    MAIS   deslocar, e ir ao estado 86
+    MENOS  deslocar, e ir ao estado 87
 
     $padrão  reduzir usando a regra 50 (expressao)
 
 
 Estado 104
 
-   47 expressao: expressao MENOR expressao_simples •
-   52 expressao_simples: expressao_simples • MAIS termo
-   53                  | expressao_simples • MENOS termo
+   52 expressao: expressao MAIOR_IGUAL expressao_simples •
+   54 expressao_simples: expressao_simples • MAIS termo
+   55                  | expressao_simples • MENOS termo
 
-    MAIS   deslocar, e ir ao estado 85
-    MENOS  deslocar, e ir ao estado 86
+    MAIS   deslocar, e ir ao estado 86
+    MENOS  deslocar, e ir ao estado 87
 
-    $padrão  reduzir usando a regra 47 (expressao)
+    $padrão  reduzir usando a regra 52 (expressao)
 
 
 Estado 105
 
-   49 expressao: expressao MAIOR expressao_simples •
-   52 expressao_simples: expressao_simples • MAIS termo
-   53                  | expressao_simples • MENOS termo
+   49 expressao: expressao MENOR expressao_simples •
+   54 expressao_simples: expressao_simples • MAIS termo
+   55                  | expressao_simples • MENOS termo
 
-    MAIS   deslocar, e ir ao estado 85
-    MENOS  deslocar, e ir ao estado 86
+    MAIS   deslocar, e ir ao estado 86
+    MENOS  deslocar, e ir ao estado 87
 
     $padrão  reduzir usando a regra 49 (expressao)
 
 
 Estado 106
 
-   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
+   51 expressao: expressao MAIOR expressao_simples •
+   54 expressao_simples: expressao_simples • MAIS termo
+   55                  | expressao_simples • MENOS termo
 
-    $padrão  reduzir usando a regra 63 ($@9)
+    MAIS   deslocar, e ir ao estado 86
+    MENOS  deslocar, e ir ao estado 87
 
-    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
+    $padrão  reduzir usando a regra 51 (expressao)
 
 
 Estado 107
 
-   52 expressao_simples: expressao_simples MAIS termo •
-   55 termo: termo • ASTERISCO fator
-   56      | termo • DIV fator
+   72 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
 
-    DIV        deslocar, e ir ao estado 87
-    ASTERISCO  deslocar, e ir ao estado 88
+    WHILE    reduzir usando a regra 65 ($@9)
+    $padrão  reduzir usando a regra 39 (chamada_procedimento)
 
-    $padrão  reduzir usando a regra 52 (expressao_simples)
+    comando_composto      ir ao estado 44
+    comando_sem_rotulo    ir ao estado 117
+    chamada_procedimento  ir ao estado 48
+    leitura               ir ao estado 49
+    escrita               ir ao estado 50
+    atribuicao            ir ao estado 51
+    comando_repetitivo    ir ao estado 53
+    $@9                   ir ao estado 54
+    comando_condicional   ir ao estado 55
+    if_then               ir ao estado 56
 
 
 Estado 108
 
-   53 expressao_simples: expressao_simples MENOS termo •
-   55 termo: termo • ASTERISCO fator
-   56      | termo • DIV fator
+   54 expressao_simples: expressao_simples MAIS termo •
+   57 termo: termo • ASTERISCO fator
+   58      | termo • DIV fator
 
-    DIV        deslocar, e ir ao estado 87
-    ASTERISCO  deslocar, e ir ao estado 88
+    DIV        deslocar, e ir ao estado 88
+    ASTERISCO  deslocar, e ir ao estado 89
 
-    $padrão  reduzir usando a regra 53 (expressao_simples)
+    $padrão  reduzir usando a regra 54 (expressao_simples)
 
 
 Estado 109
 
-   56 termo: termo DIV fator •
+   55 expressao_simples: expressao_simples MENOS termo •
+   57 termo: termo • ASTERISCO fator
+   58      | termo • DIV fator
+
+    DIV        deslocar, e ir ao estado 88
+    ASTERISCO  deslocar, e ir ao estado 89
 
-    $padrão  reduzir usando a regra 56 (termo)
+    $padrão  reduzir usando a regra 55 (expressao_simples)
 
 
 Estado 110
 
-   55 termo: termo ASTERISCO fator •
+   58 termo: termo DIV fator •
 
-    $padrão  reduzir usando a regra 55 (termo)
+    $padrão  reduzir usando a regra 58 (termo)
 
 
 Estado 111
 
-   38 leitura: READ ABRE_PARENTESES lista_leituras FECHA_PARENTESES •
+   57 termo: termo ASTERISCO fator •
 
-    $padrão  reduzir usando a regra 38 (leitura)
+    $padrão  reduzir usando a regra 57 (termo)
 
 
 Estado 112
 
-   39 lista_leituras: lista_leituras VIRGULA • simb_leitura
-
-    IDENT  deslocar, e ir ao estado 89
+   40 leitura: READ ABRE_PARENTESES lista_leituras FECHA_PARENTESES •
 
-    simb_leitura  ir ao estado 117
+    $padrão  reduzir usando a regra 40 (leitura)
 
 
 Estado 113
 
-   42 escrita: WRITE ABRE_PARENTESES lista_escritas FECHA_PARENTESES •
+   41 lista_leituras: lista_leituras VIRGULA • simb_leitura
 
-    $padrão  reduzir usando a regra 42 (escrita)
+    IDENT  deslocar, e ir ao estado 90
 
+    simb_leitura  ir ao estado 118
 
-Estado 114
 
-   43 lista_escritas: lista_escritas VIRGULA • expressao_simples
+Estado 114
 
-    IDENT   deslocar, e ir ao estado 61
-    NUMERO  deslocar, e ir ao estado 62
+   44 escrita: WRITE ABRE_PARENTESES lista_escritas FECHA_PARENTESES •
 
-    expressao_simples  ir ao estado 118
-    termo              ir ao estado 65
-    fator              ir ao estado 66
+    $padrão  reduzir usando a regra 44 (escrita)
 
 
 Estado 115
 
-   65 comando_repetitivo: $@9 WHILE expressao DO • $@10 comando_sem_rotulo
+   45 lista_escritas: lista_escritas VIRGULA • expressao_simples
 
-    $padrão  reduzir usando a regra 64 ($@10)
+    IDENT   deslocar, e ir ao estado 62
+    NUMERO  deslocar, e ir ao estado 63
 
-    $@10  ir ao estado 119
+    expressao_simples  ir ao estado 119
+    termo              ir ao estado 66
+    fator              ir ao estado 67
 
 
 Estado 116
 
-   70 if_then: IF expressao $@11 THEN comando_sem_rotulo •
+   67 comando_repetitivo: $@9 WHILE expressao DO • $@10 comando_sem_rotulo
 
-    $padrão  reduzir usando a regra 70 (if_then)
+    $padrão  reduzir usando a regra 66 ($@10)
+
+    $@10  ir ao estado 120
 
 
 Estado 117
 
-   39 lista_leituras: lista_leituras VIRGULA simb_leitura •
+   72 if_then: IF expressao $@11 THEN comando_sem_rotulo •
 
-    $padrão  reduzir usando a regra 39 (lista_leituras)
+    $padrão  reduzir usando a regra 72 (if_then)
 
 
 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
+   41 lista_leituras: lista_leituras VIRGULA simb_leitura •
 
-    $padrão  reduzir usando a regra 43 (lista_escritas)
+    $padrão  reduzir usando a regra 41 (lista_leituras)
 
 
 Estado 119
 
-   65 comando_repetitivo: $@9 WHILE expressao DO $@10 • comando_sem_rotulo
+   45 lista_escritas: lista_escritas VIRGULA expressao_simples •
+   54 expressao_simples: expressao_simples • MAIS termo
+   55                  | expressao_simples • MENOS termo
+
+    MAIS   deslocar, e ir ao estado 86
+    MENOS  deslocar, e ir ao estado 87
+
+    $padrão  reduzir usando a regra 45 (lista_escritas)
+
+
+Estado 120
+
+   67 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
@@ -1478,21 +1501,23 @@ Estado 119
     READ     deslocar, e ir ao estado 42
     WRITE    deslocar, e ir ao estado 43
 
-    $padrão  reduzir usando a regra 63 ($@9)
+    WHILE    reduzir usando a regra 65 ($@9)
+    $padrão  reduzir usando a regra 39 (chamada_procedimento)
 
-    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
+    comando_composto      ir ao estado 44
+    comando_sem_rotulo    ir ao estado 121
+    chamada_procedimento  ir ao estado 48
+    leitura               ir ao estado 49
+    escrita               ir ao estado 50
+    atribuicao            ir ao estado 51
+    comando_repetitivo    ir ao estado 53
+    $@9                   ir ao estado 54
+    comando_condicional   ir ao estado 55
+    if_then               ir ao estado 56
 
 
-Estado 120
+Estado 121
 
-   65 comando_repetitivo: $@9 WHILE expressao DO $@10 comando_sem_rotulo •
+   67 comando_repetitivo: $@9 WHILE expressao DO $@10 comando_sem_rotulo •
 
-    $padrão  reduzir usando a regra 65 (comando_repetitivo)
+    $padrão  reduzir usando a regra 67 (comando_repetitivo)
diff --git a/compilador.tab.c b/compilador.tab.c
index 4ab7d2eedc92a4d2ba6575178efe973ac6f85f9d..faebca5a5fb623ae459eddc8554b0e814ca5d0af 100644
--- a/compilador.tab.c
+++ b/compilador.tab.c
@@ -183,25 +183,26 @@ enum yysymbol_kind_t
   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  */
+  YYSYMBOL_chamada_procedimento = 67,      /* chamada_procedimento  */
+  YYSYMBOL_leitura = 68,                   /* leitura  */
+  YYSYMBOL_lista_leituras = 69,            /* lista_leituras  */
+  YYSYMBOL_simb_leitura = 70,              /* simb_leitura  */
+  YYSYMBOL_escrita = 71,                   /* escrita  */
+  YYSYMBOL_lista_escritas = 72,            /* lista_escritas  */
+  YYSYMBOL_expressao = 73,                 /* expressao  */
+  YYSYMBOL_expressao_simples = 74,         /* expressao_simples  */
+  YYSYMBOL_termo = 75,                     /* termo  */
+  YYSYMBOL_atribuicao = 76,                /* atribuicao  */
+  YYSYMBOL_77_8 = 77,                      /* $@8  */
+  YYSYMBOL_fator = 78,                     /* fator  */
+  YYSYMBOL_numero = 79,                    /* numero  */
+  YYSYMBOL_comando_repetitivo = 80,        /* comando_repetitivo  */
+  YYSYMBOL_81_9 = 81,                      /* $@9  */
+  YYSYMBOL_82_10 = 82,                     /* $@10  */
+  YYSYMBOL_comando_condicional = 83,       /* comando_condicional  */
+  YYSYMBOL_cond_else = 84,                 /* cond_else  */
+  YYSYMBOL_if_then = 85,                   /* if_then  */
+  YYSYMBOL_86_11 = 86                      /* $@11  */
 };
 typedef enum yysymbol_kind_t yysymbol_kind_t;
 
@@ -529,16 +530,16 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   105
+#define YYLAST   102
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  43
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  43
+#define YYNNTS  44
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  71
+#define YYNRULES  73
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  121
+#define YYNSTATES  122
 
 /* YYMAXUTOK -- Last valid token kind.  */
 #define YYMAXUTOK   297
@@ -594,11 +595,11 @@ static const yytype_int16 yyrline[] =
        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
+     183,   186,   187,   190,   191,   192,   193,   194,   195,   196,
+     199,   213,   216,   217,   220,   229,   232,   235,   240,   243,
+     246,   249,   252,   255,   258,   261,   264,   267,   270,   273,
+     276,   279,   279,   297,   308,   315,   317,   324,   317,   350,
+     357,   359,   362,   362
 };
 #endif
 
@@ -626,10 +627,10 @@ static const char *const yytname[] =
   "$@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", "$@8", "fator",
-  "numero", "comando_repetitivo", "$@9", "$@10", "comando_condicional",
-  "cond_else", "if_then", "$@11", YY_NULLPTR
+  "chamada_procedimento", "leitura", "lista_leituras", "simb_leitura",
+  "escrita", "lista_escritas", "expressao", "expressao_simples", "termo",
+  "atribuicao", "$@8", "fator", "numero", "comando_repetitivo", "$@9",
+  "$@10", "comando_condicional", "cond_else", "if_then", "$@11", YY_NULLPTR
 };
 
 static const char *
@@ -639,12 +640,12 @@ yysymbol_name (yysymbol_kind_t yysymbol)
 }
 #endif
 
-#define YYPACT_NINF (-72)
+#define YYPACT_NINF (-73)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
 
-#define YYTABLE_NINF (-65)
+#define YYTABLE_NINF (-67)
 
 #define yytable_value_is_error(Yyn) \
   0
@@ -653,19 +654,19 @@ yysymbol_name (yysymbol_kind_t yysymbol)
    STATE-NUM.  */
 static const yytype_int8 yypact[] =
 {
-     -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
+     -73,     5,    16,   -73,     8,    20,    13,   -73,     3,    23,
+      49,    50,   -73,    60,    58,    56,   -73,   -73,   -73,   -73,
+      57,   -73,   -73,    52,    59,   -73,    61,    62,    63,   -73,
+     -73,   -73,    -2,   -73,    10,   -73,    64,    65,    69,   -73,
+     -10,   -73,    67,    75,   -73,    70,    73,   -73,   -73,   -73,
+     -73,   -73,    74,   -73,    66,   -73,    68,   -73,   -73,   -73,
+      50,    71,   -73,   -73,    24,    -9,   -20,   -73,    76,   -10,
+     -73,    10,    12,   -10,    12,   -73,    77,   -73,   -10,   -10,
+     -10,   -10,   -10,   -10,   -10,    72,   -10,   -10,   -10,   -10,
+     -73,    38,   -73,    40,    -9,   -73,   -73,     7,   -73,   -73,
+      -9,    -9,    -9,    -9,    -9,    -9,    -9,    12,   -20,   -20,
+     -73,   -73,   -73,    76,   -73,   -10,   -73,   -73,   -73,    -9,
+      12,   -73
 };
 
 /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -676,36 +677,36 @@ static const yytype_int8 yydefact[] =
        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
+      13,    20,     0,    25,    30,     6,     0,     0,     0,    61,
+       0,    65,     0,     0,    34,     0,     0,    32,    39,    37,
+      38,    33,     0,    36,     0,    35,    71,    19,    18,    16,
+       8,     0,    63,    64,    72,    54,    57,    60,     0,     0,
+      27,    29,    40,     0,    40,    69,     0,    26,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      44,     0,    43,     0,    47,    28,    31,     0,    70,    17,
+      62,    48,    49,    51,    53,    50,    52,    40,    55,    56,
+      59,    58,    41,     0,    45,     0,    67,    73,    42,    46,
+      40,    68
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] =
 {
-     -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
+     -73,   -73,   -73,    26,   -73,   -73,   -73,   -73,   -73,   -73,
+     -73,    78,   -73,   -73,   -73,   -73,   -73,   -73,   -73,   -73,
+      55,    17,   -73,   -72,   -73,   -73,   -73,   -21,   -73,   -73,
+      14,   -68,   -26,   -73,   -73,   -25,   -73,   -73,   -73,   -73,
+     -73,   -73,   -73,   -73
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int8 yydefgoto[] =
 {
        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
+      24,    25,    26,    76,    59,    32,     8,    23,    29,    38,
+      44,    45,    46,    47,    48,    49,    91,    92,    50,    93,
+      64,    65,    66,    51,    61,    67,    52,    53,    54,   120,
+      55,    75,    56,    85
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -713,32 +714,32 @@ static const yytype_int8 yydefgoto[] =
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int8 yytable[] =
 {
-      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
+      96,    94,    98,    62,    36,     3,    37,    88,     9,    10,
+     100,   101,   102,   103,   104,   105,   106,   -40,    89,     4,
+      34,     5,    34,    39,     6,    39,     7,    86,    87,    63,
+      11,    40,   116,    40,   -66,   117,   -66,    79,    80,    81,
+      82,    83,    84,   112,   113,   114,   115,   119,   121,    41,
+      42,    43,    42,    43,    79,    80,    81,    82,    83,    84,
+     108,   109,    12,   110,   111,    13,    16,    17,   -10,    22,
+      27,    68,   -15,    34,    31,    33,    60,    57,    58,    69,
+      71,    70,    72,    35,    99,    78,    77,    97,    95,    90,
+      73,    74,   118,     0,   107,     0,     0,     0,     0,     0,
+       0,     0,    30
 };
 
 static const yytype_int8 yycheck[] =
 {
-      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
+      72,    69,    74,    13,     6,     0,     8,    27,     5,     6,
+      78,    79,    80,    81,    82,    83,    84,     7,    38,     3,
+      10,    13,    10,    13,     4,    13,    13,    36,    37,    39,
+       7,    21,    25,    21,    24,   107,    24,    30,    31,    32,
+      33,    34,    35,     5,     6,     5,     6,   115,   120,    39,
+      40,    41,    40,    41,    30,    31,    32,    33,    34,    35,
+      86,    87,    13,    88,    89,    15,     6,     9,    12,    12,
+      18,     4,    13,    10,    13,    13,     7,    13,    13,     4,
+       7,    11,     8,    28,     7,    14,    60,    73,    71,    13,
+      24,    23,   113,    -1,    22,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    24
 };
 
 /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
@@ -749,15 +750,15 @@ static const yytype_int8 yystos[] =
        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
+      21,    39,    40,    41,    63,    64,    65,    66,    67,    68,
+      71,    76,    79,    80,    81,    83,    85,    13,    13,    57,
+       7,    77,    13,    39,    73,    74,    75,    78,     4,     4,
+      11,     7,     8,    24,    23,    84,    56,    46,    14,    30,
+      31,    32,    33,    34,    35,    86,    36,    37,    27,    38,
+      13,    69,    70,    72,    74,    64,    66,    73,    66,     7,
+      74,    74,    74,    74,    74,    74,    74,    22,    75,    75,
+      78,    78,     5,     6,     5,     6,    25,    66,    70,    74,
+      82,    66
 };
 
 /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM.  */
@@ -766,11 +767,11 @@ static const yytype_int8 yyr1[] =
        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
+      64,    65,    65,    66,    66,    66,    66,    66,    66,    66,
+      67,    68,    69,    69,    70,    71,    72,    72,    73,    73,
+      73,    73,    73,    73,    73,    74,    74,    74,    75,    75,
+      75,    77,    76,    78,    78,    79,    81,    82,    80,    83,
+      84,    84,    86,    85
 };
 
 /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM.  */
@@ -779,11 +780,11 @@ static const yytype_int8 yyr2[] =
        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
+       0,     3,     1,     1,     1,     1,     1,     1,     1,     1,
+       0,     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
 };
 
 
@@ -1251,7 +1252,7 @@ yyreduce:
              {
              geraCodigo (NULL, "INPP");
              }
-#line 1255 "compilador.tab.c"
+#line 1256 "compilador.tab.c"
     break;
 
   case 3: /* programa: $@1 PROGRAM IDENT ABRE_PARENTESES lista_idents FECHA_PARENTESES PONTO_E_VIRGULA bloco PONTO  */
@@ -1259,7 +1260,7 @@ yyreduce:
              {
                geraCodigo (NULL, "PARA");
              }
-#line 1263 "compilador.tab.c"
+#line 1264 "compilador.tab.c"
     break;
 
   case 4: /* $@2: %empty  */
@@ -1274,7 +1275,7 @@ yyreduce:
             strcat(buffer,r_main);
             geraCodigo(NULL,buffer);
          }
-#line 1278 "compilador.tab.c"
+#line 1279 "compilador.tab.c"
     break;
 
   case 5: /* $@3: %empty  */
@@ -1284,7 +1285,7 @@ yyreduce:
             desempilha(r_main,rot);
             geraCodigo(r_main,"NADA");
          }
-#line 1288 "compilador.tab.c"
+#line 1289 "compilador.tab.c"
     break;
 
   case 6: /* bloco: parte_declara_rotulos parte_declara_vars $@2 parte_declara_subrotinas $@3 comando_composto  */
@@ -1296,19 +1297,19 @@ yyreduce:
             geraCodigo(NULL,buffer);
             desloc = 0;
          }
-#line 1300 "compilador.tab.c"
+#line 1301 "compilador.tab.c"
     break;
 
   case 10: /* $@4: %empty  */
 #line 93 "compilador.y"
               { }
-#line 1306 "compilador.tab.c"
+#line 1307 "compilador.tab.c"
     break;
 
   case 15: /* $@5: %empty  */
 #line 101 "compilador.y"
               { num_vars = 0; }
-#line 1312 "compilador.tab.c"
+#line 1313 "compilador.tab.c"
     break;
 
   case 16: /* $@6: %empty  */
@@ -1318,7 +1319,7 @@ yyreduce:
                sprintf(buffer, "AMEM %d", num_vars);
                geraCodigo(NULL, buffer);
               }
-#line 1322 "compilador.tab.c"
+#line 1323 "compilador.tab.c"
     break;
 
   case 18: /* tipo: IDENT  */
@@ -1331,9 +1332,9 @@ yyreduce:
                 } else {
                     yyerror("Tipo não reconhecido. Somente 'integer' ou 'boolean' são permitidos.");
                 }
-                //mostra_ts(ts); // Mostra a tabela após a inserção
+                mostra_ts(ts); // Mostra a tabela após a inserção
                }
-#line 1337 "compilador.tab.c"
+#line 1338 "compilador.tab.c"
     break;
 
   case 19: /* lista_id_var: lista_id_var VIRGULA IDENT  */
@@ -1346,7 +1347,7 @@ yyreduce:
                insere_ts(token,VS,nivel_lexico,info,ts);
                desloc += 1;
               }
-#line 1350 "compilador.tab.c"
+#line 1351 "compilador.tab.c"
     break;
 
   case 20: /* lista_id_var: IDENT  */
@@ -1360,7 +1361,7 @@ yyreduce:
                desloc += 1;
                /* insere vars na tabela de s�mbolos */
             }
-#line 1364 "compilador.tab.c"
+#line 1365 "compilador.tab.c"
     break;
 
   case 25: /* $@7: %empty  */
@@ -1380,19 +1381,19 @@ yyreduce:
             char buffer[50];
             sprintf(buffer,"ENPR %d",nivel_lexico);
             geraCodigo(r_proc,buffer);
-            //mostra_ts(ts);
+            mostra_ts(ts);
             }
-#line 1386 "compilador.tab.c"
+#line 1387 "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"
+#line 1393 "compilador.tab.c"
     break;
 
-  case 42: /* simb_leitura: IDENT  */
-#line 208 "compilador.y"
+  case 44: /* simb_leitura: IDENT  */
+#line 220 "compilador.y"
                     {
                geraCodigo(NULL, "LEIT");
                l_elem = busca(token,ts);
@@ -1400,108 +1401,109 @@ yyreduce:
                sprintf(buffer,"ARMZ %d,%d",l_elem->nivel,l_elem->info.vs.desloc);
                geraCodigo(NULL,buffer);
             }
-#line 1404 "compilador.tab.c"
+#line 1405 "compilador.tab.c"
     break;
 
-  case 44: /* lista_escritas: lista_escritas VIRGULA expressao_simples  */
-#line 220 "compilador.y"
+  case 46: /* lista_escritas: lista_escritas VIRGULA expressao_simples  */
+#line 232 "compilador.y"
                                                          {
                geraCodigo(NULL,"IMPR");
             }
-#line 1412 "compilador.tab.c"
+#line 1413 "compilador.tab.c"
     break;
 
-  case 45: /* lista_escritas: expressao_simples  */
-#line 223 "compilador.y"
+  case 47: /* lista_escritas: expressao_simples  */
+#line 235 "compilador.y"
                                 {
                geraCodigo(NULL,"IMPR");
             }
-#line 1420 "compilador.tab.c"
+#line 1421 "compilador.tab.c"
     break;
 
-  case 46: /* expressao: expressao IGUAL expressao_simples  */
-#line 228 "compilador.y"
+  case 48: /* expressao: expressao IGUAL expressao_simples  */
+#line 240 "compilador.y"
                                              {
             geraCodigo(NULL, "CMIG"); // Adiciona operação de cmig
          }
-#line 1428 "compilador.tab.c"
+#line 1429 "compilador.tab.c"
     break;
 
-  case 47: /* expressao: expressao DIFERENTE expressao_simples  */
-#line 231 "compilador.y"
+  case 49: /* expressao: expressao DIFERENTE expressao_simples  */
+#line 243 "compilador.y"
                                                 {
             geraCodigo(NULL, "CMDG"); // Adiciona operação de cmdg
          }
-#line 1436 "compilador.tab.c"
+#line 1437 "compilador.tab.c"
     break;
 
-  case 48: /* expressao: expressao MENOR expressao_simples  */
-#line 234 "compilador.y"
+  case 50: /* expressao: expressao MENOR expressao_simples  */
+#line 246 "compilador.y"
                                              {
             geraCodigo(NULL, "CMME"); // Adiciona operação de cmme
          }
-#line 1444 "compilador.tab.c"
+#line 1445 "compilador.tab.c"
     break;
 
-  case 49: /* expressao: expressao MENOR_IGUAL expressao_simples  */
-#line 237 "compilador.y"
+  case 51: /* expressao: expressao MENOR_IGUAL expressao_simples  */
+#line 249 "compilador.y"
                                                    {
             geraCodigo(NULL, "CMEG"); // Adiciona operação de cmeg
          }
-#line 1452 "compilador.tab.c"
+#line 1453 "compilador.tab.c"
     break;
 
-  case 50: /* expressao: expressao MAIOR expressao_simples  */
-#line 240 "compilador.y"
+  case 52: /* expressao: expressao MAIOR expressao_simples  */
+#line 252 "compilador.y"
                                              {
             geraCodigo(NULL, "CMMA"); // Adiciona operação de cmma
          }
-#line 1460 "compilador.tab.c"
+#line 1461 "compilador.tab.c"
     break;
 
-  case 51: /* expressao: expressao MAIOR_IGUAL expressao_simples  */
-#line 243 "compilador.y"
+  case 53: /* expressao: expressao MAIOR_IGUAL expressao_simples  */
+#line 255 "compilador.y"
                                                    {
             geraCodigo(NULL, "CMAG"); // Adiciona operação de cmag
          }
-#line 1468 "compilador.tab.c"
+#line 1469 "compilador.tab.c"
     break;
 
-  case 53: /* expressao_simples: expressao_simples MAIS termo  */
-#line 249 "compilador.y"
+  case 55: /* expressao_simples: expressao_simples MAIS termo  */
+#line 261 "compilador.y"
                                                 {
                geraCodigo(NULL, "SOMA"); // Adiciona operação de soma
             }
-#line 1476 "compilador.tab.c"
+#line 1477 "compilador.tab.c"
     break;
 
-  case 54: /* expressao_simples: expressao_simples MENOS termo  */
-#line 252 "compilador.y"
+  case 56: /* expressao_simples: expressao_simples MENOS termo  */
+#line 264 "compilador.y"
                                             {
                geraCodigo(NULL, "SUBT"); // Adiciona operação de subt
             }
-#line 1484 "compilador.tab.c"
+#line 1485 "compilador.tab.c"
     break;
 
-  case 56: /* termo: termo ASTERISCO fator  */
-#line 258 "compilador.y"
+  case 58: /* termo: termo ASTERISCO fator  */
+#line 270 "compilador.y"
                              {
                geraCodigo(NULL, "MULT"); // Adiciona operação de mult
             }
-#line 1492 "compilador.tab.c"
+#line 1493 "compilador.tab.c"
     break;
 
-  case 57: /* termo: termo DIV fator  */
-#line 261 "compilador.y"
+  case 59: /* termo: termo DIV fator  */
+#line 273 "compilador.y"
                               {
                geraCodigo(NULL, "DIVI"); // Adiciona operação de divi
             }
-#line 1500 "compilador.tab.c"
+#line 1501 "compilador.tab.c"
     break;
 
-  case 59: /* $@8: %empty  */
-#line 267 "compilador.y"
+  case 61: /* $@8: %empty  */
+#line 279 "compilador.y"
                   {
+   mostra_ts(ts);
     // Busca variável no lado esquerdo
     l_elem = busca(token, ts);
     if (l_elem == NULL) {
@@ -1511,22 +1513,22 @@ yyreduce:
         destino_desloc = l_elem->info.vs.desloc;
     }
 }
-#line 1515 "compilador.tab.c"
+#line 1517 "compilador.tab.c"
     break;
 
-  case 60: /* atribuicao: IDENT $@8 ATRIBUICAO expressao_simples  */
-#line 276 "compilador.y"
+  case 62: /* atribuicao: IDENT $@8 ATRIBUICAO expressao_simples  */
+#line 289 "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 1526 "compilador.tab.c"
+#line 1528 "compilador.tab.c"
     break;
 
-  case 61: /* fator: IDENT  */
-#line 284 "compilador.y"
+  case 63: /* fator: IDENT  */
+#line 297 "compilador.y"
              {
     // Carrega variável
     l_elem = busca(token, ts);
@@ -1538,22 +1540,22 @@ yyreduce:
         geraCodigo(NULL, buffer);
     }
 }
-#line 1542 "compilador.tab.c"
+#line 1544 "compilador.tab.c"
     break;
 
-  case 62: /* fator: NUMERO  */
-#line 295 "compilador.y"
+  case 64: /* fator: NUMERO  */
+#line 308 "compilador.y"
          {
     // Empilha constante
     char buffer[50];
     sprintf(buffer, "CRCT %s", token);
     geraCodigo(NULL, buffer);
 }
-#line 1553 "compilador.tab.c"
+#line 1555 "compilador.tab.c"
     break;
 
-  case 64: /* $@9: %empty  */
-#line 304 "compilador.y"
+  case 66: /* $@9: %empty  */
+#line 317 "compilador.y"
                     {
                char r_ini[4];
                sprintf(r_ini, "R%02d", rot_id);
@@ -1561,11 +1563,11 @@ yyreduce:
                rot_id += 1;
                geraCodigo(r_ini,"NADA");
             }
-#line 1565 "compilador.tab.c"
+#line 1567 "compilador.tab.c"
     break;
 
-  case 65: /* $@10: %empty  */
-#line 311 "compilador.y"
+  case 67: /* $@10: %empty  */
+#line 324 "compilador.y"
                                {
                char r_fim[4];
                sprintf(r_fim, "R%02d", rot_id);
@@ -1576,11 +1578,11 @@ yyreduce:
                strcat(buffer,r_fim);
                geraCodigo(NULL,buffer);
             }
-#line 1580 "compilador.tab.c"
+#line 1582 "compilador.tab.c"
     break;
 
-  case 66: /* comando_repetitivo: $@9 WHILE expressao DO $@10 comando_sem_rotulo  */
-#line 321 "compilador.y"
+  case 68: /* comando_repetitivo: $@9 WHILE expressao DO $@10 comando_sem_rotulo  */
+#line 334 "compilador.y"
                                {
                char r_ini[4];
                char r_fim[4];
@@ -1595,21 +1597,21 @@ yyreduce:
 
                geraCodigo(r_fim,"NADA");
             }
-#line 1599 "compilador.tab.c"
+#line 1601 "compilador.tab.c"
     break;
 
-  case 67: /* comando_condicional: if_then cond_else  */
-#line 337 "compilador.y"
+  case 69: /* comando_condicional: if_then cond_else  */
+#line 350 "compilador.y"
                                        {
                char r_fim[4];
                desempilha(r_fim,rot);
                geraCodigo(r_fim,"NADA");
             }
-#line 1609 "compilador.tab.c"
+#line 1611 "compilador.tab.c"
     break;
 
-  case 70: /* $@11: %empty  */
-#line 349 "compilador.y"
+  case 72: /* $@11: %empty  */
+#line 362 "compilador.y"
                       {
                char r_else[4];
                sprintf(r_else,"R%02d",rot_id);
@@ -1625,11 +1627,11 @@ yyreduce:
                empilha(r_fim, rot);
                rot_id += 1;
             }
-#line 1629 "compilador.tab.c"
+#line 1631 "compilador.tab.c"
     break;
 
-  case 71: /* if_then: IF expressao $@11 THEN comando_sem_rotulo  */
-#line 364 "compilador.y"
+  case 73: /* if_then: IF expressao $@11 THEN comando_sem_rotulo  */
+#line 377 "compilador.y"
                                     {
                char r_fim[4];
                desempilha(r_fim,rot);
@@ -1644,11 +1646,11 @@ yyreduce:
 
                geraCodigo(r_else,"NADA");
             }
-#line 1648 "compilador.tab.c"
+#line 1650 "compilador.tab.c"
     break;
 
 
-#line 1652 "compilador.tab.c"
+#line 1654 "compilador.tab.c"
 
       default: break;
     }
@@ -1841,7 +1843,7 @@ yyreturnlab:
   return yyresult;
 }
 
-#line 381 "compilador.y"
+#line 394 "compilador.y"
 
 
 int main (int argc, char** argv) {
diff --git a/compilador.y b/compilador.y
index d231df921b8ba07c3a6282616c928e905b5a1746..91a5f84f24bd2beaf7db4a921c85a5e58d20f905 100644
--- a/compilador.y
+++ b/compilador.y
@@ -118,7 +118,7 @@ tipo        : IDENT
                 } else {
                     yyerror("Tipo não reconhecido. Somente 'integer' ou 'boolean' são permitidos.");
                 }
-                //mostra_ts(ts); // Mostra a tabela após a inserção
+                mostra_ts(ts); // Mostra a tabela após a inserção
                }
 ;
 
@@ -168,7 +168,7 @@ declaracao_procedimento: PROCEDURE IDENT {
             char buffer[50];
             sprintf(buffer,"ENPR %d",nivel_lexico);
             geraCodigo(r_proc,buffer);
-            //mostra_ts(ts);
+            mostra_ts(ts);
             }
             PONTO_E_VIRGULA bloco
             { nivel_lexico -= 1; }
@@ -193,10 +193,22 @@ comando_sem_rotulo: atribuicao
             | comando_repetitivo
             | leitura
             | escrita
-            //| chamada_procedimento
+            | chamada_procedimento
 ;
 
-//chamada_procedimento: ;
+chamada_procedimento: /*IDENT {
+               l_elem = busca(token,ts);
+               if (l_elem == NULL || l_elem->categ != PR) {
+                  yyerror("Procedimento não declarado");
+               } else {
+                  // Gera código para chamar o procedimento
+                  char buffer[50];
+                  sprintf(buffer, "CHPR %s,%d", l_elem->info.pr.rot, nivel_lexico);
+                  geraCodigo(NULL, buffer);
+               }
+               //ABRE_PARENTESES FECHA_PARENTESES
+            }*/
+;
 
 leitura: READ ABRE_PARENTESES lista_leituras FECHA_PARENTESES
 ;
@@ -265,6 +277,7 @@ termo: termo ASTERISCO fator {
 ;
 
 atribuicao: IDENT {
+   mostra_ts(ts);
     // Busca variável no lado esquerdo
     l_elem = busca(token, ts);
     if (l_elem == NULL) {
diff --git a/teste2.pas b/teste2.pas
index 7c13741d05f82ee25cafaa7707421266dc844dd3..93c6a6a113b517633a5da0885af94f92c54c120a 100644
--- a/teste2.pas
+++ b/teste2.pas
@@ -3,5 +3,5 @@ var a: integer;
     b: integer;
 begin
     a := 5;
-    b := a + 5 * 2;
+    b := b + 5 * 2;
 end.
diff --git a/teste6.pas b/teste6.pas
index 52ee27eb605a7574abaf28dd72792427474d6354..cb2699e92f28899a2dd4c63ca01f5c6d6c8e90b3 100644
--- a/teste6.pas
+++ b/teste6.pas
@@ -7,4 +7,5 @@ program proc1 (input, output);
     end
 begin
     x := 8;
+    p
 end.
\ No newline at end of file
diff --git a/ts/ts.c b/ts/ts.c
index 12d505120bdb5868b9b79f5a6b44ab87d5117a23..2fed12532577cdd00c3fada41ea86385cf76a983 100644
--- a/ts/ts.c
+++ b/ts/ts.c
@@ -75,7 +75,7 @@ void atualiza_tipo(int n, int tipo, ts_t *ts){
 	}
 }
 
-/*void mostra_ts(ts_t *ts) {
+void mostra_ts(ts_t *ts) {
     if (ts == NULL || ts->topo == NULL) {
         printf("Tabela de Símbolos está vazia ou não inicializada.\n");
         return;
@@ -83,34 +83,46 @@ void atualiza_tipo(int n, int tipo, ts_t *ts){
 
     printf("\nTabela de Símbolos:\n");
     printf("----------------------------------------------------------------------------------\n");
-    printf("| %-10s | %-8s | %-8s | %-10s | %-10s |\n", 
-           "Ident", "Categ", "Nivel", "Tipo", "Desloc");
+    printf("| %-10s | %-8s | %-8s | %-10s | %-10s | %-20s |\n", 
+           "Ident", "Categ", "Nivel", "Tipo", "Desloc", "Detalhes");
     printf("----------------------------------------------------------------------------------\n");
 
     simb_t *p = ts->topo;
     while (p != NULL) {
-        // Identificar o tipo como Inteiro, Boolean ou Indefinido
-        const char *tipoStr;
-        switch (p->info.vs.tipo) {
-            case INTEIRO:
-                tipoStr = "Inteiro";
-                break;
-            case BOOLEAN:
-                tipoStr = "Boolean";
-                break;
-            default:
-                tipoStr = "NSEI";
-                break;
+        // Identificar a categoria
+        const char *categStr;
+        const char *tipoStr = "-";
+        char deslocStr[10] = "-";
+        char detalhes[50] = "-";
+
+        if (p->categ == VS) {
+            categStr = "VS";
+            // Determina o tipo como Inteiro, Boolean ou Indefinido
+            switch (p->info.vs.tipo) {
+                case INTEIRO:
+                    tipoStr = "Inteiro";
+                    break;
+                case BOOLEAN:
+                    tipoStr = "Boolean";
+                    break;
+                default:
+                    tipoStr = "NSEI";
+                    break;
+            }
+            sprintf(deslocStr, "%d", p->info.vs.desloc);
+        } else if (p->categ == PR) {
+            categStr = "PR";
+            tipoStr = "-";
+            sprintf(detalhes, "%s, Params: %d", p->info.pr.rot, p->info.pr.quant);
+        } else {
+            categStr = "Outro";
         }
 
-        // Determinar a categoria
-        const char *categStr = (p->categ == VS) ? "VS" : "Outro";
-
-        // Imprimir a entrada
-        printf("| %-10s | %-8s | %-8d | %-10s | %-10d |\n", 
-               p->ident, categStr, p->nivel, tipoStr, p->info.vs.desloc);
+        // Imprime a entrada
+        printf("| %-10s | %-8s | %-8d | %-10s | %-10s | %-20s |\n", 
+               p->ident, categStr, p->nivel, tipoStr, deslocStr, detalhes);
 
         p = p->prox;
     }
     printf("----------------------------------------------------------------------------------\n");
-}*/
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/ts/ts.h b/ts/ts.h
index a3ea8d463e2e2b3477ac26b72ec5882fae460ef4..7db1cecc1865709198df406560881480b35c0d57 100644
--- a/ts/ts.h
+++ b/ts/ts.h
@@ -49,6 +49,6 @@ void retira(int n, ts_t *ts);
 
 void atualiza_tipo(int n, int tipo, ts_t *ts);
 
-//void mostra_ts(ts_t *ts);
+void mostra_ts(ts_t *ts);
 
 #endif
diff --git a/ts/ts.o b/ts/ts.o
index 45b0d9bc32a2d071f4485b2ad49fcf11a902a84a..49ecde5f0c6f37d09706be2dfb8317baf4653812 100644
Binary files a/ts/ts.o and b/ts/ts.o differ