From 967bf512a858bd5dae2f060f8b84dffbbb71295d Mon Sep 17 00:00:00 2001 From: Henrique Margotte <henriquemargotte@gmail.com> Date: Thu, 28 Nov 2024 16:29:59 -0300 Subject: [PATCH] if funcionando, dmem adicionado, read e write adicionados --- MEPA | 56 ++- compilador | Bin 41416 -> 45512 bytes compilador.h | 2 +- compilador.l | 14 +- compilador.output | 1100 +++++++++++++++++++++++++++++---------------- compilador.tab.c | 482 ++++++++++++-------- compilador.tab.h | 5 +- compilador.y | 72 ++- lex.yy.c | 317 +++++++------ teste5.pas | 20 + 10 files changed, 1327 insertions(+), 741 deletions(-) create mode 100644 teste5.pas diff --git a/MEPA b/MEPA index f41e650..dd41d3f 100644 --- a/MEPA +++ b/MEPA @@ -1,29 +1,49 @@ INPP AMEM 2 - AMEM 3 - CRCT 0 - ARMZ 0,2 - CRCT 1 - ARMZ 0,3 - CRCT 1 + LEIT ARMZ 0,1 + CRCT 0 + ARMZ 0,0 R00: NADA - CRVL 0,1 CRVL 0,0 - CMEG - DSVF R01 - CRVL 0,3 - CRVL 0,2 - SOMA - ARMZ 0,4 - CRVL 0,3 - ARMZ 0,2 - CRVL 0,4 - ARMZ 0,3 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,1 + ARMZ 0,0 DSVS R00 R01: NADA + DMEM 2 PARA diff --git a/compilador b/compilador index 7f8599f3f7ee14c55ee262e5aaab503a1ab05654..3ee94dfccf57ca4549a0ec2e49fb5de71888f511 100755 GIT binary patch literal 45512 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 delta 19743 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 UHrjK7W{VgY7^D~{XRVS00G{QyWB>pF diff --git a/compilador.h b/compilador.h index 3f1dc0c..5e8d4e8 100644 --- a/compilador.h +++ b/compilador.h @@ -16,7 +16,7 @@ typedef enum simbolos { simb_program, simb_var, simb_begin, simb_end, simb_identificador, simb_numero, - simb_ponto, simb_virgula, simb_ponto_e_virgula, simb_dois_pontos, + simb_ponto, simb_virgula, simb_ponto_e_virgula, simb_dois_pontos, simb_read, simb_write, simb_atribuicao, simb_abre_parenteses, simb_fecha_parenteses, simb_label, simb_type, simb_array, simb_procedure, simb_function, simb_goto, simb_if, simb_then, simb_else, simb_while, simb_do, simb_or, simb_div, simb_and, simb_not, simb_igual, simb_diferente, simb_menor_igual, simb_maior_igual, simb_menor, simb_maior, simb_mais, simb_menos, simb_asterisco } simbolos; diff --git a/compilador.l b/compilador.l index 1f1f4a3..0629b8c 100644 --- a/compilador.l +++ b/compilador.l @@ -70,6 +70,18 @@ end { simbolo = simb_end; return T_END; } +read { simbolo = simb_read; + strncpy (token, yytext, TAM_TOKEN); + IMPRIME("read "); + return READ; +} + +write { simbolo = simb_write; + strncpy (token, yytext, TAM_TOKEN); + IMPRIME("write "); + return WRITE; +} + := { simbolo = simb_atribuicao; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" atribuicao "); @@ -163,7 +175,7 @@ then { simbolo = simb_then; else { simbolo = simb_else; strncpy (token, yytext, TAM_TOKEN); - IMPRIME("else "); + IMPRIME(" else "); return ELSE; } diff --git a/compilador.output b/compilador.output index de7b057..1ca2ea0 100644 --- a/compilador.output +++ b/compilador.output @@ -5,15 +5,12 @@ Terminais sem uso na gramática PROCEDURE FUNCTION GOTO - IF - THEN - ELSE OR AND NOT -Estado 47 conflitos: 1 de redução/redução +Estado 61 conflitos: 1 de redução/redução Gramática @@ -70,39 +67,60 @@ Gramática 29 | comando_composto 30 | comando_condicional 31 | comando_repetitivo + 32 | leitura + 33 | escrita - 32 expressao: expressao IGUAL expressao_simples - 33 | expressao DIFERENTE expressao_simples - 34 | expressao MENOR expressao_simples - 35 | expressao MENOR_IGUAL expressao_simples - 36 | expressao MAIOR expressao_simples - 37 | expressao MAIOR_IGUAL expressao_simples - 38 | expressao_simples + 34 leitura: READ ABRE_PARENTESES lista_leituras FECHA_PARENTESES - 39 expressao_simples: expressao_simples MAIS termo - 40 | expressao_simples MENOS termo - 41 | termo + 35 lista_leituras: lista_leituras VIRGULA simb_leitura + 36 | simb_leitura - 42 termo: termo ASTERISCO fator - 43 | termo DIV fator - 44 | fator + 37 simb_leitura: IDENT - 45 $@6: ε + 38 escrita: WRITE ABRE_PARENTESES lista_escritas FECHA_PARENTESES - 46 atribuicao: IDENT $@6 ATRIBUICAO expressao_simples + 39 lista_escritas: lista_escritas VIRGULA expressao_simples + 40 | expressao_simples - 47 fator: IDENT - 48 | NUMERO + 41 expressao: expressao IGUAL expressao_simples + 42 | expressao DIFERENTE expressao_simples + 43 | expressao MENOR expressao_simples + 44 | expressao MENOR_IGUAL expressao_simples + 45 | expressao MAIOR expressao_simples + 46 | expressao MAIOR_IGUAL expressao_simples + 47 | expressao_simples - 49 numero: NUMERO + 48 expressao_simples: expressao_simples MAIS termo + 49 | expressao_simples MENOS termo + 50 | termo - 50 $@7: ε + 51 termo: termo ASTERISCO fator + 52 | termo DIV fator + 53 | fator - 51 $@8: ε + 54 $@6: ε - 52 comando_repetitivo: $@7 WHILE expressao DO $@8 comando_sem_rotulo + 55 atribuicao: IDENT $@6 ATRIBUICAO expressao_simples - 53 comando_condicional: ε + 56 fator: IDENT + 57 | NUMERO + + 58 numero: NUMERO + + 59 $@7: ε + + 60 $@8: ε + + 61 comando_repetitivo: $@7 WHILE expressao DO $@8 comando_sem_rotulo + + 62 comando_condicional: if_then cond_else + + 63 cond_else: ELSE comando_sem_rotulo + 64 | ε + + 65 $@9: ε + + 66 if_then: IF expressao $@9 THEN comando_sem_rotulo Terminais, com as regras onde eles aparecem @@ -110,141 +128,168 @@ Terminais, com as regras onde eles aparecem $end (0) 0 error (256) PROGRAM (258) 2 - ABRE_PARENTESES (259) 2 - FECHA_PARENTESES (260) 2 - VIRGULA (261) 5 17 19 + ABRE_PARENTESES (259) 2 34 38 + FECHA_PARENTESES (260) 2 34 38 + VIRGULA (261) 5 17 19 35 39 PONTO_E_VIRGULA (262) 2 15 23 24 DOIS_PONTOS (263) 15 26 PONTO (264) 2 T_BEGIN (265) 22 T_END (266) 22 VAR (267) 9 - IDENT (268) 2 16 17 18 19 20 46 47 - ATRIBUICAO (269) 46 + IDENT (268) 2 16 17 18 19 20 37 55 56 + ATRIBUICAO (269) 55 LABEL (270) 5 TYPE (271) ARRAY (272) PROCEDURE (273) FUNCTION (274) GOTO (275) - IF (276) - THEN (277) - ELSE (278) - WHILE (279) 52 - DO (280) 52 + IF (276) 66 + THEN (277) 66 + ELSE (278) 63 + WHILE (279) 61 + DO (280) 61 OR (281) - DIV (282) 43 + DIV (282) 52 AND (283) NOT (284) - IGUAL (285) 32 - DIFERENTE (286) 33 - MENOR_IGUAL (287) 35 - MAIOR_IGUAL (288) 37 - MENOR (289) 34 - MAIOR (290) 36 - MAIS (291) 39 - MENOS (292) 40 - ASTERISCO (293) 42 - NUMERO (294) 48 49 + IGUAL (285) 41 + DIFERENTE (286) 42 + MENOR_IGUAL (287) 44 + MAIOR_IGUAL (288) 46 + MENOR (289) 43 + MAIOR (290) 45 + MAIS (291) 48 + MENOS (292) 49 + ASTERISCO (293) 51 + NUMERO (294) 57 58 + READ (295) 34 + WRITE (296) 38 + LOWER_THAN_ELSE (297) Não terminais com as regras onde eles aparecem - $accept (40) + $accept (43) à esquerda: 0 - programa (41) + programa (44) à esquerda: 2 à direita: 0 - $@1 (42) + $@1 (45) à esquerda: 1 à direita: 2 - bloco (43) + bloco (46) à esquerda: 4 à direita: 2 - $@2 (44) + $@2 (47) à esquerda: 3 à direita: 4 - parte_declara_rotulos (45) + parte_declara_rotulos (48) à esquerda: 5 6 à direita: 4 - parte_declara_vars (46) + parte_declara_vars (49) à esquerda: 7 à direita: 4 - var (47) + var (50) à esquerda: 9 10 à direita: 7 - $@3 (48) + $@3 (51) à esquerda: 8 à direita: 9 - declara_vars (49) + declara_vars (52) à esquerda: 11 12 à direita: 9 11 - declara_var (50) + declara_var (53) à esquerda: 15 à direita: 11 12 - $@4 (51) + $@4 (54) à esquerda: 13 à direita: 15 - $@5 (52) + $@5 (55) à esquerda: 14 à direita: 15 - tipo (53) + tipo (56) à esquerda: 16 à direita: 15 - lista_id_var (54) + lista_id_var (57) à esquerda: 17 18 à direita: 15 17 - lista_idents (55) + lista_idents (58) à esquerda: 19 20 à direita: 2 19 - parte_declara_subrotinas (56) + parte_declara_subrotinas (59) à esquerda: 21 à direita: 4 - comando_composto (57) + comando_composto (60) à esquerda: 22 à direita: 4 29 - comandos (58) + comandos (61) à esquerda: 23 24 25 à direita: 22 23 - comando (59) + comando (62) à esquerda: 26 27 à direita: 23 24 - comando_sem_rotulo (60) - à esquerda: 28 29 30 31 - à direita: 26 27 52 - expressao (61) - à esquerda: 32 33 34 35 36 37 38 - à direita: 32 33 34 35 36 37 52 - expressao_simples (62) - à esquerda: 39 40 41 - à direita: 32 33 34 35 36 37 38 39 40 46 - termo (63) - à esquerda: 42 43 44 - à direita: 39 40 41 42 43 - atribuicao (64) - à esquerda: 46 + comando_sem_rotulo (63) + à esquerda: 28 29 30 31 32 33 + à direita: 26 27 61 63 66 + leitura (64) + à esquerda: 34 + à direita: 32 + lista_leituras (65) + à esquerda: 35 36 + à direita: 34 35 + simb_leitura (66) + à esquerda: 37 + à direita: 35 36 + escrita (67) + à esquerda: 38 + à direita: 33 + lista_escritas (68) + à esquerda: 39 40 + à direita: 38 39 + expressao (69) + à esquerda: 41 42 43 44 45 46 47 + à direita: 41 42 43 44 45 46 61 66 + expressao_simples (70) + à esquerda: 48 49 50 + à direita: 39 40 41 42 43 44 45 46 47 48 49 55 + termo (71) + à esquerda: 51 52 53 + à direita: 48 49 50 51 52 + atribuicao (72) + à esquerda: 55 à direita: 28 - $@6 (65) - à esquerda: 45 - à direita: 46 - fator (66) - à esquerda: 47 48 - à direita: 42 43 44 - numero (67) - à esquerda: 49 + $@6 (73) + à esquerda: 54 + à direita: 55 + fator (74) + à esquerda: 56 57 + à direita: 51 52 53 + numero (75) + à esquerda: 58 à direita: 26 - comando_repetitivo (68) - à esquerda: 52 + comando_repetitivo (76) + à esquerda: 61 à direita: 31 - $@7 (69) - à esquerda: 50 - à direita: 52 - $@8 (70) - à esquerda: 51 - à direita: 52 - comando_condicional (71) - à esquerda: 53 + $@7 (77) + à esquerda: 59 + à direita: 61 + $@8 (78) + à esquerda: 60 + à direita: 61 + comando_condicional (79) + à esquerda: 62 à direita: 30 + cond_else (80) + à esquerda: 63 64 + à direita: 62 + if_then (81) + à esquerda: 66 + à direita: 62 + $@9 (82) + à esquerda: 65 + à direita: 66 Estado 0 @@ -476,21 +521,26 @@ Estado 27 T_BEGIN deslocar, e ir ao estado 27 IDENT deslocar, e ir ao estado 32 - NUMERO deslocar, e ir ao estado 33 - - PONTO_E_VIRGULA reduzir usando a regra 53 (comando_condicional) - WHILE reduzir usando a regra 50 ($@7) - $padrão reduzir usando a regra 25 (comandos) - - comando_composto ir ao estado 34 - comandos ir ao estado 35 - comando ir ao estado 36 - comando_sem_rotulo ir ao estado 37 - atribuicao ir ao estado 38 - numero ir ao estado 39 - comando_repetitivo ir ao estado 40 - $@7 ir ao estado 41 - comando_condicional ir ao estado 42 + IF deslocar, e ir ao estado 33 + NUMERO deslocar, e ir ao estado 34 + READ deslocar, e ir ao estado 35 + WRITE deslocar, e ir ao estado 36 + + WHILE reduzir usando a regra 59 ($@7) + $padrão reduzir usando a regra 25 (comandos) + + comando_composto ir ao estado 37 + comandos ir ao estado 38 + comando ir ao estado 39 + comando_sem_rotulo ir ao estado 40 + leitura ir ao estado 41 + escrita ir ao estado 42 + atribuicao ir ao estado 43 + numero ir ao estado 44 + comando_repetitivo ir ao estado 45 + $@7 ir ao estado 46 + comando_condicional ir ao estado 47 + if_then ir ao estado 48 Estado 28 @@ -519,569 +569,853 @@ Estado 31 15 declara_var: $@4 lista_id_var • DOIS_PONTOS tipo $@5 PONTO_E_VIRGULA 17 lista_id_var: lista_id_var • VIRGULA IDENT - VIRGULA deslocar, e ir ao estado 43 - DOIS_PONTOS deslocar, e ir ao estado 44 + VIRGULA deslocar, e ir ao estado 49 + DOIS_PONTOS deslocar, e ir ao estado 50 Estado 32 - 46 atribuicao: IDENT • $@6 ATRIBUICAO expressao_simples + 55 atribuicao: IDENT • $@6 ATRIBUICAO expressao_simples - $padrão reduzir usando a regra 45 ($@6) + $padrão reduzir usando a regra 54 ($@6) - $@6 ir ao estado 45 + $@6 ir ao estado 51 Estado 33 - 49 numero: NUMERO • + 66 if_then: IF • expressao $@9 THEN comando_sem_rotulo - $padrão reduzir usando a regra 49 (numero) + 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 Estado 34 - 29 comando_sem_rotulo: comando_composto • + 58 numero: NUMERO • - $padrão reduzir usando a regra 29 (comando_sem_rotulo) + $padrão reduzir usando a regra 58 (numero) Estado 35 - 22 comando_composto: T_BEGIN comandos • T_END + 34 leitura: READ • ABRE_PARENTESES lista_leituras FECHA_PARENTESES - T_END deslocar, e ir ao estado 46 + ABRE_PARENTESES deslocar, e ir ao estado 58 Estado 36 - 23 comandos: comando • PONTO_E_VIRGULA comandos - 24 | comando • PONTO_E_VIRGULA + 38 escrita: WRITE • ABRE_PARENTESES lista_escritas FECHA_PARENTESES - PONTO_E_VIRGULA deslocar, e ir ao estado 47 + ABRE_PARENTESES deslocar, e ir ao estado 59 Estado 37 - 27 comando: comando_sem_rotulo • + 29 comando_sem_rotulo: comando_composto • - $padrão reduzir usando a regra 27 (comando) + $padrão reduzir usando a regra 29 (comando_sem_rotulo) Estado 38 - 28 comando_sem_rotulo: atribuicao • + 22 comando_composto: T_BEGIN comandos • T_END - $padrão reduzir usando a regra 28 (comando_sem_rotulo) + T_END deslocar, e ir ao estado 60 Estado 39 - 26 comando: numero • DOIS_PONTOS comando_sem_rotulo + 23 comandos: comando • PONTO_E_VIRGULA comandos + 24 | comando • PONTO_E_VIRGULA - DOIS_PONTOS deslocar, e ir ao estado 48 + PONTO_E_VIRGULA deslocar, e ir ao estado 61 Estado 40 - 31 comando_sem_rotulo: comando_repetitivo • + 27 comando: comando_sem_rotulo • - $padrão reduzir usando a regra 31 (comando_sem_rotulo) + $padrão reduzir usando a regra 27 (comando) Estado 41 - 52 comando_repetitivo: $@7 • WHILE expressao DO $@8 comando_sem_rotulo + 32 comando_sem_rotulo: leitura • - WHILE deslocar, e ir ao estado 49 + $padrão reduzir usando a regra 32 (comando_sem_rotulo) Estado 42 - 30 comando_sem_rotulo: comando_condicional • + 33 comando_sem_rotulo: escrita • - $padrão reduzir usando a regra 30 (comando_sem_rotulo) + $padrão reduzir usando a regra 33 (comando_sem_rotulo) Estado 43 - 17 lista_id_var: lista_id_var VIRGULA • IDENT + 28 comando_sem_rotulo: atribuicao • - IDENT deslocar, e ir ao estado 50 + $padrão reduzir usando a regra 28 (comando_sem_rotulo) Estado 44 - 15 declara_var: $@4 lista_id_var DOIS_PONTOS • tipo $@5 PONTO_E_VIRGULA - - IDENT deslocar, e ir ao estado 51 + 26 comando: numero • DOIS_PONTOS comando_sem_rotulo - tipo ir ao estado 52 + DOIS_PONTOS deslocar, e ir ao estado 62 Estado 45 - 46 atribuicao: IDENT $@6 • ATRIBUICAO expressao_simples + 31 comando_sem_rotulo: comando_repetitivo • - ATRIBUICAO deslocar, e ir ao estado 53 + $padrão reduzir usando a regra 31 (comando_sem_rotulo) Estado 46 - 22 comando_composto: T_BEGIN comandos T_END • + 61 comando_repetitivo: $@7 • WHILE expressao DO $@8 comando_sem_rotulo - $padrão reduzir usando a regra 22 (comando_composto) + WHILE deslocar, e ir ao estado 63 Estado 47 - 23 comandos: comando PONTO_E_VIRGULA • comandos - 24 | comando PONTO_E_VIRGULA • - - T_BEGIN deslocar, e ir ao estado 27 - IDENT deslocar, e ir ao estado 32 - NUMERO deslocar, e ir ao estado 33 - - PONTO_E_VIRGULA reduzir usando a regra 53 (comando_condicional) - T_END reduzir usando a regra 24 (comandos) - T_END [reduzir usando a regra 25 (comandos)] - WHILE reduzir usando a regra 50 ($@7) - $padrão reduzir usando a regra 24 (comandos) + 30 comando_sem_rotulo: comando_condicional • - comando_composto ir ao estado 34 - comandos ir ao estado 54 - comando ir ao estado 36 - comando_sem_rotulo ir ao estado 37 - atribuicao ir ao estado 38 - numero ir ao estado 39 - comando_repetitivo ir ao estado 40 - $@7 ir ao estado 41 - comando_condicional ir ao estado 42 + $padrão reduzir usando a regra 30 (comando_sem_rotulo) Estado 48 - 26 comando: numero DOIS_PONTOS • comando_sem_rotulo + 62 comando_condicional: if_then • cond_else - T_BEGIN deslocar, e ir ao estado 27 - IDENT deslocar, e ir ao estado 32 + ELSE deslocar, e ir ao estado 64 - PONTO_E_VIRGULA reduzir usando a regra 53 (comando_condicional) - $padrão reduzir usando a regra 50 ($@7) + $padrão reduzir usando a regra 64 (cond_else) - comando_composto ir ao estado 34 - comando_sem_rotulo ir ao estado 55 - atribuicao ir ao estado 38 - comando_repetitivo ir ao estado 40 - $@7 ir ao estado 41 - comando_condicional ir ao estado 42 + cond_else ir ao estado 65 Estado 49 - 52 comando_repetitivo: $@7 WHILE • expressao DO $@8 comando_sem_rotulo - - IDENT deslocar, e ir ao estado 56 - NUMERO deslocar, e ir ao estado 57 + 17 lista_id_var: lista_id_var VIRGULA • IDENT - expressao ir ao estado 58 - expressao_simples ir ao estado 59 - termo ir ao estado 60 - fator ir ao estado 61 + IDENT deslocar, e ir ao estado 66 Estado 50 - 17 lista_id_var: lista_id_var VIRGULA IDENT • + 15 declara_var: $@4 lista_id_var DOIS_PONTOS • tipo $@5 PONTO_E_VIRGULA - $padrão reduzir usando a regra 17 (lista_id_var) + IDENT deslocar, e ir ao estado 67 + + tipo ir ao estado 68 Estado 51 - 16 tipo: IDENT • + 55 atribuicao: IDENT $@6 • ATRIBUICAO expressao_simples - $padrão reduzir usando a regra 16 (tipo) + ATRIBUICAO deslocar, e ir ao estado 69 Estado 52 - 15 declara_var: $@4 lista_id_var DOIS_PONTOS tipo • $@5 PONTO_E_VIRGULA + 56 fator: IDENT • - $padrão reduzir usando a regra 14 ($@5) - - $@5 ir ao estado 62 + $padrão reduzir usando a regra 56 (fator) Estado 53 - 46 atribuicao: IDENT $@6 ATRIBUICAO • expressao_simples + 57 fator: NUMERO • - IDENT deslocar, e ir ao estado 56 - NUMERO deslocar, e ir ao estado 57 - - expressao_simples ir ao estado 63 - termo ir ao estado 60 - fator ir ao estado 61 + $padrão reduzir usando a regra 57 (fator) Estado 54 - 23 comandos: comando PONTO_E_VIRGULA comandos • + 41 expressao: expressao • IGUAL expressao_simples + 42 | expressao • DIFERENTE expressao_simples + 43 | expressao • MENOR expressao_simples + 44 | expressao • MENOR_IGUAL expressao_simples + 45 | expressao • MAIOR expressao_simples + 46 | expressao • MAIOR_IGUAL expressao_simples + 66 if_then: IF expressao • $@9 THEN comando_sem_rotulo - $padrão reduzir usando a regra 23 (comandos) + IGUAL deslocar, e ir ao estado 70 + DIFERENTE deslocar, e ir ao estado 71 + MENOR_IGUAL deslocar, e ir ao estado 72 + MAIOR_IGUAL deslocar, e ir ao estado 73 + MENOR deslocar, e ir ao estado 74 + MAIOR deslocar, e ir ao estado 75 + + $padrão reduzir usando a regra 65 ($@9) + + $@9 ir ao estado 76 Estado 55 - 26 comando: numero DOIS_PONTOS comando_sem_rotulo • + 47 expressao: expressao_simples • + 48 expressao_simples: expressao_simples • MAIS termo + 49 | expressao_simples • MENOS termo - $padrão reduzir usando a regra 26 (comando) + MAIS deslocar, e ir ao estado 77 + MENOS deslocar, e ir ao estado 78 + + $padrão reduzir usando a regra 47 (expressao) Estado 56 - 47 fator: IDENT • + 50 expressao_simples: termo • + 51 termo: termo • ASTERISCO fator + 52 | termo • DIV fator - $padrão reduzir usando a regra 47 (fator) + DIV deslocar, e ir ao estado 79 + ASTERISCO deslocar, e ir ao estado 80 + + $padrão reduzir usando a regra 50 (expressao_simples) Estado 57 - 48 fator: NUMERO • + 53 termo: fator • - $padrão reduzir usando a regra 48 (fator) + $padrão reduzir usando a regra 53 (termo) Estado 58 - 32 expressao: expressao • IGUAL expressao_simples - 33 | expressao • DIFERENTE expressao_simples - 34 | expressao • MENOR expressao_simples - 35 | expressao • MENOR_IGUAL expressao_simples - 36 | expressao • MAIOR expressao_simples - 37 | expressao • MAIOR_IGUAL expressao_simples - 52 comando_repetitivo: $@7 WHILE expressao • DO $@8 comando_sem_rotulo + 34 leitura: READ ABRE_PARENTESES • lista_leituras FECHA_PARENTESES + + IDENT deslocar, e ir ao estado 81 - DO deslocar, e ir ao estado 64 - IGUAL deslocar, e ir ao estado 65 - DIFERENTE deslocar, e ir ao estado 66 - MENOR_IGUAL deslocar, e ir ao estado 67 - MAIOR_IGUAL deslocar, e ir ao estado 68 - MENOR deslocar, e ir ao estado 69 - MAIOR deslocar, e ir ao estado 70 + lista_leituras ir ao estado 82 + simb_leitura ir ao estado 83 Estado 59 - 38 expressao: expressao_simples • - 39 expressao_simples: expressao_simples • MAIS termo - 40 | expressao_simples • MENOS termo + 38 escrita: WRITE ABRE_PARENTESES • lista_escritas FECHA_PARENTESES - MAIS deslocar, e ir ao estado 71 - MENOS deslocar, e ir ao estado 72 + IDENT deslocar, e ir ao estado 52 + NUMERO deslocar, e ir ao estado 53 - $padrão reduzir usando a regra 38 (expressao) + lista_escritas ir ao estado 84 + expressao_simples ir ao estado 85 + termo ir ao estado 56 + fator ir ao estado 57 Estado 60 - 41 expressao_simples: termo • - 42 termo: termo • ASTERISCO fator - 43 | termo • DIV fator - - DIV deslocar, e ir ao estado 73 - ASTERISCO deslocar, e ir ao estado 74 + 22 comando_composto: T_BEGIN comandos T_END • - $padrão reduzir usando a regra 41 (expressao_simples) + $padrão reduzir usando a regra 22 (comando_composto) Estado 61 - 44 termo: fator • + 23 comandos: comando PONTO_E_VIRGULA • comandos + 24 | comando PONTO_E_VIRGULA • - $padrão reduzir usando a regra 44 (termo) + T_BEGIN deslocar, e ir ao estado 27 + IDENT deslocar, e ir ao estado 32 + IF deslocar, e ir ao estado 33 + NUMERO deslocar, e ir ao estado 34 + READ deslocar, e ir ao estado 35 + WRITE deslocar, e ir ao estado 36 + + T_END reduzir usando a regra 24 (comandos) + T_END [reduzir usando a regra 25 (comandos)] + WHILE reduzir usando a regra 59 ($@7) + $padrão reduzir usando a regra 24 (comandos) + + comando_composto ir ao estado 37 + comandos ir ao estado 86 + comando ir ao estado 39 + comando_sem_rotulo ir ao estado 40 + leitura ir ao estado 41 + escrita ir ao estado 42 + atribuicao ir ao estado 43 + numero ir ao estado 44 + comando_repetitivo ir ao estado 45 + $@7 ir ao estado 46 + comando_condicional ir ao estado 47 + if_then ir ao estado 48 Estado 62 - 15 declara_var: $@4 lista_id_var DOIS_PONTOS tipo $@5 • PONTO_E_VIRGULA + 26 comando: numero DOIS_PONTOS • comando_sem_rotulo - PONTO_E_VIRGULA deslocar, e ir ao estado 75 + T_BEGIN deslocar, e ir ao estado 27 + IDENT deslocar, e ir ao estado 32 + IF deslocar, e ir ao estado 33 + READ deslocar, e ir ao estado 35 + WRITE deslocar, e ir ao estado 36 + + $padrão reduzir usando a regra 59 ($@7) + + comando_composto ir ao estado 37 + comando_sem_rotulo ir ao estado 87 + leitura ir ao estado 41 + escrita ir ao estado 42 + atribuicao ir ao estado 43 + comando_repetitivo ir ao estado 45 + $@7 ir ao estado 46 + comando_condicional ir ao estado 47 + if_then ir ao estado 48 Estado 63 - 39 expressao_simples: expressao_simples • MAIS termo - 40 | expressao_simples • MENOS termo - 46 atribuicao: IDENT $@6 ATRIBUICAO expressao_simples • + 61 comando_repetitivo: $@7 WHILE • expressao DO $@8 comando_sem_rotulo - MAIS deslocar, e ir ao estado 71 - MENOS deslocar, e ir ao estado 72 + IDENT deslocar, e ir ao estado 52 + NUMERO deslocar, e ir ao estado 53 - $padrão reduzir usando a regra 46 (atribuicao) + expressao ir ao estado 88 + expressao_simples ir ao estado 55 + termo ir ao estado 56 + fator ir ao estado 57 Estado 64 - 52 comando_repetitivo: $@7 WHILE expressao DO • $@8 comando_sem_rotulo + 63 cond_else: ELSE • comando_sem_rotulo - $padrão reduzir usando a regra 51 ($@8) + T_BEGIN deslocar, e ir ao estado 27 + IDENT deslocar, e ir ao estado 32 + IF deslocar, e ir ao estado 33 + READ deslocar, e ir ao estado 35 + WRITE deslocar, e ir ao estado 36 - $@8 ir ao estado 76 + $padrão reduzir usando a regra 59 ($@7) + comando_composto ir ao estado 37 + comando_sem_rotulo ir ao estado 89 + leitura ir ao estado 41 + escrita ir ao estado 42 + atribuicao ir ao estado 43 + comando_repetitivo ir ao estado 45 + $@7 ir ao estado 46 + comando_condicional ir ao estado 47 + if_then ir ao estado 48 -Estado 65 - 32 expressao: expressao IGUAL • expressao_simples +Estado 65 - IDENT deslocar, e ir ao estado 56 - NUMERO deslocar, e ir ao estado 57 + 62 comando_condicional: if_then cond_else • - expressao_simples ir ao estado 77 - termo ir ao estado 60 - fator ir ao estado 61 + $padrão reduzir usando a regra 62 (comando_condicional) Estado 66 - 33 expressao: expressao DIFERENTE • expressao_simples - - IDENT deslocar, e ir ao estado 56 - NUMERO deslocar, e ir ao estado 57 + 17 lista_id_var: lista_id_var VIRGULA IDENT • - expressao_simples ir ao estado 78 - termo ir ao estado 60 - fator ir ao estado 61 + $padrão reduzir usando a regra 17 (lista_id_var) Estado 67 - 35 expressao: expressao MENOR_IGUAL • expressao_simples - - IDENT deslocar, e ir ao estado 56 - NUMERO deslocar, e ir ao estado 57 + 16 tipo: IDENT • - expressao_simples ir ao estado 79 - termo ir ao estado 60 - fator ir ao estado 61 + $padrão reduzir usando a regra 16 (tipo) Estado 68 - 37 expressao: expressao MAIOR_IGUAL • expressao_simples + 15 declara_var: $@4 lista_id_var DOIS_PONTOS tipo • $@5 PONTO_E_VIRGULA - IDENT deslocar, e ir ao estado 56 - NUMERO deslocar, e ir ao estado 57 + $padrão reduzir usando a regra 14 ($@5) - expressao_simples ir ao estado 80 - termo ir ao estado 60 - fator ir ao estado 61 + $@5 ir ao estado 90 Estado 69 - 34 expressao: expressao MENOR • expressao_simples + 55 atribuicao: IDENT $@6 ATRIBUICAO • expressao_simples - IDENT deslocar, e ir ao estado 56 - NUMERO deslocar, e ir ao estado 57 + IDENT deslocar, e ir ao estado 52 + NUMERO deslocar, e ir ao estado 53 - expressao_simples ir ao estado 81 - termo ir ao estado 60 - fator ir ao estado 61 + expressao_simples ir ao estado 91 + termo ir ao estado 56 + fator ir ao estado 57 Estado 70 - 36 expressao: expressao MAIOR • expressao_simples + 41 expressao: expressao IGUAL • expressao_simples - IDENT deslocar, e ir ao estado 56 - NUMERO deslocar, e ir ao estado 57 + IDENT deslocar, e ir ao estado 52 + NUMERO deslocar, e ir ao estado 53 - expressao_simples ir ao estado 82 - termo ir ao estado 60 - fator ir ao estado 61 + expressao_simples ir ao estado 92 + termo ir ao estado 56 + fator ir ao estado 57 Estado 71 - 39 expressao_simples: expressao_simples MAIS • termo + 42 expressao: expressao DIFERENTE • expressao_simples - IDENT deslocar, e ir ao estado 56 - NUMERO deslocar, e ir ao estado 57 + IDENT deslocar, e ir ao estado 52 + NUMERO deslocar, e ir ao estado 53 - termo ir ao estado 83 - fator ir ao estado 61 + expressao_simples ir ao estado 93 + termo ir ao estado 56 + fator ir ao estado 57 Estado 72 - 40 expressao_simples: expressao_simples MENOS • termo + 44 expressao: expressao MENOR_IGUAL • expressao_simples - IDENT deslocar, e ir ao estado 56 - NUMERO deslocar, e ir ao estado 57 + IDENT deslocar, e ir ao estado 52 + NUMERO deslocar, e ir ao estado 53 - termo ir ao estado 84 - fator ir ao estado 61 + expressao_simples ir ao estado 94 + termo ir ao estado 56 + fator ir ao estado 57 Estado 73 - 43 termo: termo DIV • fator + 46 expressao: expressao MAIOR_IGUAL • expressao_simples - IDENT deslocar, e ir ao estado 56 - NUMERO deslocar, e ir ao estado 57 + IDENT deslocar, e ir ao estado 52 + NUMERO deslocar, e ir ao estado 53 - fator ir ao estado 85 + expressao_simples ir ao estado 95 + termo ir ao estado 56 + fator ir ao estado 57 Estado 74 - 42 termo: termo ASTERISCO • fator + 43 expressao: expressao MENOR • expressao_simples - IDENT deslocar, e ir ao estado 56 - NUMERO deslocar, e ir ao estado 57 + IDENT deslocar, e ir ao estado 52 + NUMERO deslocar, e ir ao estado 53 - fator ir ao estado 86 + expressao_simples ir ao estado 96 + termo ir ao estado 56 + fator ir ao estado 57 Estado 75 - 15 declara_var: $@4 lista_id_var DOIS_PONTOS tipo $@5 PONTO_E_VIRGULA • - - $padrão reduzir usando a regra 15 (declara_var) + 45 expressao: expressao MAIOR • expressao_simples + IDENT deslocar, e ir ao estado 52 + NUMERO deslocar, e ir ao estado 53 -Estado 76 + expressao_simples ir ao estado 97 + termo ir ao estado 56 + fator ir ao estado 57 - 52 comando_repetitivo: $@7 WHILE expressao DO $@8 • comando_sem_rotulo - T_BEGIN deslocar, e ir ao estado 27 - IDENT deslocar, e ir ao estado 32 +Estado 76 - PONTO_E_VIRGULA reduzir usando a regra 53 (comando_condicional) - $padrão reduzir usando a regra 50 ($@7) + 66 if_then: IF expressao $@9 • THEN comando_sem_rotulo - comando_composto ir ao estado 34 - comando_sem_rotulo ir ao estado 87 - atribuicao ir ao estado 38 - comando_repetitivo ir ao estado 40 - $@7 ir ao estado 41 - comando_condicional ir ao estado 42 + THEN deslocar, e ir ao estado 98 Estado 77 - 32 expressao: expressao IGUAL expressao_simples • - 39 expressao_simples: expressao_simples • MAIS termo - 40 | expressao_simples • MENOS termo + 48 expressao_simples: expressao_simples MAIS • termo - MAIS deslocar, e ir ao estado 71 - MENOS deslocar, e ir ao estado 72 + IDENT deslocar, e ir ao estado 52 + NUMERO deslocar, e ir ao estado 53 - $padrão reduzir usando a regra 32 (expressao) + termo ir ao estado 99 + fator ir ao estado 57 Estado 78 - 33 expressao: expressao DIFERENTE expressao_simples • - 39 expressao_simples: expressao_simples • MAIS termo - 40 | expressao_simples • MENOS termo + 49 expressao_simples: expressao_simples MENOS • termo - MAIS deslocar, e ir ao estado 71 - MENOS deslocar, e ir ao estado 72 + IDENT deslocar, e ir ao estado 52 + NUMERO deslocar, e ir ao estado 53 - $padrão reduzir usando a regra 33 (expressao) + termo ir ao estado 100 + fator ir ao estado 57 Estado 79 - 35 expressao: expressao MENOR_IGUAL expressao_simples • - 39 expressao_simples: expressao_simples • MAIS termo - 40 | expressao_simples • MENOS termo + 52 termo: termo DIV • fator - MAIS deslocar, e ir ao estado 71 - MENOS deslocar, e ir ao estado 72 + IDENT deslocar, e ir ao estado 52 + NUMERO deslocar, e ir ao estado 53 - $padrão reduzir usando a regra 35 (expressao) + fator ir ao estado 101 Estado 80 - 37 expressao: expressao MAIOR_IGUAL expressao_simples • - 39 expressao_simples: expressao_simples • MAIS termo - 40 | expressao_simples • MENOS termo + 51 termo: termo ASTERISCO • fator - MAIS deslocar, e ir ao estado 71 - MENOS deslocar, e ir ao estado 72 + IDENT deslocar, e ir ao estado 52 + NUMERO deslocar, e ir ao estado 53 - $padrão reduzir usando a regra 37 (expressao) + fator ir ao estado 102 Estado 81 - 34 expressao: expressao MENOR expressao_simples • - 39 expressao_simples: expressao_simples • MAIS termo - 40 | expressao_simples • MENOS termo + 37 simb_leitura: IDENT • - MAIS deslocar, e ir ao estado 71 - MENOS deslocar, e ir ao estado 72 - - $padrão reduzir usando a regra 34 (expressao) + $padrão reduzir usando a regra 37 (simb_leitura) Estado 82 - 36 expressao: expressao MAIOR expressao_simples • - 39 expressao_simples: expressao_simples • MAIS termo - 40 | expressao_simples • MENOS termo - - MAIS deslocar, e ir ao estado 71 - MENOS deslocar, e ir ao estado 72 + 34 leitura: READ ABRE_PARENTESES lista_leituras • FECHA_PARENTESES + 35 lista_leituras: lista_leituras • VIRGULA simb_leitura - $padrão reduzir usando a regra 36 (expressao) + FECHA_PARENTESES deslocar, e ir ao estado 103 + VIRGULA deslocar, e ir ao estado 104 Estado 83 - 39 expressao_simples: expressao_simples MAIS termo • - 42 termo: termo • ASTERISCO fator - 43 | termo • DIV fator + 36 lista_leituras: simb_leitura • - DIV deslocar, e ir ao estado 73 - ASTERISCO deslocar, e ir ao estado 74 - - $padrão reduzir usando a regra 39 (expressao_simples) + $padrão reduzir usando a regra 36 (lista_leituras) Estado 84 - 40 expressao_simples: expressao_simples MENOS termo • - 42 termo: termo • ASTERISCO fator - 43 | termo • DIV fator - - DIV deslocar, e ir ao estado 73 - ASTERISCO deslocar, e ir ao estado 74 + 38 escrita: WRITE ABRE_PARENTESES lista_escritas • FECHA_PARENTESES + 39 lista_escritas: lista_escritas • VIRGULA expressao_simples - $padrão reduzir usando a regra 40 (expressao_simples) + FECHA_PARENTESES deslocar, e ir ao estado 105 + VIRGULA deslocar, e ir ao estado 106 Estado 85 - 43 termo: termo DIV fator • + 40 lista_escritas: expressao_simples • + 48 expressao_simples: expressao_simples • MAIS termo + 49 | expressao_simples • MENOS termo - $padrão reduzir usando a regra 43 (termo) + MAIS deslocar, e ir ao estado 77 + MENOS deslocar, e ir ao estado 78 + + $padrão reduzir usando a regra 40 (lista_escritas) Estado 86 - 42 termo: termo ASTERISCO fator • + 23 comandos: comando PONTO_E_VIRGULA comandos • - $padrão reduzir usando a regra 42 (termo) + $padrão reduzir usando a regra 23 (comandos) Estado 87 - 52 comando_repetitivo: $@7 WHILE expressao DO $@8 comando_sem_rotulo • + 26 comando: numero DOIS_PONTOS comando_sem_rotulo • + + $padrão reduzir usando a regra 26 (comando) + + +Estado 88 + + 41 expressao: expressao • IGUAL expressao_simples + 42 | expressao • DIFERENTE expressao_simples + 43 | expressao • MENOR expressao_simples + 44 | expressao • MENOR_IGUAL expressao_simples + 45 | expressao • MAIOR expressao_simples + 46 | expressao • MAIOR_IGUAL expressao_simples + 61 comando_repetitivo: $@7 WHILE expressao • DO $@8 comando_sem_rotulo + + DO deslocar, e ir ao estado 107 + IGUAL deslocar, e ir ao estado 70 + DIFERENTE deslocar, e ir ao estado 71 + MENOR_IGUAL deslocar, e ir ao estado 72 + MAIOR_IGUAL deslocar, e ir ao estado 73 + MENOR deslocar, e ir ao estado 74 + MAIOR deslocar, e ir ao estado 75 + + +Estado 89 + + 63 cond_else: ELSE comando_sem_rotulo • + + $padrão reduzir usando a regra 63 (cond_else) + + +Estado 90 + + 15 declara_var: $@4 lista_id_var DOIS_PONTOS tipo $@5 • PONTO_E_VIRGULA + + PONTO_E_VIRGULA deslocar, e ir ao estado 108 + + +Estado 91 + + 48 expressao_simples: expressao_simples • MAIS termo + 49 | expressao_simples • MENOS termo + 55 atribuicao: IDENT $@6 ATRIBUICAO expressao_simples • + + MAIS deslocar, e ir ao estado 77 + MENOS deslocar, e ir ao estado 78 + + $padrão reduzir usando a regra 55 (atribuicao) + + +Estado 92 + + 41 expressao: expressao IGUAL expressao_simples • + 48 expressao_simples: expressao_simples • MAIS termo + 49 | expressao_simples • MENOS termo + + MAIS deslocar, e ir ao estado 77 + MENOS deslocar, e ir ao estado 78 + + $padrão reduzir usando a regra 41 (expressao) + + +Estado 93 + + 42 expressao: expressao DIFERENTE expressao_simples • + 48 expressao_simples: expressao_simples • MAIS termo + 49 | expressao_simples • MENOS termo + + MAIS deslocar, e ir ao estado 77 + MENOS deslocar, e ir ao estado 78 + + $padrão reduzir usando a regra 42 (expressao) + + +Estado 94 + + 44 expressao: expressao MENOR_IGUAL expressao_simples • + 48 expressao_simples: expressao_simples • MAIS termo + 49 | expressao_simples • MENOS termo + + MAIS deslocar, e ir ao estado 77 + MENOS deslocar, e ir ao estado 78 + + $padrão reduzir usando a regra 44 (expressao) + + +Estado 95 + + 46 expressao: expressao MAIOR_IGUAL expressao_simples • + 48 expressao_simples: expressao_simples • MAIS termo + 49 | expressao_simples • MENOS termo + + MAIS deslocar, e ir ao estado 77 + MENOS deslocar, e ir ao estado 78 + + $padrão reduzir usando a regra 46 (expressao) + + +Estado 96 + + 43 expressao: expressao MENOR expressao_simples • + 48 expressao_simples: expressao_simples • MAIS termo + 49 | expressao_simples • MENOS termo + + MAIS deslocar, e ir ao estado 77 + MENOS deslocar, e ir ao estado 78 + + $padrão reduzir usando a regra 43 (expressao) + + +Estado 97 + + 45 expressao: expressao MAIOR expressao_simples • + 48 expressao_simples: expressao_simples • MAIS termo + 49 | expressao_simples • MENOS termo + + MAIS deslocar, e ir ao estado 77 + MENOS deslocar, e ir ao estado 78 + + $padrão reduzir usando a regra 45 (expressao) + + +Estado 98 + + 66 if_then: IF expressao $@9 THEN • comando_sem_rotulo + + T_BEGIN deslocar, e ir ao estado 27 + IDENT deslocar, e ir ao estado 32 + IF deslocar, e ir ao estado 33 + READ deslocar, e ir ao estado 35 + WRITE deslocar, e ir ao estado 36 + + $padrão reduzir usando a regra 59 ($@7) + + comando_composto ir ao estado 37 + comando_sem_rotulo ir ao estado 109 + leitura ir ao estado 41 + escrita ir ao estado 42 + atribuicao ir ao estado 43 + comando_repetitivo ir ao estado 45 + $@7 ir ao estado 46 + comando_condicional ir ao estado 47 + if_then ir ao estado 48 + + +Estado 99 + + 48 expressao_simples: expressao_simples MAIS termo • + 51 termo: termo • ASTERISCO fator + 52 | termo • DIV fator + + DIV deslocar, e ir ao estado 79 + ASTERISCO deslocar, e ir ao estado 80 + + $padrão reduzir usando a regra 48 (expressao_simples) + + +Estado 100 + + 49 expressao_simples: expressao_simples MENOS termo • + 51 termo: termo • ASTERISCO fator + 52 | termo • DIV fator + + DIV deslocar, e ir ao estado 79 + ASTERISCO deslocar, e ir ao estado 80 + + $padrão reduzir usando a regra 49 (expressao_simples) + + +Estado 101 + + 52 termo: termo DIV fator • + + $padrão reduzir usando a regra 52 (termo) + + +Estado 102 + + 51 termo: termo ASTERISCO fator • + + $padrão reduzir usando a regra 51 (termo) + + +Estado 103 + + 34 leitura: READ ABRE_PARENTESES lista_leituras FECHA_PARENTESES • + + $padrão reduzir usando a regra 34 (leitura) + + +Estado 104 + + 35 lista_leituras: lista_leituras VIRGULA • simb_leitura + + IDENT deslocar, e ir ao estado 81 + + simb_leitura ir ao estado 110 + + +Estado 105 + + 38 escrita: WRITE ABRE_PARENTESES lista_escritas FECHA_PARENTESES • + + $padrão reduzir usando a regra 38 (escrita) + + +Estado 106 + + 39 lista_escritas: lista_escritas VIRGULA • expressao_simples + + IDENT deslocar, e ir ao estado 52 + NUMERO deslocar, e ir ao estado 53 + + expressao_simples ir ao estado 111 + termo ir ao estado 56 + fator ir ao estado 57 + + +Estado 107 + + 61 comando_repetitivo: $@7 WHILE expressao DO • $@8 comando_sem_rotulo + + $padrão reduzir usando a regra 60 ($@8) + + $@8 ir ao estado 112 + + +Estado 108 + + 15 declara_var: $@4 lista_id_var DOIS_PONTOS tipo $@5 PONTO_E_VIRGULA • + + $padrão reduzir usando a regra 15 (declara_var) + + +Estado 109 + + 66 if_then: IF expressao $@9 THEN comando_sem_rotulo • + + $padrão reduzir usando a regra 66 (if_then) + + +Estado 110 + + 35 lista_leituras: lista_leituras VIRGULA simb_leitura • + + $padrão reduzir usando a regra 35 (lista_leituras) + + +Estado 111 + + 39 lista_escritas: lista_escritas VIRGULA expressao_simples • + 48 expressao_simples: expressao_simples • MAIS termo + 49 | expressao_simples • MENOS termo + + MAIS deslocar, e ir ao estado 77 + MENOS deslocar, e ir ao estado 78 + + $padrão reduzir usando a regra 39 (lista_escritas) + + +Estado 112 + + 61 comando_repetitivo: $@7 WHILE expressao DO $@8 • comando_sem_rotulo + + T_BEGIN deslocar, e ir ao estado 27 + IDENT deslocar, e ir ao estado 32 + IF deslocar, e ir ao estado 33 + READ deslocar, e ir ao estado 35 + WRITE deslocar, e ir ao estado 36 + + $padrão reduzir usando a regra 59 ($@7) + + comando_composto ir ao estado 37 + comando_sem_rotulo ir ao estado 113 + leitura ir ao estado 41 + escrita ir ao estado 42 + atribuicao ir ao estado 43 + comando_repetitivo ir ao estado 45 + $@7 ir ao estado 46 + comando_condicional ir ao estado 47 + if_then ir ao estado 48 + + +Estado 113 + + 61 comando_repetitivo: $@7 WHILE expressao DO $@8 comando_sem_rotulo • - $padrão reduzir usando a regra 52 (comando_repetitivo) + $padrão reduzir usando a regra 61 (comando_repetitivo) diff --git a/compilador.tab.c b/compilador.tab.c index 7b59a30..2a3cec5 100644 --- a/compilador.tab.c +++ b/compilador.tab.c @@ -156,38 +156,49 @@ enum yysymbol_kind_t YYSYMBOL_MENOS = 37, /* MENOS */ YYSYMBOL_ASTERISCO = 38, /* ASTERISCO */ YYSYMBOL_NUMERO = 39, /* NUMERO */ - YYSYMBOL_YYACCEPT = 40, /* $accept */ - YYSYMBOL_programa = 41, /* programa */ - YYSYMBOL_42_1 = 42, /* $@1 */ - YYSYMBOL_bloco = 43, /* bloco */ - YYSYMBOL_44_2 = 44, /* $@2 */ - YYSYMBOL_parte_declara_rotulos = 45, /* parte_declara_rotulos */ - YYSYMBOL_parte_declara_vars = 46, /* parte_declara_vars */ - YYSYMBOL_var = 47, /* var */ - YYSYMBOL_48_3 = 48, /* $@3 */ - YYSYMBOL_declara_vars = 49, /* declara_vars */ - YYSYMBOL_declara_var = 50, /* declara_var */ - YYSYMBOL_51_4 = 51, /* $@4 */ - YYSYMBOL_52_5 = 52, /* $@5 */ - YYSYMBOL_tipo = 53, /* tipo */ - YYSYMBOL_lista_id_var = 54, /* lista_id_var */ - YYSYMBOL_lista_idents = 55, /* lista_idents */ - YYSYMBOL_parte_declara_subrotinas = 56, /* parte_declara_subrotinas */ - YYSYMBOL_comando_composto = 57, /* comando_composto */ - YYSYMBOL_comandos = 58, /* comandos */ - YYSYMBOL_comando = 59, /* comando */ - YYSYMBOL_comando_sem_rotulo = 60, /* comando_sem_rotulo */ - YYSYMBOL_expressao = 61, /* expressao */ - YYSYMBOL_expressao_simples = 62, /* expressao_simples */ - YYSYMBOL_termo = 63, /* termo */ - YYSYMBOL_atribuicao = 64, /* atribuicao */ - YYSYMBOL_65_6 = 65, /* $@6 */ - YYSYMBOL_fator = 66, /* fator */ - YYSYMBOL_numero = 67, /* numero */ - YYSYMBOL_comando_repetitivo = 68, /* comando_repetitivo */ - YYSYMBOL_69_7 = 69, /* $@7 */ - YYSYMBOL_70_8 = 70, /* $@8 */ - YYSYMBOL_comando_condicional = 71 /* comando_condicional */ + YYSYMBOL_READ = 40, /* READ */ + YYSYMBOL_WRITE = 41, /* WRITE */ + YYSYMBOL_LOWER_THAN_ELSE = 42, /* LOWER_THAN_ELSE */ + YYSYMBOL_YYACCEPT = 43, /* $accept */ + YYSYMBOL_programa = 44, /* programa */ + YYSYMBOL_45_1 = 45, /* $@1 */ + YYSYMBOL_bloco = 46, /* bloco */ + YYSYMBOL_47_2 = 47, /* $@2 */ + YYSYMBOL_parte_declara_rotulos = 48, /* parte_declara_rotulos */ + YYSYMBOL_parte_declara_vars = 49, /* parte_declara_vars */ + YYSYMBOL_var = 50, /* var */ + YYSYMBOL_51_3 = 51, /* $@3 */ + YYSYMBOL_declara_vars = 52, /* declara_vars */ + YYSYMBOL_declara_var = 53, /* declara_var */ + YYSYMBOL_54_4 = 54, /* $@4 */ + YYSYMBOL_55_5 = 55, /* $@5 */ + YYSYMBOL_tipo = 56, /* tipo */ + YYSYMBOL_lista_id_var = 57, /* lista_id_var */ + YYSYMBOL_lista_idents = 58, /* lista_idents */ + YYSYMBOL_parte_declara_subrotinas = 59, /* parte_declara_subrotinas */ + 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_6 = 73, /* $@6 */ + YYSYMBOL_fator = 74, /* fator */ + YYSYMBOL_numero = 75, /* numero */ + YYSYMBOL_comando_repetitivo = 76, /* comando_repetitivo */ + YYSYMBOL_77_7 = 77, /* $@7 */ + YYSYMBOL_78_8 = 78, /* $@8 */ + YYSYMBOL_comando_condicional = 79, /* comando_condicional */ + YYSYMBOL_cond_else = 80, /* cond_else */ + YYSYMBOL_if_then = 81, /* if_then */ + YYSYMBOL_82_9 = 82 /* $@9 */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; @@ -515,19 +526,19 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 74 +#define YYLAST 94 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 40 +#define YYNTOKENS 43 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 32 +#define YYNNTS 40 /* YYNRULES -- Number of rules. */ -#define YYNRULES 54 +#define YYNRULES 67 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 88 +#define YYNSTATES 114 /* YYMAXUTOK -- Last valid token kind. */ -#define YYMAXUTOK 294 +#define YYMAXUTOK 297 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM @@ -570,19 +581,20 @@ static const yytype_int8 yytranslate[] = 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39 + 35, 36, 37, 38, 39, 40, 41, 42 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ -static const yytype_uint8 yyrline[] = +static const yytype_int16 yyrline[] = { - 0, 38, 38, 38, 52, 49, 59, 60, 63, 67, - 67, 68, 71, 72, 75, 78, 75, 86, 99, 105, - 113, 114, 117, 121, 124, 125, 126, 129, 130, 133, - 136, 137, 138, 141, 144, 147, 150, 153, 156, 159, - 162, 165, 168, 171, 174, 177, 180, 180, 197, 208, - 215, 217, 224, 217, 250 + 0, 41, 41, 41, 55, 52, 68, 69, 72, 76, + 76, 77, 80, 81, 84, 87, 84, 95, 108, 114, + 122, 123, 126, 130, 133, 134, 135, 138, 139, 142, + 145, 146, 147, 148, 149, 152, 155, 156, 159, 168, + 171, 174, 179, 182, 185, 188, 191, 194, 197, 200, + 203, 206, 209, 212, 215, 218, 218, 235, 246, 253, + 255, 262, 255, 288, 295, 297, 300, 300 }; #endif @@ -604,13 +616,15 @@ static const char *const yytname[] = "LABEL", "TYPE", "ARRAY", "PROCEDURE", "FUNCTION", "GOTO", "IF", "THEN", "ELSE", "WHILE", "DO", "OR", "DIV", "AND", "NOT", "IGUAL", "DIFERENTE", "MENOR_IGUAL", "MAIOR_IGUAL", "MENOR", "MAIOR", "MAIS", "MENOS", - "ASTERISCO", "NUMERO", "$accept", "programa", "$@1", "bloco", "$@2", - "parte_declara_rotulos", "parte_declara_vars", "var", "$@3", - "declara_vars", "declara_var", "$@4", "$@5", "tipo", "lista_id_var", - "lista_idents", "parte_declara_subrotinas", "comando_composto", - "comandos", "comando", "comando_sem_rotulo", "expressao", - "expressao_simples", "termo", "atribuicao", "$@6", "fator", "numero", - "comando_repetitivo", "$@7", "$@8", "comando_condicional", YY_NULLPTR + "ASTERISCO", "NUMERO", "READ", "WRITE", "LOWER_THAN_ELSE", "$accept", + "programa", "$@1", "bloco", "$@2", "parte_declara_rotulos", + "parte_declara_vars", "var", "$@3", "declara_vars", "declara_var", "$@4", + "$@5", "tipo", "lista_id_var", "lista_idents", + "parte_declara_subrotinas", "comando_composto", "comandos", "comando", + "comando_sem_rotulo", "leitura", "lista_leituras", "simb_leitura", + "escrita", "lista_escritas", "expressao", "expressao_simples", "termo", + "atribuicao", "$@6", "fator", "numero", "comando_repetitivo", "$@7", + "$@8", "comando_condicional", "cond_else", "if_then", "$@9", YY_NULLPTR }; static const char * @@ -620,12 +634,12 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#define YYPACT_NINF (-48) +#define YYPACT_NINF (-63) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) -#define YYTABLE_NINF (-55) +#define YYTABLE_NINF (-61) #define yytable_value_is_error(Yyn) \ 0 @@ -634,15 +648,18 @@ yysymbol_name (yysymbol_kind_t yysymbol) STATE-NUM. */ static const yytype_int8 yypact[] = { - -48, 9, 13, -48, 12, 14, 18, -48, 8, 36, - 31, 30, -48, 40, 38, 39, -48, -48, -48, -48, - 41, -48, -48, 42, 35, -48, 37, -7, -48, -48, - -48, 4, -48, -48, -48, 43, 44, -48, -48, 47, - -48, 32, -48, 45, 46, 48, -48, -7, -2, -11, - -48, -48, -48, -11, -48, -48, -48, -48, 5, -10, - -23, -48, 50, -10, -48, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -48, -2, -10, -10, -10, - -10, -10, -10, -23, -23, -48, -48, -48 + -63, 5, 7, -63, 15, 35, 20, -63, 3, 42, + 38, 40, -63, 50, 56, 57, -63, -63, -63, -63, + 54, -63, -63, 58, 59, -63, 60, 13, -63, -63, + -63, -2, -63, -10, -63, 65, 66, -63, 63, 64, + -63, -63, -63, -63, 67, -63, 52, -63, 55, 68, + 69, 70, -63, -63, 29, -17, -20, -63, 72, -10, + -63, 13, 17, -10, 17, -63, -63, -63, -63, -10, + -10, -10, -10, -10, -10, -10, 61, -10, -10, -10, + -10, -63, 16, -63, 19, -17, -63, -63, 10, -63, + 73, -17, -17, -17, -17, -17, -17, -17, 17, -20, + -20, -63, -63, -63, 72, -63, -10, -63, -63, -63, + -63, -17, 17, -63 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -653,30 +670,33 @@ static const yytype_int8 yydefact[] = 2, 0, 0, 1, 0, 0, 0, 21, 0, 0, 0, 7, 20, 0, 0, 9, 6, 3, 22, 8, 0, 4, 14, 0, 10, 13, 0, 26, 5, 12, - 19, 0, 46, 50, 30, 0, 0, 28, 29, 0, - 32, 0, 31, 0, 0, 0, 23, 25, 51, 0, - 18, 17, 15, 0, 24, 27, 48, 49, 0, 39, - 42, 45, 0, 47, 52, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 16, 51, 33, 34, 36, - 38, 35, 37, 40, 41, 44, 43, 53 + 19, 0, 55, 0, 59, 0, 0, 30, 0, 0, + 28, 33, 34, 29, 0, 32, 0, 31, 65, 0, + 0, 0, 57, 58, 66, 48, 51, 54, 0, 0, + 23, 25, 60, 0, 60, 63, 18, 17, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 38, 0, 37, 0, 41, 24, 27, 0, 64, + 0, 56, 42, 43, 45, 47, 44, 46, 60, 49, + 50, 53, 52, 35, 0, 39, 0, 61, 16, 67, + 36, 40, 60, 62 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - 49, -48, -48, -48, -48, -48, -48, 51, 16, -48, - -47, -48, -46, -38, -48, -48, -32, -48, -48, -48, - -48, -48 + -63, -63, -63, -63, -63, -63, -63, -63, -63, -63, + 53, -63, -63, -63, -63, -63, -63, 71, 18, -63, + -62, -63, -63, -18, -63, -63, 24, -58, -46, -63, + -63, -33, -63, -63, -63, -63, -63, -63, -63, -63 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { 0, 1, 2, 14, 23, 15, 18, 19, 20, 24, - 25, 26, 62, 52, 31, 8, 21, 34, 35, 36, - 37, 58, 59, 60, 38, 45, 61, 39, 40, 41, - 76, 42 + 25, 26, 90, 68, 31, 8, 21, 37, 38, 39, + 40, 41, 82, 83, 42, 84, 54, 55, 56, 43, + 51, 57, 44, 45, 46, 112, 47, 65, 48, 76 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -684,52 +704,60 @@ static const yytype_int8 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int8 yytable[] = { - -54, 55, 56, 27, 73, -54, 32, 63, 27, 3, - 43, 32, 44, 9, 10, 74, 4, -51, 6, 77, - 78, 79, 80, 81, 82, 5, 71, 72, 57, 87, - 64, 7, 33, 83, 84, 65, 66, 67, 68, 69, - 70, 85, 86, 11, 12, 13, 16, 17, -14, -11, - 30, 47, 27, 22, 46, 48, 49, 75, 50, 51, - 0, 0, 53, 54, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 29, 28 + 87, 85, 89, 52, 49, 3, 50, 79, 9, 10, + 4, 91, 92, 93, 94, 95, 96, 97, 80, 77, + 78, 103, 104, 27, 105, 106, 32, 27, 5, 53, + 32, 99, 100, 7, 33, 107, 109, -60, 33, 6, + 70, 71, 72, 73, 74, 75, 101, 102, 111, 11, + 113, 12, 34, 35, 36, 13, 16, 35, 36, 70, + 71, 72, 73, 74, 75, 17, 22, -11, 27, 58, + 59, 61, -14, 30, 60, 62, 63, 29, 64, 86, + 108, 66, 67, 98, 69, 81, 110, 88, 0, 0, + 0, 0, 0, 0, 28 }; static const yytype_int8 yycheck[] = { - 7, 48, 13, 10, 27, 7, 13, 53, 10, 0, - 6, 13, 8, 5, 6, 38, 3, 24, 4, 65, - 66, 67, 68, 69, 70, 13, 36, 37, 39, 76, - 25, 13, 39, 71, 72, 30, 31, 32, 33, 34, - 35, 73, 74, 7, 13, 15, 6, 9, 13, 10, - 13, 7, 10, 12, 11, 8, 24, 7, 13, 13, - -1, -1, 14, 47, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 24, 23 + 62, 59, 64, 13, 6, 0, 8, 27, 5, 6, + 3, 69, 70, 71, 72, 73, 74, 75, 38, 36, + 37, 5, 6, 10, 5, 6, 13, 10, 13, 39, + 13, 77, 78, 13, 21, 25, 98, 24, 21, 4, + 30, 31, 32, 33, 34, 35, 79, 80, 106, 7, + 112, 13, 39, 40, 41, 15, 6, 40, 41, 30, + 31, 32, 33, 34, 35, 9, 12, 10, 10, 4, + 4, 7, 13, 13, 11, 8, 24, 24, 23, 61, + 7, 13, 13, 22, 14, 13, 104, 63, -1, -1, + -1, -1, -1, -1, 23 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of state STATE-NUM. */ static const yytype_int8 yystos[] = { - 0, 41, 42, 0, 3, 13, 4, 13, 55, 5, - 6, 7, 13, 15, 43, 45, 6, 9, 46, 47, - 48, 56, 12, 44, 49, 50, 51, 10, 57, 50, - 13, 54, 13, 39, 57, 58, 59, 60, 64, 67, - 68, 69, 71, 6, 8, 65, 11, 7, 8, 24, - 13, 13, 53, 14, 58, 60, 13, 39, 61, 62, - 63, 66, 52, 62, 25, 30, 31, 32, 33, 34, - 35, 36, 37, 27, 38, 7, 70, 62, 62, 62, - 62, 62, 62, 63, 63, 66, 66, 60 + 0, 44, 45, 0, 3, 13, 4, 13, 58, 5, + 6, 7, 13, 15, 46, 48, 6, 9, 49, 50, + 51, 59, 12, 47, 52, 53, 54, 10, 60, 53, + 13, 57, 13, 21, 39, 40, 41, 60, 61, 62, + 63, 64, 67, 72, 75, 76, 77, 79, 81, 6, + 8, 73, 13, 39, 69, 70, 71, 74, 4, 4, + 11, 7, 8, 24, 23, 80, 13, 13, 56, 14, + 30, 31, 32, 33, 34, 35, 82, 36, 37, 27, + 38, 13, 65, 66, 68, 70, 61, 63, 69, 63, + 55, 70, 70, 70, 70, 70, 70, 70, 22, 71, + 71, 74, 74, 5, 6, 5, 6, 25, 7, 63, + 66, 70, 78, 63 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ static const yytype_int8 yyr1[] = { - 0, 40, 42, 41, 44, 43, 45, 45, 46, 48, - 47, 47, 49, 49, 51, 52, 50, 53, 54, 54, - 55, 55, 56, 57, 58, 58, 58, 59, 59, 60, - 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, - 62, 62, 62, 63, 63, 63, 65, 64, 66, 66, - 67, 69, 70, 68, 71 + 0, 43, 45, 44, 47, 46, 48, 48, 49, 51, + 50, 50, 52, 52, 54, 55, 53, 56, 57, 57, + 58, 58, 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 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ @@ -738,9 +766,10 @@ static const yytype_int8 yyr2[] = 0, 2, 0, 9, 0, 5, 2, 0, 1, 0, 3, 0, 2, 1, 0, 0, 6, 1, 3, 1, 3, 1, 0, 3, 3, 2, 0, 3, 1, 1, - 1, 1, 1, 3, 3, 3, 3, 3, 3, 1, - 3, 3, 1, 3, 3, 1, 0, 4, 1, 1, - 1, 0, 0, 6, 0 + 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 }; @@ -1204,52 +1233,64 @@ yyreduce: switch (yyn) { case 2: /* $@1: %empty */ -#line 38 "compilador.y" +#line 41 "compilador.y" { geraCodigo (NULL, "INPP"); } -#line 1212 "compilador.tab.c" +#line 1241 "compilador.tab.c" break; case 3: /* programa: $@1 PROGRAM IDENT ABRE_PARENTESES lista_idents FECHA_PARENTESES PONTO_E_VIRGULA bloco PONTO */ -#line 43 "compilador.y" +#line 46 "compilador.y" { geraCodigo (NULL, "PARA"); } -#line 1220 "compilador.tab.c" +#line 1249 "compilador.tab.c" break; case 4: /* $@2: %empty */ -#line 52 "compilador.y" +#line 55 "compilador.y" { } -#line 1227 "compilador.tab.c" +#line 1256 "compilador.tab.c" + break; + + case 5: /* bloco: parte_declara_rotulos parte_declara_vars parte_declara_subrotinas $@2 comando_composto */ +#line 58 "compilador.y" + { + retira(desloc,ts); + char buffer[50]; + sprintf(buffer,"DMEM %d",desloc); + geraCodigo(NULL,buffer); + desloc = 0; + } +#line 1268 "compilador.tab.c" break; case 9: /* $@3: %empty */ -#line 67 "compilador.y" +#line 76 "compilador.y" { } -#line 1233 "compilador.tab.c" +#line 1274 "compilador.tab.c" break; case 14: /* $@4: %empty */ -#line 75 "compilador.y" +#line 84 "compilador.y" { num_vars = 0; } -#line 1239 "compilador.tab.c" +#line 1280 "compilador.tab.c" break; case 15: /* $@5: %empty */ -#line 78 "compilador.y" +#line 87 "compilador.y" { /* AMEM num_vars */ char buffer[50]; sprintf(buffer, "AMEM %d", num_vars); geraCodigo(NULL, buffer); } -#line 1249 "compilador.tab.c" +#line 1290 "compilador.tab.c" break; case 17: /* tipo: IDENT */ -#line 87 "compilador.y" +#line 96 "compilador.y" { if (strcmp(token, "integer") == 0) { atualiza_tipo(num_vars, INTEIRO, ts); @@ -1260,112 +1301,140 @@ yyreduce: } mostra_ts(ts); // Mostra a tabela após a inserção } -#line 1264 "compilador.tab.c" +#line 1305 "compilador.tab.c" break; case 18: /* lista_id_var: lista_id_var VIRGULA IDENT */ -#line 100 "compilador.y" +#line 109 "compilador.y" { /* insere �ltima vars na tabela de s�mbolos */ num_vars += 1; insere_ts(token,VS,nivel_lexico,NSEI,desloc,ts); desloc += 1; } -#line 1274 "compilador.tab.c" +#line 1315 "compilador.tab.c" break; case 19: /* lista_id_var: IDENT */ -#line 105 "compilador.y" +#line 114 "compilador.y" { num_vars += 1; insere_ts(token,VS,nivel_lexico,NSEI,desloc,ts); desloc += 1; /* insere vars na tabela de s�mbolos */ } -#line 1285 "compilador.tab.c" +#line 1326 "compilador.tab.c" + break; + + case 38: /* simb_leitura: IDENT */ +#line 159 "compilador.y" + { + geraCodigo(NULL, "LEIT"); + l_elem = busca(token,ts); + char buffer[50]; + sprintf(buffer,"ARMZ %d,%d",l_elem->nivel,l_elem->desloc); + geraCodigo(NULL,buffer); + } +#line 1338 "compilador.tab.c" + break; + + case 40: /* lista_escritas: lista_escritas VIRGULA expressao_simples */ +#line 171 "compilador.y" + { + geraCodigo(NULL,"IMPR"); + } +#line 1346 "compilador.tab.c" break; - case 33: /* expressao: expressao IGUAL expressao_simples */ -#line 141 "compilador.y" + case 41: /* lista_escritas: expressao_simples */ +#line 174 "compilador.y" + { + geraCodigo(NULL,"IMPR"); + } +#line 1354 "compilador.tab.c" + break; + + case 42: /* expressao: expressao IGUAL expressao_simples */ +#line 179 "compilador.y" { geraCodigo(NULL, "CMIG"); // Adiciona operação de cmig } -#line 1293 "compilador.tab.c" +#line 1362 "compilador.tab.c" break; - case 34: /* expressao: expressao DIFERENTE expressao_simples */ -#line 144 "compilador.y" + case 43: /* expressao: expressao DIFERENTE expressao_simples */ +#line 182 "compilador.y" { geraCodigo(NULL, "CMDG"); // Adiciona operação de cmdg } -#line 1301 "compilador.tab.c" +#line 1370 "compilador.tab.c" break; - case 35: /* expressao: expressao MENOR expressao_simples */ -#line 147 "compilador.y" + case 44: /* expressao: expressao MENOR expressao_simples */ +#line 185 "compilador.y" { geraCodigo(NULL, "CMME"); // Adiciona operação de cmme } -#line 1309 "compilador.tab.c" +#line 1378 "compilador.tab.c" break; - case 36: /* expressao: expressao MENOR_IGUAL expressao_simples */ -#line 150 "compilador.y" + case 45: /* expressao: expressao MENOR_IGUAL expressao_simples */ +#line 188 "compilador.y" { geraCodigo(NULL, "CMEG"); // Adiciona operação de cmeg } -#line 1317 "compilador.tab.c" +#line 1386 "compilador.tab.c" break; - case 37: /* expressao: expressao MAIOR expressao_simples */ -#line 153 "compilador.y" + case 46: /* expressao: expressao MAIOR expressao_simples */ +#line 191 "compilador.y" { geraCodigo(NULL, "CMMA"); // Adiciona operação de cmma } -#line 1325 "compilador.tab.c" +#line 1394 "compilador.tab.c" break; - case 38: /* expressao: expressao MAIOR_IGUAL expressao_simples */ -#line 156 "compilador.y" + case 47: /* expressao: expressao MAIOR_IGUAL expressao_simples */ +#line 194 "compilador.y" { geraCodigo(NULL, "CMAG"); // Adiciona operação de cmag } -#line 1333 "compilador.tab.c" +#line 1402 "compilador.tab.c" break; - case 40: /* expressao_simples: expressao_simples MAIS termo */ -#line 162 "compilador.y" + case 49: /* expressao_simples: expressao_simples MAIS termo */ +#line 200 "compilador.y" { geraCodigo(NULL, "SOMA"); // Adiciona operação de soma } -#line 1341 "compilador.tab.c" +#line 1410 "compilador.tab.c" break; - case 41: /* expressao_simples: expressao_simples MENOS termo */ -#line 165 "compilador.y" + case 50: /* expressao_simples: expressao_simples MENOS termo */ +#line 203 "compilador.y" { geraCodigo(NULL, "SUBT"); // Adiciona operação de subt } -#line 1349 "compilador.tab.c" +#line 1418 "compilador.tab.c" break; - case 43: /* termo: termo ASTERISCO fator */ -#line 171 "compilador.y" + case 52: /* termo: termo ASTERISCO fator */ +#line 209 "compilador.y" { geraCodigo(NULL, "MULT"); // Adiciona operação de mult } -#line 1357 "compilador.tab.c" +#line 1426 "compilador.tab.c" break; - case 44: /* termo: termo DIV fator */ -#line 174 "compilador.y" + case 53: /* termo: termo DIV fator */ +#line 212 "compilador.y" { geraCodigo(NULL, "DIVI"); // Adiciona operação de divi } -#line 1365 "compilador.tab.c" +#line 1434 "compilador.tab.c" break; - case 46: /* $@6: %empty */ -#line 180 "compilador.y" + case 55: /* $@6: %empty */ +#line 218 "compilador.y" { // Busca variável no lado esquerdo l_elem = busca(token, ts); @@ -1376,22 +1445,22 @@ yyreduce: destino_desloc = l_elem->desloc; } } -#line 1380 "compilador.tab.c" +#line 1449 "compilador.tab.c" break; - case 47: /* atribuicao: IDENT $@6 ATRIBUICAO expressao_simples */ -#line 189 "compilador.y" + case 56: /* atribuicao: IDENT $@6 ATRIBUICAO expressao_simples */ +#line 227 "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 1391 "compilador.tab.c" +#line 1460 "compilador.tab.c" break; - case 48: /* fator: IDENT */ -#line 197 "compilador.y" + case 57: /* fator: IDENT */ +#line 235 "compilador.y" { // Carrega variável l_elem = busca(token, ts); @@ -1403,22 +1472,22 @@ yyreduce: geraCodigo(NULL, buffer); } } -#line 1407 "compilador.tab.c" +#line 1476 "compilador.tab.c" break; - case 49: /* fator: NUMERO */ -#line 208 "compilador.y" + case 58: /* fator: NUMERO */ +#line 246 "compilador.y" { // Empilha constante char buffer[50]; sprintf(buffer, "CRCT %s", token); geraCodigo(NULL, buffer); } -#line 1418 "compilador.tab.c" +#line 1487 "compilador.tab.c" break; - case 51: /* $@7: %empty */ -#line 217 "compilador.y" + case 60: /* $@7: %empty */ +#line 255 "compilador.y" { char r_ini[4]; sprintf(r_ini, "R%02d", rot_id); @@ -1426,11 +1495,11 @@ yyreduce: rot_id += 1; geraCodigo(r_ini,"NADA"); } -#line 1430 "compilador.tab.c" +#line 1499 "compilador.tab.c" break; - case 52: /* $@8: %empty */ -#line 224 "compilador.y" + case 61: /* $@8: %empty */ +#line 262 "compilador.y" { char r_fim[4]; sprintf(r_fim, "R%02d", rot_id); @@ -1441,11 +1510,11 @@ yyreduce: strcat(buffer,r_fim); geraCodigo(NULL,buffer); } -#line 1445 "compilador.tab.c" +#line 1514 "compilador.tab.c" break; - case 53: /* comando_repetitivo: $@7 WHILE expressao DO $@8 comando_sem_rotulo */ -#line 234 "compilador.y" + case 62: /* comando_repetitivo: $@7 WHILE expressao DO $@8 comando_sem_rotulo */ +#line 272 "compilador.y" { char r_ini[4]; char r_fim[4]; @@ -1460,11 +1529,60 @@ yyreduce: geraCodigo(r_fim,"NADA"); } -#line 1464 "compilador.tab.c" +#line 1533 "compilador.tab.c" + break; + + case 63: /* comando_condicional: if_then cond_else */ +#line 288 "compilador.y" + { + char r_fim[4]; + desempilha(r_fim,rot); + geraCodigo(r_fim,"NADA"); + } +#line 1543 "compilador.tab.c" + break; + + case 66: /* $@9: %empty */ +#line 300 "compilador.y" + { + char r_else[4]; + sprintf(r_else,"R%02d",rot_id); + empilha(r_else,rot); + rot_id += 1; + char buffer[50]; + strcpy(buffer, "DSVF "); + strcat(buffer,r_else); + geraCodigo(NULL,buffer); + + char r_fim[4]; + sprintf(r_fim, "R%02d", rot_id); + empilha(r_fim, rot); + rot_id += 1; + } +#line 1563 "compilador.tab.c" + break; + + case 67: /* if_then: IF expressao $@9 THEN comando_sem_rotulo */ +#line 315 "compilador.y" + { + char r_fim[4]; + desempilha(r_fim,rot); + char r_else[4]; + desempilha(r_else,rot); + + empilha(r_fim,rot); + char buffer[50]; + strcpy(buffer, "DSVS "); + strcat(buffer,r_fim); + geraCodigo(NULL,buffer); + + geraCodigo(r_else,"NADA"); + } +#line 1582 "compilador.tab.c" break; -#line 1468 "compilador.tab.c" +#line 1586 "compilador.tab.c" default: break; } @@ -1657,7 +1775,7 @@ yyreturnlab: return yyresult; } -#line 254 "compilador.y" +#line 332 "compilador.y" int main (int argc, char** argv) { diff --git a/compilador.tab.h b/compilador.tab.h index a923641..98da8d5 100644 --- a/compilador.tab.h +++ b/compilador.tab.h @@ -90,7 +90,10 @@ extern int yydebug; MAIS = 291, /* MAIS */ MENOS = 292, /* MENOS */ ASTERISCO = 293, /* ASTERISCO */ - NUMERO = 294 /* NUMERO */ + NUMERO = 294, /* NUMERO */ + READ = 295, /* READ */ + WRITE = 296, /* WRITE */ + LOWER_THAN_ELSE = 297 /* LOWER_THAN_ELSE */ }; typedef enum yytokentype yytoken_kind_t; #endif diff --git a/compilador.y b/compilador.y index 76707a4..1eb9e03 100644 --- a/compilador.y +++ b/compilador.y @@ -31,7 +31,10 @@ stack_t *rot; %token GOTO IF THEN ELSE WHILE DO OR DIV %token AND NOT IGUAL DIFERENTE MENOR_IGUAL %token MAIOR_IGUAL MENOR MAIOR MAIS MENOS -%token ASTERISCO NUMERO +%token ASTERISCO NUMERO READ WRITE + +%nonassoc LOWER_THAN_ELSE +%nonassoc ELSE %% @@ -52,7 +55,13 @@ bloco : { } - comando_composto + comando_composto { + retira(desloc,ts); + char buffer[50]; + sprintf(buffer,"DMEM %d",desloc); + geraCodigo(NULL,buffer); + desloc = 0; + } ; @@ -136,6 +145,35 @@ comando_sem_rotulo: atribuicao | comando_composto | comando_condicional | comando_repetitivo + | leitura + | escrita +; + +leitura: READ ABRE_PARENTESES lista_leituras FECHA_PARENTESES +; + +lista_leituras: lista_leituras VIRGULA simb_leitura + | simb_leitura +; + +simb_leitura: IDENT { + geraCodigo(NULL, "LEIT"); + l_elem = busca(token,ts); + char buffer[50]; + sprintf(buffer,"ARMZ %d,%d",l_elem->nivel,l_elem->desloc); + geraCodigo(NULL,buffer); + } +; + +escrita: WRITE ABRE_PARENTESES lista_escritas FECHA_PARENTESES +; + +lista_escritas: lista_escritas VIRGULA expressao_simples { + geraCodigo(NULL,"IMPR"); + } + | expressao_simples { + geraCodigo(NULL,"IMPR"); + } ; expressao: expressao IGUAL expressao_simples { @@ -247,10 +285,19 @@ comando_repetitivo: { } ; -comando_condicional: if_then elses +comando_condicional: if_then cond_else { + char r_fim[4]; + desempilha(r_fim,rot); + geraCodigo(r_fim,"NADA"); + } ; -if_then: IF expressao THEN { +cond_else: ELSE + comando_sem_rotulo + | %prec LOWER_THAN_ELSE +; + +if_then: IF expressao { char r_else[4]; sprintf(r_else,"R%02d",rot_id); empilha(r_else,rot); @@ -265,14 +312,23 @@ if_then: IF expressao THEN { empilha(r_fim, rot); rot_id += 1; } - comando_sem_rotulo { + THEN comando_sem_rotulo { + char r_fim[4]; + desempilha(r_fim,rot); + char r_else[4]; + desempilha(r_else,rot); - } + empilha(r_fim,rot); + char buffer[50]; + strcpy(buffer, "DSVS "); + strcat(buffer,r_fim); + geraCodigo(NULL,buffer); -elses: ELSE comando_sem_rotulo elses - | + geraCodigo(r_else,"NADA"); + } ; + %% int main (int argc, char** argv) { diff --git a/lex.yy.c b/lex.yy.c index e52d3a6..ef6ad0e 100644 --- a/lex.yy.c +++ b/lex.yy.c @@ -351,8 +351,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 41 -#define YY_END_OF_BUFFER 42 +#define YY_NUM_RULES 43 +#define YY_END_OF_BUFFER 44 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -360,20 +360,21 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[107] = +static const flex_int16_t yy_accept[115] = { 0, - 0, 0, 42, 41, 2, 1, 13, 14, 38, 36, - 11, 37, 12, 39, 10, 9, 34, 30, 35, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 2, 0, 39, 8, 32, 31, - 33, 40, 40, 40, 40, 40, 25, 40, 40, 40, - 40, 21, 40, 40, 26, 40, 40, 40, 40, 40, - 0, 0, 28, 40, 40, 27, 40, 7, 40, 40, - 40, 29, 40, 40, 40, 5, 40, 3, 40, 40, - 23, 40, 20, 40, 40, 40, 22, 16, 40, 17, - 6, 40, 15, 40, 40, 24, 40, 40, 40, 40, - - 40, 4, 19, 40, 18, 0 + 0, 0, 44, 43, 2, 1, 15, 16, 40, 38, + 13, 39, 14, 41, 12, 11, 36, 32, 37, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 2, 0, 41, 10, 34, + 33, 35, 42, 42, 42, 42, 42, 27, 42, 42, + 42, 42, 23, 42, 42, 28, 42, 42, 42, 42, + 42, 42, 42, 0, 0, 30, 42, 42, 29, 42, + 7, 42, 42, 42, 31, 42, 42, 42, 42, 5, + 42, 42, 3, 42, 42, 25, 42, 22, 42, 42, + 42, 8, 24, 18, 42, 42, 19, 6, 42, 17, + + 42, 42, 26, 9, 42, 42, 42, 42, 42, 4, + 21, 42, 20, 0 } ; static const YY_CHAR yy_ec[256] = @@ -416,78 +417,82 @@ static const YY_CHAR yy_meta[39] = 3, 3, 3, 3, 3, 3, 3, 3 } ; -static const flex_int16_t yy_base[109] = +static const flex_int16_t yy_base[117] = { 0, - 0, 0, 116, 117, 113, 117, 108, 117, 117, 117, - 117, 117, 117, 102, 97, 117, 24, 117, 96, 0, - 12, 88, 16, 16, 74, 78, 84, 88, 75, 72, - 71, 22, 84, 76, 98, 93, 87, 117, 117, 117, - 117, 0, 76, 64, 71, 58, 0, 60, 71, 62, - 56, 0, 70, 54, 0, 57, 64, 54, 52, 57, - 76, 43, 0, 63, 54, 0, 57, 0, 58, 47, - 54, 0, 30, 46, 52, 0, 46, 66, 33, 41, - 0, 35, 0, 41, 45, 34, 0, 0, 43, 0, - 0, 38, 0, 41, 41, 0, 28, 22, 28, 26, - - 21, 0, 0, 30, 0, 117, 48, 60 + 0, 0, 123, 124, 120, 124, 115, 124, 124, 124, + 124, 124, 124, 109, 104, 124, 24, 124, 103, 0, + 12, 95, 16, 16, 81, 85, 91, 95, 82, 79, + 78, 87, 22, 90, 23, 105, 100, 94, 124, 124, + 124, 124, 0, 83, 71, 78, 65, 0, 67, 78, + 69, 63, 0, 77, 61, 0, 64, 75, 70, 60, + 58, 63, 62, 81, 44, 0, 68, 59, 0, 62, + 0, 63, 52, 59, 0, 32, 59, 50, 56, 0, + 50, 42, 69, 36, 44, 0, 38, 0, 44, 48, + 37, 0, 0, 0, 46, 45, 0, 0, 40, 0, + + 44, 46, 0, 0, 32, 24, 30, 28, 22, 0, + 0, 31, 0, 124, 48, 60 } ; -static const flex_int16_t yy_def[109] = +static const flex_int16_t yy_def[117] = { 0, - 106, 1, 106, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 106, 108, 106, 106, 106, 106, - 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 108, 108, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 108, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - - 107, 107, 107, 107, 107, 0, 106, 106 + 114, 1, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 114, 116, 114, 114, 114, + 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 116, 116, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 116, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 0, 114, 114 } ; -static const flex_int16_t yy_nxt[156] = +static const flex_int16_t yy_nxt[163] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 20, 23, 24, 25, 26, 20, 27, 28, 20, 29, 30, - 31, 20, 20, 32, 20, 33, 34, 20, 39, 40, - 43, 46, 48, 44, 49, 47, 57, 78, 62, 85, - 42, 105, 104, 86, 103, 102, 101, 100, 99, 58, - 61, 98, 61, 97, 96, 95, 94, 93, 92, 91, - 90, 62, 89, 88, 87, 84, 83, 82, 81, 80, - 79, 62, 77, 76, 75, 74, 73, 72, 71, 70, - 69, 68, 67, 66, 65, 64, 63, 37, 62, 35, - - 60, 59, 56, 55, 54, 53, 52, 51, 50, 45, - 41, 38, 37, 36, 35, 106, 3, 106, 106, 106, - 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 106, 106, 106 + 31, 32, 20, 33, 20, 34, 35, 20, 40, 41, + 44, 47, 49, 45, 50, 48, 59, 62, 83, 65, + 43, 90, 113, 112, 63, 91, 111, 110, 109, 60, + 64, 108, 64, 107, 106, 105, 104, 103, 102, 101, + 100, 99, 98, 97, 65, 96, 95, 94, 93, 92, + 89, 88, 87, 86, 85, 84, 65, 82, 81, 80, + 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, + + 69, 68, 67, 66, 38, 65, 36, 61, 58, 57, + 56, 55, 54, 53, 52, 51, 46, 42, 39, 38, + 37, 36, 114, 3, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114 } ; -static const flex_int16_t yy_chk[156] = +static const flex_int16_t yy_chk[163] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 17, - 21, 23, 24, 21, 24, 23, 32, 62, 62, 73, - 107, 104, 101, 73, 100, 99, 98, 97, 95, 32, - 108, 94, 108, 92, 89, 86, 85, 84, 82, 80, - 79, 78, 77, 75, 74, 71, 70, 69, 67, 65, - 64, 61, 60, 59, 58, 57, 56, 54, 53, 51, - 50, 49, 48, 46, 45, 44, 43, 37, 36, 35, - - 34, 33, 31, 30, 29, 28, 27, 26, 25, 22, - 19, 15, 14, 7, 5, 3, 106, 106, 106, 106, - 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 106, 106, 106 + 21, 23, 24, 21, 24, 23, 33, 35, 65, 65, + 115, 76, 112, 109, 35, 76, 108, 107, 106, 33, + 116, 105, 116, 102, 101, 99, 96, 95, 91, 90, + 89, 87, 85, 84, 83, 82, 81, 79, 78, 77, + 74, 73, 72, 70, 68, 67, 64, 63, 62, 61, + 60, 59, 58, 57, 55, 54, 52, 51, 50, 49, + + 47, 46, 45, 44, 38, 37, 36, 34, 32, 31, + 30, 29, 28, 27, 26, 25, 22, 19, 15, 14, + 7, 5, 3, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114 } ; static yy_state_type yy_last_accepting_state; @@ -531,8 +536,8 @@ char *yytext; int nl = 1; -#line 535 "lex.yy.c" -#line 536 "lex.yy.c" +#line 540 "lex.yy.c" +#line 541 "lex.yy.c" #define INITIAL 0 @@ -752,7 +757,7 @@ YY_DECL #line 41 "compilador.l" -#line 756 "lex.yy.c" +#line 761 "lex.yy.c" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -779,13 +784,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 107 ) + if ( yy_current_state >= 115 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 117 ); + while ( yy_base[yy_current_state] != 124 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -864,306 +869,324 @@ YY_RULE_SETUP case 8: YY_RULE_SETUP #line 73 "compilador.l" +{ simbolo = simb_read; + strncpy (token, yytext, TAM_TOKEN); + IMPRIME("read "); + return READ; +} + YY_BREAK +case 9: +YY_RULE_SETUP +#line 79 "compilador.l" +{ simbolo = simb_write; + strncpy (token, yytext, TAM_TOKEN); + IMPRIME("write "); + return WRITE; +} + YY_BREAK +case 10: +YY_RULE_SETUP +#line 85 "compilador.l" { simbolo = simb_atribuicao; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" atribuicao "); return ATRIBUICAO; } YY_BREAK -case 9: +case 11: YY_RULE_SETUP -#line 79 "compilador.l" +#line 91 "compilador.l" { simbolo = simb_ponto_e_virgula; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" pt_virgula "); return PONTO_E_VIRGULA; } YY_BREAK -case 10: +case 12: YY_RULE_SETUP -#line 85 "compilador.l" +#line 97 "compilador.l" { simbolo = simb_dois_pontos; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" dois pontos "); return DOIS_PONTOS; } YY_BREAK -case 11: +case 13: YY_RULE_SETUP -#line 91 "compilador.l" +#line 103 "compilador.l" { simbolo = simb_virgula; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" virgula "); return VIRGULA; } YY_BREAK -case 12: +case 14: YY_RULE_SETUP -#line 98 "compilador.l" +#line 110 "compilador.l" { simbolo = simb_ponto; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" ponto "); return PONTO; } YY_BREAK -case 13: +case 15: YY_RULE_SETUP -#line 104 "compilador.l" +#line 116 "compilador.l" { simbolo = simb_abre_parenteses; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" abre_parenteses "); return ABRE_PARENTESES; } YY_BREAK -case 14: +case 16: YY_RULE_SETUP -#line 110 "compilador.l" +#line 122 "compilador.l" { simbolo = simb_fecha_parenteses; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" fecha_parenteses "); return FECHA_PARENTESES; } YY_BREAK -case 15: +case 17: YY_RULE_SETUP -#line 116 "compilador.l" +#line 128 "compilador.l" { simbolo = simb_label; strncpy (token, yytext, TAM_TOKEN); IMPRIME("label "); return LABEL; } YY_BREAK -case 16: +case 18: YY_RULE_SETUP -#line 122 "compilador.l" +#line 134 "compilador.l" { simbolo = simb_type; strncpy (token, yytext, TAM_TOKEN); IMPRIME("type "); return TYPE; } YY_BREAK -case 17: +case 19: YY_RULE_SETUP -#line 128 "compilador.l" +#line 140 "compilador.l" { simbolo = simb_array; strncpy (token, yytext, TAM_TOKEN); IMPRIME("array "); return ARRAY; } YY_BREAK -case 18: +case 20: YY_RULE_SETUP -#line 134 "compilador.l" +#line 146 "compilador.l" { simbolo = simb_procedure; strncpy (token, yytext, TAM_TOKEN); IMPRIME("procedure "); return PROCEDURE; } YY_BREAK -case 19: +case 21: YY_RULE_SETUP -#line 140 "compilador.l" +#line 152 "compilador.l" { simbolo = simb_function; strncpy (token, yytext, TAM_TOKEN); IMPRIME("function "); return FUNCTION; } YY_BREAK -case 20: +case 22: YY_RULE_SETUP -#line 146 "compilador.l" +#line 158 "compilador.l" { simbolo = simb_goto; strncpy (token, yytext, TAM_TOKEN); IMPRIME("goto "); return GOTO; } YY_BREAK -case 21: +case 23: YY_RULE_SETUP -#line 152 "compilador.l" +#line 164 "compilador.l" { simbolo = simb_if; strncpy (token, yytext, TAM_TOKEN); IMPRIME("if "); return IF; } YY_BREAK -case 22: +case 24: YY_RULE_SETUP -#line 158 "compilador.l" +#line 170 "compilador.l" { simbolo = simb_then; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" then "); return THEN; } YY_BREAK -case 23: +case 25: YY_RULE_SETUP -#line 164 "compilador.l" +#line 176 "compilador.l" { simbolo = simb_else; strncpy (token, yytext, TAM_TOKEN); - IMPRIME("else "); + IMPRIME(" else "); return ELSE; } YY_BREAK -case 24: +case 26: YY_RULE_SETUP -#line 170 "compilador.l" +#line 182 "compilador.l" { simbolo = simb_while; strncpy (token, yytext, TAM_TOKEN); IMPRIME("while "); return WHILE; } YY_BREAK -case 25: +case 27: YY_RULE_SETUP -#line 176 "compilador.l" +#line 188 "compilador.l" { simbolo = simb_do; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" do "); return DO; } YY_BREAK -case 26: +case 28: YY_RULE_SETUP -#line 182 "compilador.l" +#line 194 "compilador.l" { simbolo = simb_or; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" or "); return OR; } YY_BREAK -case 27: +case 29: YY_RULE_SETUP -#line 188 "compilador.l" +#line 200 "compilador.l" { simbolo = simb_div; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" div "); return DIV; } YY_BREAK -case 28: +case 30: YY_RULE_SETUP -#line 194 "compilador.l" +#line 206 "compilador.l" { simbolo = simb_and; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" and "); return AND; } YY_BREAK -case 29: +case 31: YY_RULE_SETUP -#line 200 "compilador.l" +#line 212 "compilador.l" { simbolo = simb_not; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" not "); return NOT; } YY_BREAK -case 30: +case 32: YY_RULE_SETUP -#line 206 "compilador.l" +#line 218 "compilador.l" { simbolo = simb_igual; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" igual "); return IGUAL; } YY_BREAK -case 31: +case 33: YY_RULE_SETUP -#line 212 "compilador.l" +#line 224 "compilador.l" { simbolo = simb_diferente; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" diferente "); return DIFERENTE; } YY_BREAK -case 32: +case 34: YY_RULE_SETUP -#line 218 "compilador.l" +#line 230 "compilador.l" { simbolo = simb_menor_igual; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" menor_igual "); return MENOR_IGUAL; } YY_BREAK -case 33: +case 35: YY_RULE_SETUP -#line 224 "compilador.l" +#line 236 "compilador.l" { simbolo = simb_maior_igual; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" maior_igual "); return MAIOR_IGUAL; } YY_BREAK -case 34: +case 36: YY_RULE_SETUP -#line 230 "compilador.l" +#line 242 "compilador.l" { simbolo = simb_menor; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" menor "); return MENOR; } YY_BREAK -case 35: +case 37: YY_RULE_SETUP -#line 236 "compilador.l" +#line 248 "compilador.l" { simbolo = simb_maior; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" maior "); return MAIOR; } YY_BREAK -case 36: +case 38: YY_RULE_SETUP -#line 242 "compilador.l" +#line 254 "compilador.l" { simbolo = simb_mais; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" mais "); return MAIS; } YY_BREAK -case 37: +case 39: YY_RULE_SETUP -#line 248 "compilador.l" +#line 260 "compilador.l" { simbolo = simb_menos; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" menos "); return MENOS; } YY_BREAK -case 38: +case 40: YY_RULE_SETUP -#line 254 "compilador.l" +#line 266 "compilador.l" { simbolo = simb_asterisco; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" asterisco "); return ASTERISCO; } YY_BREAK -case 39: +case 41: YY_RULE_SETUP -#line 260 "compilador.l" +#line 272 "compilador.l" { simbolo = simb_numero; strncpy (token, yytext,TAM_TOKEN); IMPRIME(" numero "); return NUMERO; } YY_BREAK -case 40: +case 42: YY_RULE_SETUP -#line 266 "compilador.l" +#line 278 "compilador.l" { simbolo = simb_identificador; strncpy (token, yytext, TAM_TOKEN); IMPRIME(" ident "); return IDENT; } YY_BREAK -case 41: +case 43: YY_RULE_SETUP -#line 272 "compilador.l" +#line 284 "compilador.l" ECHO; YY_BREAK -#line 1167 "lex.yy.c" +#line 1190 "lex.yy.c" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -1460,7 +1483,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 107 ) + if ( yy_current_state >= 115 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -1488,11 +1511,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 107 ) + if ( yy_current_state >= 115 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 106); + yy_is_jam = (yy_current_state == 114); return yy_is_jam ? 0 : yy_current_state; } @@ -2168,6 +2191,6 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 272 "compilador.l" +#line 284 "compilador.l" diff --git a/teste5.pas b/teste5.pas new file mode 100644 index 0000000..940451a --- /dev/null +++ b/teste5.pas @@ -0,0 +1,20 @@ +program cmdIf (input, output); +var i, j: integer; +begin + read(j); + i:=0; + while i < j do + begin + if i div 2 * 2 = i + then + begin + write(i,0); + if i = 0 + then write(2) + else write(3); + end + else write(i,1); + i := i+1; + end; +end. + -- GitLab