public object VisitProgramMAST(ProgramMAST v,object arg)
 {
     if (identificadores.retrieve(v.ident.ident.value)==null)
     {
         identificadores.open_scope();
         tipos.open_scope();
         arreglos.open_scope();
         identificadores.enter(v.ident.ident.value,"",null);
         if(v.metodos != null)
         {
             v.metodos.visit(this,(int)arg);
         }
     }
     else{
         errores_contextuales+="Error Contextual: El identificador \""+v.ident.ident+"\" ya ha sido utilizado.\n";
     }
     return null;
 }
        public object VisitProgramMAST(ProgramMAST v,object arg)
        {
            Type pointType = null;

            AppDomain currentDom = Thread.GetDomain();

            string asmFileName = "compilador.exe";

            AssemblyName myAsmName = new AssemblyName();
            myAsmName.Name = "Ensamblaje";

            AssemblyBuilder myAsmBldr = currentDom.DefineDynamicAssembly(
                myAsmName,
                AssemblyBuilderAccess.RunAndSave);

            modulo = myAsmBldr.DefineDynamicModule(asmFileName,asmFileName);

            TypeBuilder act = modulo.DefineType(v.ident.ident.value);
            Type objType = Type.GetType("System.Object");
            ConstructorInfo objCtor = objType.GetConstructor(new Type[0]);

            ConstructorBuilder pointCtor = act.DefineConstructor(
                                       MethodAttributes.Public,
                                      CallingConventions.Standard,
                                      null);

            ILGenerator ctorIL = pointCtor.GetILGenerator();
            ctorIL.Emit(OpCodes.Ldarg_0);
            ctorIL.Emit(OpCodes.Call, objCtor);
            ctorIL.Emit(OpCodes.Ret);

            MethodBuilder puntoEntrada=(MethodBuilder)v.metodos.visit(this,act);
            myAsmBldr.SetEntryPoint(puntoEntrada);

            pointType = act.CreateType();

            Console.WriteLine("Tipo Completado");

            myAsmBldr.Save(asmFileName);

            Console.WriteLine("Emsamblaje guardado con el nombre '{0}'.", asmFileName);

            return pointType;
        }
        public object VisitProgramMAST(ProgramMAST v,object arg)
        {
            int numaux = ((int)arg);
            printtab(numaux);
            resultado = resultado +"\n"+(v.GetType());

            if (v.metodos != null)
                v.metodos.visit(this,numaux+1);
            else{
                printtab(numaux+1);
                resultado = resultado +"\n"+("NULL");
            }
            return null;
        }