From 7f8dde59a9b8548f4e29fce3ab02488acb59296c Mon Sep 17 00:00:00 2001 From: hm19 <hm19@inf.ufpr.br> Date: Tue, 3 Dec 2024 15:39:48 -0300 Subject: [PATCH] nivel lexico arrumado --- MEPA | 8 +-- compilador | Bin 54640 -> 54640 bytes compilador.tab.c | 173 ++++++++++++++++++++++++++--------------------- compilador.y | 41 ++++++++--- teste10.pas | 1 + teste11.pas | 22 ++++++ teste5.pas | 2 +- 7 files changed, 154 insertions(+), 93 deletions(-) create mode 100644 teste11.pas diff --git a/MEPA b/MEPA index a4aa486..a8c5494 100644 --- a/MEPA +++ b/MEPA @@ -10,14 +10,14 @@ R02: NADA CRCT 1 ARMI 1,-5 DMEM 1 + RTPR 1,2 R00: NADA - AMEM 1 + CRCT 8 + ARMZ 0,0 CREN 0,0 CRCT 2 CRCT 3 SOMA - CHPR R01,1 - CRVL 1,-6 - ARMZ 0,0 + CHPR R01,0 DMEM 1 PARA diff --git a/compilador b/compilador index ea2bab45adb9f6e6ebb169ff830776d45c59415a..4dbcf1715206b3c6730c7da8132228ccd1f1e9f4 100755 GIT binary patch delta 8245 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 delta 7993 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 AYXATM diff --git a/compilador.tab.c b/compilador.tab.c index fe1feac..3499d0d 100644 --- a/compilador.tab.c +++ b/compilador.tab.c @@ -567,11 +567,11 @@ static const yytype_int16 yyrline[] = 234, 238, 210, 246, 247, 245, 255, 258, 259, 263, 262, 272, 272, 280, 281, 284, 294, 297, 298, 299, 302, 303, 306, 307, 308, 309, 310, 311, 314, 314, - 318, 319, 322, 322, 345, 345, 388, 391, 395, 394, - 407, 407, 421, 424, 425, 428, 437, 440, 443, 448, - 451, 454, 457, 460, 463, 466, 469, 475, 481, 484, - 487, 490, 493, 493, 524, 535, 537, 544, 537, 570, - 577, 579, 582, 582 + 318, 319, 322, 322, 353, 353, 396, 399, 403, 402, + 415, 415, 429, 432, 433, 436, 445, 448, 451, 456, + 459, 462, 465, 468, 471, 474, 477, 483, 489, 492, + 495, 498, 501, 501, 543, 554, 556, 563, 556, 589, + 596, 598, 601, 601 }; #endif @@ -1536,7 +1536,7 @@ yyreduce: desloc = retira_vs_pf(ts); geraCodigo(NULL,buffer); if (nivel_lexico > 0) - nivel_lexico += 1; + nivel_lexico -= 1; mostra_ts(ts); } #line 1543 "compilador.tab.c" @@ -1773,18 +1773,26 @@ yyreduce: if (l_elem == NULL) { yyerror("Variável de destino não declarada"); } else { - if (l_elem->categ == PF && l_elem->info.pf.passagem == REF) + if (l_elem->categ == PF && l_elem->info.pf.passagem == REF) atr_indireto = REF; else atr_indireto = VLR; - destino_nivel = l_elem->nivel; - destino_desloc = l_elem->info.vs.desloc; + destino_nivel = l_elem->nivel; + if(l_elem->categ == VS) + destino_desloc = l_elem->info.vs.desloc; + else if(l_elem->categ == PF) + destino_desloc = l_elem->info.pf.desloc; + else if(l_elem->categ == FUN) + destino_desloc = l_elem->info.fun.desloc; + else + yyerror("Tentativa de atribuir em procedimento"); + } } -#line 1784 "compilador.tab.c" +#line 1792 "compilador.tab.c" break; case 63: -#line 332 "compilador.y" +#line 340 "compilador.y" { // Gera código ARMZ para armazenar valor char buffer[50]; @@ -1795,11 +1803,11 @@ yyreduce: } geraCodigo(NULL, buffer); } -#line 1799 "compilador.tab.c" +#line 1807 "compilador.tab.c" break; case 64: -#line 345 "compilador.y" +#line 353 "compilador.y" { if (l_elem == NULL){ yyerror("Procedimento não declarado"); @@ -1811,11 +1819,11 @@ yyreduce: geraCodigo(NULL, "AMEM 1"); num_param = 0; // Reinicia a contagem de parâmetros reais } -#line 1815 "compilador.tab.c" +#line 1823 "compilador.tab.c" break; case 65: -#line 359 "compilador.y" +#line 367 "compilador.y" { if (l_elem->categ == PR || l_elem->categ ==FUN) { char buffer[50]; @@ -1843,11 +1851,11 @@ yyreduce: geraCodigo(NULL, buffer); } } -#line 1847 "compilador.tab.c" +#line 1855 "compilador.tab.c" break; case 68: -#line 395 "compilador.y" +#line 403 "compilador.y" { char buffer[50]; desempilha(buffer,proc); @@ -1855,20 +1863,20 @@ yyreduce: val_ou_ref = l_elem->info.pr.param[num_param][1]; empilha(buffer,proc); } -#line 1859 "compilador.tab.c" +#line 1867 "compilador.tab.c" break; case 69: -#line 403 "compilador.y" +#line 411 "compilador.y" { num_param++; // Incrementa para cada parâmetro real val_ou_ref = VLR; } -#line 1868 "compilador.tab.c" +#line 1876 "compilador.tab.c" break; case 70: -#line 407 "compilador.y" +#line 415 "compilador.y" { char buffer[50]; desempilha(buffer,proc); @@ -1876,20 +1884,20 @@ yyreduce: val_ou_ref = l_elem->info.pr.param[num_param][1]; empilha(buffer,proc); } -#line 1880 "compilador.tab.c" +#line 1888 "compilador.tab.c" break; case 71: -#line 415 "compilador.y" +#line 423 "compilador.y" { num_param++; // Conta o primeiro parâmetro real val_ou_ref = VLR; } -#line 1889 "compilador.tab.c" +#line 1897 "compilador.tab.c" break; case 75: -#line 428 "compilador.y" +#line 436 "compilador.y" { geraCodigo(NULL, "LEIT"); l_elem = busca(token,ts); @@ -1897,123 +1905,123 @@ yyreduce: sprintf(buffer,"ARMZ %d,%d",l_elem->nivel,l_elem->info.vs.desloc); geraCodigo(NULL,buffer); } -#line 1901 "compilador.tab.c" +#line 1909 "compilador.tab.c" break; case 77: -#line 440 "compilador.y" +#line 448 "compilador.y" { geraCodigo(NULL,"IMPR"); } -#line 1909 "compilador.tab.c" +#line 1917 "compilador.tab.c" break; case 78: -#line 443 "compilador.y" +#line 451 "compilador.y" { geraCodigo(NULL,"IMPR"); } -#line 1917 "compilador.tab.c" +#line 1925 "compilador.tab.c" break; case 79: -#line 448 "compilador.y" +#line 456 "compilador.y" { geraCodigo(NULL, "CMIG"); // Adiciona operação de cmig } -#line 1925 "compilador.tab.c" +#line 1933 "compilador.tab.c" break; case 80: -#line 451 "compilador.y" +#line 459 "compilador.y" { geraCodigo(NULL, "CMDG"); // Adiciona operação de cmdg } -#line 1933 "compilador.tab.c" +#line 1941 "compilador.tab.c" break; case 81: -#line 454 "compilador.y" +#line 462 "compilador.y" { geraCodigo(NULL, "CMME"); // Adiciona operação de cmme } -#line 1941 "compilador.tab.c" +#line 1949 "compilador.tab.c" break; case 82: -#line 457 "compilador.y" +#line 465 "compilador.y" { geraCodigo(NULL, "CMEG"); // Adiciona operação de cmeg } -#line 1949 "compilador.tab.c" +#line 1957 "compilador.tab.c" break; case 83: -#line 460 "compilador.y" +#line 468 "compilador.y" { geraCodigo(NULL, "CMMA"); // Adiciona operação de cmma } -#line 1957 "compilador.tab.c" +#line 1965 "compilador.tab.c" break; case 84: -#line 463 "compilador.y" +#line 471 "compilador.y" { geraCodigo(NULL, "CMAG"); // Adiciona operação de cmag } -#line 1965 "compilador.tab.c" +#line 1973 "compilador.tab.c" break; case 86: -#line 469 "compilador.y" +#line 477 "compilador.y" { if (val_ou_ref == REF) yyerror("Erro: tentativa de EXPRESSAO em passagem por REFERENCIA\n"); else geraCodigo(NULL, "SOMA"); // Adiciona operação de soma } -#line 1976 "compilador.tab.c" +#line 1984 "compilador.tab.c" break; case 87: -#line 475 "compilador.y" +#line 483 "compilador.y" { if (val_ou_ref == REF) yyerror("Erro: tentativa de EXPRESSAO em passagem por REFERENCIA\n"); else geraCodigo(NULL, "SUBT"); // Adiciona operação de subt } -#line 1987 "compilador.tab.c" +#line 1995 "compilador.tab.c" break; case 89: -#line 484 "compilador.y" +#line 492 "compilador.y" { geraCodigo(NULL, "MULT"); // Adiciona operação de mult } -#line 1995 "compilador.tab.c" +#line 2003 "compilador.tab.c" break; case 90: -#line 487 "compilador.y" +#line 495 "compilador.y" { geraCodigo(NULL, "DIVI"); // Adiciona operação de divi } -#line 2003 "compilador.tab.c" +#line 2011 "compilador.tab.c" break; case 92: -#line 493 "compilador.y" +#line 501 "compilador.y" { // Carrega variável l_elem = busca(token, ts); empilha(token, proc); } -#line 2013 "compilador.tab.c" +#line 2021 "compilador.tab.c" break; case 93: -#line 499 "compilador.y" +#line 507 "compilador.y" { char buffer[50]; desempilha(buffer, proc); @@ -2022,28 +2030,39 @@ yyreduce: yyerror("Variável não declarada"); } else { if (val_ou_ref == REF) { - if (l_elem->categ == VS) + if (l_elem->categ == VS){ sprintf(buffer, "CREN %d,%d", l_elem->nivel, l_elem->info.vs.desloc); - else if (l_elem->categ == FUN) - sprintf(buffer, "CREN %d,%d", l_elem->nivel, l_elem->info.fun.desloc); + geraCodigo(NULL, buffer); + } + else if (l_elem->categ == PF){ + sprintf(buffer, "CREN %d,%d", l_elem->nivel, l_elem->info.pf.desloc); + geraCodigo(NULL, buffer); + } + else + yyerror("Tentativa de passagem de referencia de procedimento ou funcao"); + } else if (l_elem->categ == PF && l_elem->info.pf.passagem == REF) { sprintf(buffer, "CRVI %d,%d", l_elem->nivel, l_elem->info.pf.desloc); + geraCodigo(NULL, buffer); } else { - if (l_elem->categ == VS) + if (l_elem->categ == VS) { sprintf(buffer, "CRVL %d,%d", l_elem->nivel, l_elem->info.vs.desloc); - else if (l_elem->categ == FUN) - sprintf(buffer, "CRVL %d,%d", l_elem->nivel, l_elem->info.fun.desloc); + geraCodigo(NULL, buffer); + } + else if (l_elem->categ == PF){ + sprintf(buffer, "CRVL %d,%d", l_elem->nivel, l_elem->info.pf.desloc); + geraCodigo(NULL, buffer); + } } - geraCodigo(NULL, buffer); } } -#line 2043 "compilador.tab.c" +#line 2062 "compilador.tab.c" break; case 94: -#line 524 "compilador.y" +#line 543 "compilador.y" { // Empilha constante char buffer[50]; @@ -2054,11 +2073,11 @@ yyreduce: } geraCodigo(NULL, buffer); } -#line 2058 "compilador.tab.c" +#line 2077 "compilador.tab.c" break; case 96: -#line 537 "compilador.y" +#line 556 "compilador.y" { char r_ini[4]; sprintf(r_ini, "R%02d", rot_id); @@ -2066,11 +2085,11 @@ yyreduce: rot_id += 1; geraCodigo(r_ini,"NADA"); } -#line 2070 "compilador.tab.c" +#line 2089 "compilador.tab.c" break; case 97: -#line 544 "compilador.y" +#line 563 "compilador.y" { char r_fim[4]; sprintf(r_fim, "R%02d", rot_id); @@ -2081,11 +2100,11 @@ yyreduce: strcat(buffer,r_fim); geraCodigo(NULL,buffer); } -#line 2085 "compilador.tab.c" +#line 2104 "compilador.tab.c" break; case 98: -#line 554 "compilador.y" +#line 573 "compilador.y" { char r_ini[4]; char r_fim[4]; @@ -2100,21 +2119,21 @@ yyreduce: geraCodigo(r_fim,"NADA"); } -#line 2104 "compilador.tab.c" +#line 2123 "compilador.tab.c" break; case 99: -#line 570 "compilador.y" +#line 589 "compilador.y" { char r_fim[4]; desempilha(r_fim,rot); geraCodigo(r_fim,"NADA"); } -#line 2114 "compilador.tab.c" +#line 2133 "compilador.tab.c" break; case 102: -#line 582 "compilador.y" +#line 601 "compilador.y" { char r_else[4]; sprintf(r_else,"R%02d",rot_id); @@ -2130,11 +2149,11 @@ yyreduce: empilha(r_fim, rot); rot_id += 1; } -#line 2134 "compilador.tab.c" +#line 2153 "compilador.tab.c" break; case 103: -#line 597 "compilador.y" +#line 616 "compilador.y" { char r_fim[4]; desempilha(r_fim,rot); @@ -2149,11 +2168,11 @@ yyreduce: geraCodigo(r_else,"NADA"); } -#line 2153 "compilador.tab.c" +#line 2172 "compilador.tab.c" break; -#line 2157 "compilador.tab.c" +#line 2176 "compilador.tab.c" default: break; } @@ -2385,7 +2404,7 @@ yyreturn: #endif return yyresult; } -#line 614 "compilador.y" +#line 633 "compilador.y" int main (int argc, char** argv) { diff --git a/compilador.y b/compilador.y index 50d3bdd..1821ddd 100644 --- a/compilador.y +++ b/compilador.y @@ -84,7 +84,7 @@ bloco : desloc = retira_vs_pf(ts); geraCodigo(NULL,buffer); if (nivel_lexico > 0) - nivel_lexico += 1; + nivel_lexico -= 1; mostra_ts(ts); } ; @@ -323,11 +323,19 @@ atribuicao: { if (l_elem == NULL) { yyerror("Variável de destino não declarada"); } else { - if (l_elem->categ == PF && l_elem->info.pf.passagem == REF) + if (l_elem->categ == PF && l_elem->info.pf.passagem == REF) atr_indireto = REF; else atr_indireto = VLR; - destino_nivel = l_elem->nivel; - destino_desloc = l_elem->info.vs.desloc; + destino_nivel = l_elem->nivel; + if(l_elem->categ == VS) + destino_desloc = l_elem->info.vs.desloc; + else if(l_elem->categ == PF) + destino_desloc = l_elem->info.pf.desloc; + else if(l_elem->categ == FUN) + destino_desloc = l_elem->info.fun.desloc; + else + yyerror("Tentativa de atribuir em procedimento"); + } } ATRIBUICAO expressao_simples { // Gera código ARMZ para armazenar valor @@ -504,21 +512,32 @@ fator: IDENT { yyerror("Variável não declarada"); } else { if (val_ou_ref == REF) { - if (l_elem->categ == VS) + if (l_elem->categ == VS){ sprintf(buffer, "CREN %d,%d", l_elem->nivel, l_elem->info.vs.desloc); - else if (l_elem->categ == FUN) - sprintf(buffer, "CREN %d,%d", l_elem->nivel, l_elem->info.fun.desloc); + geraCodigo(NULL, buffer); + } + else if (l_elem->categ == PF){ + sprintf(buffer, "CREN %d,%d", l_elem->nivel, l_elem->info.pf.desloc); + geraCodigo(NULL, buffer); + } + else + yyerror("Tentativa de passagem de referencia de procedimento ou funcao"); + } else if (l_elem->categ == PF && l_elem->info.pf.passagem == REF) { sprintf(buffer, "CRVI %d,%d", l_elem->nivel, l_elem->info.pf.desloc); + geraCodigo(NULL, buffer); } else { - if (l_elem->categ == VS) + if (l_elem->categ == VS) { sprintf(buffer, "CRVL %d,%d", l_elem->nivel, l_elem->info.vs.desloc); - else if (l_elem->categ == FUN) - sprintf(buffer, "CRVL %d,%d", l_elem->nivel, l_elem->info.fun.desloc); + geraCodigo(NULL, buffer); + } + else if (l_elem->categ == PF){ + sprintf(buffer, "CRVL %d,%d", l_elem->nivel, l_elem->info.pf.desloc); + geraCodigo(NULL, buffer); + } } - geraCodigo(NULL, buffer); } } | NUMERO { diff --git a/teste10.pas b/teste10.pas index 339526f..3c1b11b 100644 --- a/teste10.pas +++ b/teste10.pas @@ -5,6 +5,7 @@ program proc1 (input, output); begin z := a; a := 1; + f := a; end; begin x := f(x, 2+3); diff --git a/teste11.pas b/teste11.pas new file mode 100644 index 0000000..a0e801c --- /dev/null +++ b/teste11.pas @@ -0,0 +1,22 @@ +program funcao (input, output); +var m: integer; +function f(n: integer; var k: integer): integer; +var p, q: integer; +begin + if n<2 then + begin + f:=n; k:=0; + end + else + begin + f:=f(n-1,p) + f(n-2,q); + k:=p+q+1; + end; + write(n,k); +end; +begin + write(f(3,m),m); +end. + + + diff --git a/teste5.pas b/teste5.pas index 940451a..358a19d 100644 --- a/teste5.pas +++ b/teste5.pas @@ -12,7 +12,7 @@ begin if i = 0 then write(2) else write(3); - end + end; else write(i,1); i := i+1; end; -- GitLab