public CodeGen(Stmt stmt, string moduleName) { if (IO.Path.GetFileName(moduleName) != moduleName) { throw new System.Exception("can only output into current directory!"); } Reflect.AssemblyName name = new Reflect.AssemblyName(IO.Path.GetFileNameWithoutExtension(moduleName)); Emit.AssemblyBuilder asmb = System.AppDomain.CurrentDomain.DefineDynamicAssembly(name, Emit.AssemblyBuilderAccess.Save); Emit.ModuleBuilder modb = asmb.DefineDynamicModule(moduleName); Emit.TypeBuilder typeBuilder = modb.DefineType("Foo"); Emit.MethodBuilder methb = typeBuilder.DefineMethod("Main", Reflect.MethodAttributes.Static, typeof(void), System.Type.EmptyTypes); // CodeGenerator this.il = methb.GetILGenerator(); this.symbolTable = new Collections.Dictionary<string, Emit.LocalBuilder>(); // Go Compile! this.GenStmt(stmt); il.Emit(Emit.OpCodes.Ret); typeBuilder.CreateType(); modb.CreateGlobalFunctions(); asmb.SetEntryPoint(methb); asmb.Save(moduleName); this.symbolTable = null; this.il = null; }
public CodeGen_AAAAAAAAAAAAAAAAAAAAA(MethodDeclaration methodDec, string moduleName, string _dllProbeDirectory) { if (IO.Path.GetFileName(moduleName) != moduleName) { throw new System.Exception("can only output into current directory!"); } this.dllProbeDirectory = _dllProbeDirectory; Reflect.AssemblyName name = new Reflect.AssemblyName(IO.Path.GetFileNameWithoutExtension(moduleName)); Emit.AssemblyBuilder asmb = System.AppDomain.CurrentDomain.DefineDynamicAssembly(name, Emit.AssemblyBuilderAccess.Save); Emit.ModuleBuilder modb = asmb.DefineDynamicModule(moduleName); Emit.TypeBuilder typeBuilder = modb.DefineType("Foo"); // Emit.MethodBuilder methb = typeBuilder.DefineMethod("Main", Reflect.MethodAttributes.Static, typeof(void), System.Type.EmptyTypes); // CodeGenerator // this.il = methb.GetILGenerator(); // this.symbolTable = new Collections.Dictionary<string, Emit.LocalBuilder>(); // Go Compile! // this.GenStmt(stmt); Emit.MethodBuilder methb = GenerateMethod(typeBuilder, methodDec); il.Emit(Emit.OpCodes.Ret); typeBuilder.CreateType(); modb.CreateGlobalFunctions(); asmb.SetEntryPoint(methb); asmb.Save(moduleName); this.symbolTable = null; this.il = null; }
// Главная функция кодогенератора. Получает на вход синтаксическое дерево, обходит его и в хое его обхода с // помощью библиотеки System.Reflection строит исполняемый файл на MSIL, который потом можно запускать вне компилятора (однако, на компьютере должна быть установлена .Net Framwork) // Путь к файлу задаётся в интерфейсе компилятора public bool Proceed(Node Tree, RichTextBox RTB, string FileName) { _Tree = Tree; _RTB = RTB; InitFileName(FileName); try { Reflect.AssemblyName Name = new Reflect.AssemblyName(FileName); AsmBuilder = System.AppDomain.CurrentDomain.DefineDynamicAssembly(Name, Emit.AssemblyBuilderAccess.Save); ModBuilder = AsmBuilder.DefineDynamicModule(FileName); TypeTable = new Collections.Dictionary <string, Emit.TypeBuilder>(); CreatedTypeTable = new Collections.Dictionary <string, System.Type>(); SymbolTable = new Collections.List <Collections.Dictionary <string, Emit.LocalBuilder> >(); BeforeCompile(Tree); CreateCode(Tree); AsmBuilder.Save(FileName); this.SymbolTable = null; this.AssemblerGenerator = null; this.TypeTable = null; File.Move(FileName, FileName + ".exe"); File.Delete(FileName); return(true); } catch (System.Exception Exc) { _RTB.Text = Exc.Message; return(false); } }
public MethodGen(Emit.TypeBuilder typeBuilder, Collections.Dictionary <string, Emit.FieldBuilder> typefieldList, string dllProbeDirectory, TypeGen parent) { this.typeBuilder = typeBuilder; this.dllProbeDirectory = dllProbeDirectory; this.typefieldList = typefieldList; this.parent = parent; }
private Emit.MethodBuilder GenerateMethod(Emit.MethodBuilder methb, MethodDeclaration method) { this.il = methb.GetILGenerator(); this.symbolTable = new Collections.Dictionary <string, Emit.LocalBuilder>(); this.parameterTable = new System.Collections.Generic.Dictionary <string, Type>(); //foreach (string arg in method.parameters) //{ // parameterTable[arg] = typeof(string); //} foreach (Collections.KeyValuePair <string, Type> para in method.parameters) { parameterTable[para.Key] = para.Value; } this.GenStmt(method.stmt); Collections.List <Type> args = new System.Collections.Generic.List <Type>(); foreach (Collections.KeyValuePair <string, Type> para in parameterTable) { args.Add(para.Value); } //foreach(string arg in method.parameters) //{ // args.Add(typeof(string)); //} methb.SetParameters(args.ToArray()); return(methb); }
public Parser(Token head) { this.head = head; cline = 0; _VARS = new System.Collections.Generic.Dictionary <string, string>(); _PIPES = new System.Collections.Generic.Dictionary <string, System.IO.StreamReader>(); }
private Emit.MethodBuilder GenerateMethod(Emit.TypeBuilder typeBuilder, MethodDeclaration method) { Emit.MethodBuilder methb = typeBuilder.DefineMethod(method.MethodName, Reflect.MethodAttributes.Static, typeof(void), System.Type.EmptyTypes); this.il = methb.GetILGenerator(); this.symbolTable = new Collections.Dictionary <string, Emit.LocalBuilder>(); this.GenStmt(method.stmt); return(methb); }
public CodeGen(Emit.MethodBuilder methb, MethodDeclaration methodDec, Collections.Dictionary <string, Emit.FieldBuilder> typefieldList, string _dllProbeDirectory, MethodGen _parent) { this.dllProbeDirectory = _dllProbeDirectory; this.typefieldList = typefieldList; this.parent = _parent; this.methb = methb; this.methodDec = methodDec; }