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