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