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; }