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