Exemplo n.º 1
0
    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;
    }
Exemplo n.º 2
0
        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;
        }
Exemplo n.º 3
0
        // Главная функция кодогенератора. Получает на вход синтаксическое дерево, обходит его и в хое его обхода с
        //     помощью библиотеки 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);
            }
        }
Exemplo n.º 4
0
 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;
 }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
 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>();
 }
Exemplo n.º 7
0
 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);
 }
Exemplo n.º 8
0
 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;
 }