public override object VisitFundeclaracao([NotNull] CminusParser.FundeclaracaoContext context) { var ID = context.ID().GetText(); if (ID == "main") { temMain = true; } if (!Tabela.Declarado(ID, nivel)) { Tabela.Insere(new Simbolo(ID, Simbolo.Classe.funcao, context.tipoespecificador().GetText(), nivel, 0, false, 0)); } else { Console.WriteLine("Linha " + context.start.Line + ": Erro ao declarar a função \'" + ID + "\'.\n\tVerifique se já há alguma outra variável/função com o mesmo nome."); } nivel++; VisitChildren(context); indice = 0; Escopos.Insere(ID, Tabela.RetornaEscopo(nivel)); Tabela.Elimina(nivel); nivel--; return(null); }
public override object VisitFundeclaracao([NotNull] CminusParser.FundeclaracaoContext context) { //Console.WriteLine("VisitFundeclaracao"); var ID = context.ID().GetText(); escopo_atual = ID; if (((string)ID).Equals("main")) { assembly.AppendLine("MAIN:"); assembly.AppendLine("add r29, 0, 69"); assembly.AppendLine("copy r63, r29"); assembly.AppendLine("add r31, r31 " + escopos.retornaTamanhoFuncao(ID)); } else if (ID != "input" && ID != "output") { assembly.AppendLine(escopos.retornaLabelFuncao(ID) + ":"); //assembly.AppendLine("rm = rm + " + escopos.retornaTamanhoFuncao(ID)); assembly.AppendLine("add r31, r31 " + escopos.retornaTamanhoFuncao(ID)); //desempilhando os parametros int num_params = escopos.retornaTotalParamsFuncao(ID); string reg = registradores.NextDataReg(); string mem_reg = registradores.NextMemReg(); for (int i = num_params - 1; i >= 0; i--) { assembly.AppendLine("add r29, r29, 1"); //assembly.AppendLine("rx = rx + 1"); assembly.AppendLine("sub " + reg + ", r31, " + i); assembly.AppendLine("copy " + mem_reg + ", " + reg); //assembly.AppendLine(reg + " = rm - " + i); assembly.AppendLine("copy r63, r29"); assembly.AppendLine("copy [" + mem_reg + "]" + ", [r63]"); //assembly.AppendLine("[" + reg + "]" + " = [rx]"); } registradores.FreeDataRegister(reg); registradores.FreeMemRegister(mem_reg); var children = VisitChildren(context); if (ID != "main") { //assembly.AppendLine("rm = rm - " + escopos.retornaTamanhoFuncao(ID)); assembly.AppendLine("sub r31, r31 " + escopos.retornaTamanhoFuncao(ID)); string reg_temp = registradores.NextDataReg(); assembly.AppendLine("add r29, r29, 1"); assembly.AppendLine("copy r63, r29"); assembly.AppendLine("copy " + reg_temp + ", [r63]"); //assembly.AppendLine("rx = rx + 1"); assembly.AppendLine("jmpr " + reg_temp); registradores.FreeDataRegister(reg_temp); } return(children); } return(VisitChildren(context)); }