public override object VisitVarvetor([NotNull] CminusParser.VarvetorContext context) { //Console.WriteLine("VisitVarvetor"); //assembly.AppendLine("\nVisirvarvetor"); var variavel = context.ID().GetText(); var expressao = Visit(context.expressao()); string reg = registradores.NextDataReg(); string mem_reg = registradores.NextMemReg(); string var_reg = "[" + mem_reg + "]"; int indice_funcao = escopos.retornaIndiceVar(escopo_atual, variavel); int indice_global = escopos.retornaIndiceVar("0000", variavel); if (indice_global == -1) { if (escopos.ehVetorParam(escopo_atual, variavel)) { //Console.WriteLine("\t\tentrou em vetor param"); assembly.AppendLine("sub " + reg + ", r31, " + indice_funcao); assembly.AppendLine("copy " + mem_reg + ", " + reg); //assembly.AppendLine(reg + " = rm - " + indice_funcao); string reg2 = registradores.NextDataReg(); assembly.AppendLine("copy " + reg2 + ", [" + mem_reg + "]"); //assembly.AppendLine(reg2 + " = [" + reg + "]"); assembly.AppendLine("sub " + reg2 + ", " + reg2 + ", " + expressao); assembly.AppendLine("copy " + mem_reg + ", " + reg2); //assembly.AppendLine(reg2 + " = " + reg2 + " + " + expressao); registradores.FreeDataRegister(reg2); registradores.FreeDataRegister(reg); return("[" + mem_reg + "]"); } else { assembly.AppendLine("add " + reg + ", " + indice_funcao + ", " + expressao); //assembly.AppendLine(reg + " = " + indice_funcao + " + " + expressao); assembly.AppendLine("sub " + reg + ", r31, " + reg); registradores.FreeDataRegister(reg); //assembly.AppendLine(reg + " = rm - " + reg); } } else { assembly.AppendLine("add " + reg + ", " + indice_global + ", " + expressao); //assembly.AppendLine(reg + " = " + indice_global + " + " + expressao); } assembly.AppendLine("copy " + mem_reg + ", " + reg); return(var_reg); }
public override object VisitVarvetor([NotNull] CminusParser.VarvetorContext context) { var ID = context.ID().GetText(); if (!Tabela.Declarado(ID, nivel)) { Console.WriteLine("Linha " + context.start.Line + ": Erro ao procurar a variável \'" + ID + "\'.\n\tVariável não declarada"); } VisitChildren(context); return(null); }