Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }