diff --git a/MEPA b/MEPA index 0ec3c42a665241694a37dad35ee29c209d9d6278..1e347b2094fc5d6c126922d71cfef9b7b9c8d04c 100644 --- a/MEPA +++ b/MEPA @@ -5,14 +5,11 @@ R01: ENPR 1 AMEM 1 DSVS R02 R02: NADA - CRVL 1,-5 ARMZ 1,0 DMEM 1 R00: NADA CRCT 8 ARMZ 0,0 - CRVL 0,0 - CRCT 2 CHPR R01,0 DMEM 0 PARA diff --git a/compilador.y b/compilador.y index 566bdbb6367c30e619242a3d2facb8c1ebd3c710..028be4367f7bd50a4a51cd8accbbad82ad290f78 100644 --- a/compilador.y +++ b/compilador.y @@ -273,6 +273,7 @@ chamada_procedimento: // Gera código para chamar o procedimento empilha(l_elem->ident, proc); } + num_param = 0; // Reinicia a contagem de parâmetros reais } lista_parametros @@ -283,6 +284,16 @@ chamada_procedimento: mostra_ts(ts); desempilha(buffer, proc); l_elem = busca(buffer, ts); + + // Verifica se o número de parâmetros reais bate com os formais + if (num_param != l_elem->info.pr.quant) { + char error_msg[100]; + sprintf(error_msg, "Erro: número de parâmetros incorreto. Esperado: %d, recebido: %d.", + l_elem->info.pr.quant, num_param); + yyerror(error_msg); + } + + // Gera o código de chamada do procedimento sprintf(buffer, "CHPR %s,%d", l_elem->info.pr.rot, nivel_lexico); geraCodigo(NULL, buffer); } @@ -295,7 +306,13 @@ lista_parametros: ABRE_PARENTESES ; lista_parametros_parenteses: lista_parametros_parenteses VIRGULA expressao_simples + { + num_param++; // Incrementa para cada parâmetro real + } | expressao_simples + { + num_param++; // Conta o primeiro parâmetro real + } ; leitura: READ ABRE_PARENTESES lista_leituras FECHA_PARENTESES diff --git a/teste7.pas b/teste7.pas index 2b0fec6d8cff0addd0f5313f079560c981579aec..c3801a15d8d85f1eb240a035c2bf5f35a565e745 100644 --- a/teste7.pas +++ b/teste7.pas @@ -1,10 +1,11 @@ program proc1 (input, output); var x: integer; - procedure p(a,b: integer; c:boolean); + procedure p; var z: integer; begin z := a; end; begin x := 8; + p; end. \ No newline at end of file