public override object VisitAtivacao([NotNull] CminusParser.AtivacaoContext context) { //Console.WriteLine("Visitativacao"); //assembly.AppendLine("\nVisirativacao"); //assembly.AppendLine("movr [rx], PC+2"); //assembly.AppendLine("rx = rx - 1"); string reg2 = registradores.NextDataReg(); registradores.FreeDataRegister(reg2); if (context.ID().GetText() == "input") { string reg3 = registradores.NextDataReg(); assembly.AppendLine("input " + reg3); return(reg3); } if (context.ID().GetText() == "output") { isIO = true; var termos = Visit(context.arglista()); isIO = false; assembly.AppendLine("output " + termos); string[] termo_free = ((string)termos).Split(','); registradores.FreeDataRegister(termo_free[0]); registradores.FreeMemRegister(termo_free[0]); return(termo_free[0]); } string reg_pc = registradores.NextMemReg(); assembly.AppendLine("copy " + reg_pc + ", r63"); assembly.AppendLine("sub r29, r29, 1"); assembly.AppendLine("copy r63, r29"); var args = Visit(context.arglista()); assembly.AppendLine("movr [" + reg_pc + "], 1"); registradores.FreeMemRegister(reg_pc); //assembly.AppendLine("add " + reg2 + ", [r63], 1"); assembly.AppendLine("jmp " + escopos.retornaLabelFuncao(context.ID().GetText())); string reg = registradores.NextDataReg(); assembly.AppendLine("copy " + reg + ", r30"); //assembly.AppendLine(reg + " = ry"); return(reg); }
public override object VisitAtivacao([NotNull] CminusParser.AtivacaoContext context) { var ID = context.ID().GetText(); if (Tabela.Declarado(ID, nivel)) { if (emExpressao && Tabela.Busca(ID).tipo == "void") { Console.WriteLine("Linha " + context.start.Line + ": A função \'" + ID + "\' retorna void, logo não é possível usá-la em uma variável int.\n"); } } else if (ID != "input" && ID != "output") { Console.WriteLine("Linha " + context.start.Line + ": Erro ao chamar a função \'" + ID + "\'.\n\tFunção não declarada"); } VisitChildren(context); return(null); }