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