Ejemplo n.º 1
0
        static void Main(string[] args)
        {
            bool argloaded = false;
            bool receiveo  = false;

            string outputfile = null;

            List <string> srcpathList = new List <string>();

            string projpath = string.Empty;

            foreach (var arg in args)
            {
                //Console.WriteLine(arg);
                if (arg.StartsWith("-load-config+=") && arg.EndsWith(".xml"))
                {
                    string configpath = arg.Substring(14);

                    projpath = System.IO.Path.GetDirectoryName(System.IO.Path.GetDirectoryName(System.IO.Path.GetFullPath(configpath)));

                    System.Xml.Linq.XDocument document = System.Xml.Linq.XDocument.Load(configpath);
                    //***读取源代码类路径***

                    var srcpath = document.Descendants("source-path").First().Descendants("path-element").Select((o) => o.Value).ToArray();

                    foreach (var p in srcpath)
                    {
                        if (!p.Replace('\\', '/').EndsWith("FlashDevelop/Library/AS3/classes")

                            //&&
                            //!p.Replace('\\', '/').EndsWith("/as3_commapi/api")
                            //&&
                            //!p.Replace('\\', '/').EndsWith("/as3_commapi/sharpapi")
                            //&&
                            //!p.Replace('\\', '/').EndsWith("/as3_unityapi")
                            )
                        {
                            srcpathList.Add(System.IO.Path.GetFullPath(p));
                            Console.WriteLine("Add Source Path:" + System.IO.Path.GetFullPath(p));
                        }
                    }



                    argloaded = true;
                }
                else if (arg == "-o")
                {
                    receiveo = true;
                }
                else if (receiveo)
                {
                    receiveo   = false;
                    outputfile = arg;
                }
            }


            if (!argloaded)
            {
                Console.Error.WriteLine("Configuration file not found");

                Environment.Exit(1);

                return;
            }

            string libcswc;

            if (outputfile == null)
            {
                Console.Error.WriteLine("No output file configured");
                Environment.Exit(1);

                return;
            }

            libcswc =
                projpath + "/lib/as3unitylib.cswc";

            if (!System.IO.File.Exists(libcswc))
            {
                Console.Error.WriteLine("No as3unitylib.cswc found.Execute LinkCodeGenCLI.exe to generate the API and generate 'as3unitylib.cswc' to the following locations:" + libcswc);

                Environment.Exit(1);
            }
            HashSet <string> inlibclass = new HashSet <string>();

            {
                byte[] bin     = System.IO.File.ReadAllBytes(libcswc);
                var    library = ASBinCode.CSWC.loadFromBytes(bin);
                foreach (var item in library.classes)
                {
                    if (item.instanceClass == null)
                    {
                        if (string.IsNullOrEmpty(item.package))
                        {
                            inlibclass.Add(item.name + ".as");
                        }
                        else
                        {
                            inlibclass.Add((item.package.Replace('.', '/') + "/" + item.name + ".as"));
                        }
                    }
                }
            }



            ASTool.Grammar grammar     = ASCompiler.Grammar.getGrammar();
            string[]       files       = null;
            List <string>  loadedfiles = new List <string>();
            Dictionary <string, string> srcFileProjFile = new Dictionary <string, string>();

            foreach (var path_ in srcpathList)
            {
                string path = path_;
                path = path.Replace('\\', '/');
                string[] ps = path.Split('/');

                if (System.IO.Directory.Exists(path))
                {
                    files = System.IO.Directory.GetFiles(path, "*.as", System.IO.SearchOption.AllDirectories);

                    foreach (var item in files)
                    {
                        string projfile = item.Replace("\\", "/").Replace(path.Replace("\\", "/"), "");
                        if (projfile.StartsWith("/"))
                        {
                            projfile = projfile.Substring(1);
                        }

                        if (!inlibclass.Contains(projfile))
                        {
                            loadedfiles.Add(item);
                            srcFileProjFile.Add(item, projfile);

                            Console.WriteLine("load file: " + projfile);
                        }
                    }
                }
                else
                {
                    Console.Error.WriteLine("源码路径 " + path + " 没有找到.");

                    Environment.Exit(1);
                    return;
                }
            }


            Dictionary <string, string> fileFullPath = new Dictionary <string, string>();

            foreach (var item in srcFileProjFile)
            {
                if (!fileFullPath.ContainsKey(item.Value))
                {
                    fileFullPath.Add(item.Value, item.Key);
                }
                else
                {
                    Console.Error.WriteLine(item.Key + ":" + 1 + ":Error: " + "Duplicate compilation of file with same name");
                    Environment.Exit(1);

                    return;
                }
            }


            files = loadedfiles.ToArray();

            var proj   = new ASTool.AS3.AS3Proj();
            var srcout = new ASTool.ConSrcOut();

            for (int i = 0; i < files.Length; i++)
            {
                grammar.hasError = false;
                string teststring = System.IO.File.ReadAllText(files[i]);
                if (string.IsNullOrEmpty(teststring))
                {
                    continue;
                }

                var tree = grammar.ParseTree(teststring, ASTool.AS3LexKeywords.LEXKEYWORDS,
                                             ASTool.AS3LexKeywords.LEXSKIPBLANKWORDS,
                                             srcFileProjFile[files[i]],
                                             files[i].Replace('\\', '/')

                                             );

                //System.IO.File.WriteAllText("d:\\" + System.IO.Path.GetFileName(files[i]), tree.GetTreeString());

                if (grammar.hasError)
                {
                    //Console.WriteLine(files[i]);
                    //Console.WriteLine("解析语法树失败!");

                    Environment.Exit(1);

                    return;
                }
                var analyser = new ASTool.AS3FileGrammarAnalyser(proj, srcFileProjFile[files[i]]);
                if (!analyser.Analyse(tree))                 //生成项目的语法树
                {
                    Console.WriteLine(analyser.err.ToString());
                    //Console.WriteLine("语义分析失败!");

                    Environment.Exit(1);

                    return;
                }
            }

            ASCompiler.compiler.Builder builder = new ASCompiler.compiler.Builder();

            builder.LoadLibrary(System.IO.File.ReadAllBytes(libcswc));

            builder.options.CheckNativeFunctionSignature = false;
            builder.options.isConsoleOut = false;
            builder.Build(proj, null);

            if (builder.buildErrors.Count == 0)
            {
                ASBinCode.CSWC swc = builder.getBuildOutSWC();
                byte[]         bin = swc.toBytes();

                //string as3libfile = @"F:\AS3Hotfix_Unity\AS3Hotfix_U56\Assets\StreamingAssets\hotfix.cswc";

                System.IO.File.WriteAllBytes(
                    //as3libfile
                    outputfile
                    ,
                    bin);

                Console.WriteLine("Write to File" +
                                  //as3libfile
                                  outputfile
                                  + " total" + bin.Length + "bytes");


                return;
            }
            else
            {
                foreach (var err in builder.buildErrors)
                {
                    //Console.Error.WriteLine("file :" + err.srcFile);
                    //Console.Error.WriteLine("line :" + (err.line+1) + " ptr :" + (err.ptr+1));
                    //Console.Error.WriteLine(err.errorMsg);
                    Console.Error.WriteLine(fileFullPath[err.srcFile] + ":" + (err.line + 1) + ":Error: " + err.errorMsg);
                    //input = input.Replace(vbCrLf, vbLf)
                    //input = input.Replace(vbCr, vbLf)
                    //Dim lines = input.Split(vbLf)
                    Console.Error.WriteLine();
                }



                Environment.Exit(1);

                return;
            }
        }
Ejemplo n.º 2
0
        static void Main(string[] args)
        {
            bool dirseted = false;

            for (int i = 0; i < args.Length; i++)
            {
                if (args[i].StartsWith("config="))
                {
                    string tempconfig = args[i].Substring(7);
                    if (System.IO.File.Exists(tempconfig))
                    {
                        AppConfig.Change(System.IO.Path.GetFullPath(tempconfig));
                        System.Environment.CurrentDirectory = System.IO.Path.GetDirectoryName(System.IO.Path.GetFullPath(tempconfig));
                        dirseted = true;
                    }
                    else
                    {
                        Console.WriteLine("The specified config file does not exist:" + System.IO.Path.GetFullPath(tempconfig));
                        Environment.Exit(1);
                        return;
                    }
                }
            }
            if (!dirseted)
            {
                System.Environment.CurrentDirectory = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            }

            System.Configuration.AppSettingsReader appSettingsReader = new System.Configuration.AppSettingsReader();

            string outputcode               = (string)appSettingsReader.GetValue("combiedcodefile", typeof(string));
            string as3apipath               = (string)appSettingsReader.GetValue("as3apipath", typeof(string));
            string csharpcodepath           = (string)appSettingsReader.GetValue("csharpcodepath", typeof(string));
            string csharpcodenamespace      = (string)appSettingsReader.GetValue("csharpcodenamespace", typeof(string));
            string regfunctioncodenamespace = (string)appSettingsReader.GetValue("regfunctioncodenamespace", typeof(string));
            string regfunctioncode          = (string)appSettingsReader.GetValue("regfunctioncodefile", typeof(string));

            bool makemscorelib = (bool)appSettingsReader.GetValue("makemscorlib", typeof(bool));



            LinkCodeGen.Generator generator = new LinkCodeGen.Generator();

            {
                var           skipcreatortypes = (StringListSection)System.Configuration.ConfigurationManager.GetSection("skipcreatortypes");
                List <string> configs          = new List <string>();
                foreach (AssemblyElement ele in skipcreatortypes.Types)
                {
                    configs.Add(ele.StringValue);
                }
                generator.AddSkipCreateTypes(configs);
            }

            {
                var           notcreatenamespace = (StringListSection)System.Configuration.ConfigurationManager.GetSection("notcreatenamespace");
                List <string> configs            = new List <string>();
                foreach (AssemblyElement ele in notcreatenamespace.Types)
                {
                    configs.Add(ele.StringValue);
                }
                generator.AddNotCreateNameSpace(configs);


                generator.AddNotCreateNameSpace(new string[] {
                    "ASBinCode", "ASRuntime", csharpcodenamespace, regfunctioncodenamespace
                });
            }

            {
                var           notcreatetypes = (StringListSection)System.Configuration.ConfigurationManager.GetSection("notcreatetypes");
                List <string> configs        = new List <string>();
                foreach (AssemblyElement ele in notcreatetypes.Types)
                {
                    configs.Add(ele.StringValue);
                }
                generator.AddNotCreateTypes(configs);
            }
            {
                var           notcreatemembers = (StringListSection)System.Configuration.ConfigurationManager.GetSection("notcreatemembers");
                List <string> configs          = new List <string>();
                foreach (AssemblyElement ele in notcreatemembers.Types)
                {
                    configs.Add(ele.StringValue);
                }
                generator.AddNotCreateMember(configs);
            }



            string[] files = null;
            Dictionary <string, string> srcFileProjFile = new Dictionary <string, string>();

            string sdkpath = (string)appSettingsReader.GetValue("sdkpath", typeof(string));

            if (sdkpath == "auto")
            {
                sdkpath = System.IO.Path.GetDirectoryName(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
                Console.WriteLine("The SDK path is set to Automatic.");
            }


            if (System.IO.Directory.Exists(sdkpath))
            {
                if (System.IO.File.Exists(sdkpath + "/air-sdk-description.xml")
                    &&
                    System.IO.Directory.Exists(sdkpath + "/as3_commapi/sharpapi/")
                    )
                {
                    string sharpapi = System.IO.Path.GetFullPath(sdkpath + "/as3_commapi/sharpapi/");

                    var linkapi = System.IO.Directory.GetFiles(sharpapi, "*.as", System.IO.SearchOption.AllDirectories);

                    foreach (var item in linkapi)
                    {
                        string projfile = item.Replace("\\", "/").Replace(sharpapi.Replace("\\", "/"), "");
                        if (projfile.StartsWith("/"))
                        {
                            projfile = projfile.Substring(1);
                        }
                        srcFileProjFile.Add(item, projfile);
                    }

                    files = new string[linkapi.Length];
                    linkapi.CopyTo(files, 0);
                }
                else
                {
                    Console.WriteLine("Invalid SDK folder");
                    Console.WriteLine("Please specify the ASRuntimeSDK path");
                    Environment.Exit(1);
                    return;
                }
            }
            else
            {
                Console.WriteLine("SDK folder not found");
                Console.WriteLine("Please specify the ASRuntimeSDK path");
                Environment.Exit(1);
                return;
            }

            SDKPATH = sdkpath;

            outputcode      = replacePathVariable(outputcode);
            as3apipath      = replacePathVariable(as3apipath);
            csharpcodepath  = replacePathVariable(csharpcodepath);
            regfunctioncode = replacePathVariable(regfunctioncode);

            List <string> notexistdlls = new List <string>();

            //****加载dll***
            List <Type> types = new List <Type>();

            AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += CurrentDomain_ReflectionOnlyAssemblyResolve;
            if (makemscorelib)
            {
                //加入基础类型
                types.AddRange(typeof(object).Assembly.GetExportedTypes());
            }
            {
                var buildassemblys = (AssemblyListSection)System.Configuration.ConfigurationManager.GetSection("buildassemblys");
                foreach (AssemblyDefineElement asm in buildassemblys.Assemblys)
                {
                    string assembly = asm.StringValue;
                    string fullpath = System.IO.Path.GetFullPath(assembly);

                    m_rootAssembly = System.IO.Path.GetDirectoryName(fullpath);

                    try
                    {
                        if (!System.IO.File.Exists(fullpath))
                        {
                            notexistdlls.Add(fullpath);
                            continue;
                        }

                        var dll = System.Reflection.Assembly.ReflectionOnlyLoadFrom(fullpath);
                        if (!dictionaryAssemblyLoadPath.ContainsKey(dll.FullName))
                        {
                            dictionaryAssemblyLoadPath.Add(dll.FullName, fullpath);
                        }
                        List <string> definetypes = new List <string>();

                        List <string> definenamespaces = new List <string>();

                        foreach (AssemblyTypeElement type in asm.Types)
                        {
                            if (type.DefineType == "type")
                            {
                                definetypes.Add(type.StringValue);
                            }
                            else if (type.DefineType == "namespace")
                            {
                                definenamespaces.Add(type.StringValue);
                            }
                            else
                            {
                                Console.WriteLine("Export Type Configuration Error。'definetype' can only be 'type' or 'namespace'");

                                Environment.Exit(1);
                                return;
                            }
                        }

                        foreach (var type in dll.GetExportedTypes())
                        {
                            if (definetypes.Count == 0 && definenamespaces.Count == 0
                                //||
                                //definetypes.Contains(type.FullName)
                                )
                            {
                                types.Add(type);
                            }
                            else
                            {
                                if (definetypes.Contains(type.FullName))
                                {
                                    types.Add(type);
                                }
                                else if (definenamespaces.Contains(type.Namespace))
                                {
                                    types.Add(type);
                                }
                            }
                        }
                    }
                    catch (System.IO.FileLoadException e)
                    {
                        Console.WriteLine(e.ToString());

                        Console.WriteLine(System.IO.Path.GetFileName(fullpath) + "Load failed");
                        Environment.Exit(1);
                        return;
                    }
                    catch (System.BadImageFormatException e)
                    {
                        Console.WriteLine(e.ToString());

                        Console.WriteLine("A DLL that cannot be parsed may have been loaded.Please go to Unity's installation directory find the '/Editor/Data/Managed' Directory loading UnityEngine.dll, '/Editor/Data/UnityExtensions/Unity/GUISystem/' loading UnityEngine.UI.dll。");


                        //Console.WriteLine(System.IO.Path.GetFileName(fullpath) + "读取失败");
                        Environment.Exit(1);
                    }
                    catch (System.Reflection.ReflectionTypeLoadException e)
                    {
                        Console.WriteLine(e.ToString());
                        foreach (var l in e.LoaderExceptions)
                        {
                            Console.WriteLine(l.ToString());
                        }

                        //Console.WriteLine(System.IO.Path.GetFileName(fullpath) + "读取失败");
                        Environment.Exit(1);
                        return;
                    }
                    catch (FileNotFoundException e)
                    {
                        Console.WriteLine(e.ToString());
                        //Console.WriteLine(System.IO.Path.GetFileName(fullpath) + "读取失败");
                        Environment.Exit(1);
                        return;
                    }
                    catch (System.Security.SecurityException e)
                    {
                        Console.WriteLine(e.ToString());
                        //Console.WriteLine(System.IO.Path.GetFileName(fullpath) + "读取失败");
                        Environment.Exit(1);
                        return;
                    }
                }
            }


            generator.AddTypes(types);

            if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(System.IO.Path.GetFullPath(outputcode))))
            {
                System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(System.IO.Path.GetFullPath(outputcode)));
            }
            if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(System.IO.Path.GetFullPath(regfunctioncode))))
            {
                System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(System.IO.Path.GetFullPath(regfunctioncode)));
            }
            using (System.IO.FileStream fs = new System.IO.FileStream(outputcode, System.IO.FileMode.Create))
            {
                string regcode;
                generator.MakeCode(fs, as3apipath, csharpcodepath, csharpcodenamespace, regfunctioncodenamespace, System.IO.Path.GetDirectoryName(regfunctioncode), out regcode);
                System.IO.File.WriteAllText(regfunctioncode, regcode);
            }

            Console.WriteLine("====");

            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("now compiling");



            //编译刚生成的as3api.
            {
                string apidir = as3apipath;
                if (System.IO.Directory.Exists(apidir))
                {
                    var linkapi = System.IO.Directory.GetFiles(apidir, "*.as", System.IO.SearchOption.AllDirectories);

                    foreach (var item in linkapi)
                    {
                        string projfile = item.Replace("\\", "/").Replace(apidir.Replace("\\", "/"), "");
                        if (projfile.StartsWith("/"))
                        {
                            projfile = projfile.Substring(1);
                        }
                        srcFileProjFile.Add(item, projfile);
                    }

                    string[] n = new string[files.Length + linkapi.Length];
                    linkapi.CopyTo(n, 0);
                    files.CopyTo(n, linkapi.Length);
                    files = n;
                }
            }
            //***加入其他lib****
            {
                var           includelibcode = (StringListSection)System.Configuration.ConfigurationManager.GetSection("includelibcode");
                List <string> configs        = new List <string>();
                foreach (AssemblyElement ele in includelibcode.Types)
                {
                    configs.Add(replacePathVariable(ele.StringValue));
                }
                foreach (var apidir in configs)
                {
                    if (System.IO.Directory.Exists(apidir))
                    {
                        var linkapi = System.IO.Directory.GetFiles(apidir, "*.as", System.IO.SearchOption.AllDirectories);

                        foreach (var item in linkapi)
                        {
                            string projfile = item.Replace("\\", "/").Replace(apidir.Replace("\\", "/"), "");
                            if (projfile.StartsWith("/"))
                            {
                                projfile = projfile.Substring(1);
                            }
                            srcFileProjFile.Add(item, projfile);
                        }

                        string[] n = new string[files.Length + linkapi.Length];
                        linkapi.CopyTo(n, 0);
                        files.CopyTo(n, linkapi.Length);
                        files = n;
                    }
                }
            }



            //****开始编译lib*****
            ASTool.Grammar grammar = ASCompiler.Grammar.getGrammar();
            var            proj    = new ASTool.AS3.AS3Proj();
            var            srcout  = new ASTool.ConSrcOut();

            for (int i = 0; i < files.Length; i++)
            {
                grammar.hasError = false;
                var teststring = System.IO.File.ReadAllText(files[i]);
                if (string.IsNullOrEmpty(teststring))
                {
                    continue;
                }
                var tree = grammar.ParseTree(teststring, ASTool.AS3LexKeywords.LEXKEYWORDS,
                                             ASTool.AS3LexKeywords.LEXSKIPBLANKWORDS, srcFileProjFile[files[i]]);

                if (grammar.hasError)
                {
                    Console.WriteLine(files[i]);
                    Console.WriteLine("Parse Syntax tree failed!");

                    Environment.Exit(1);
                    return;
                }

                var analyser = new ASTool.AS3FileGrammarAnalyser(proj, srcFileProjFile[files[i]]);
                if (!analyser.Analyse(tree))                 //生成项目的语法树
                {
                    Console.WriteLine(analyser.err.ToString());
                    Console.WriteLine("Semantic analysis failed!");
                    Environment.Exit(1);
                    return;
                }
            }

            ASCompiler.compiler.Builder builder = new ASCompiler.compiler.Builder();

            builder.options.CheckNativeFunctionSignature = false;
            builder.Build(proj, null);

            if (builder.buildErrors.Count == 0)
            {
                ASBinCode.CSWC swc = builder.getBuildOutSWC();
                byte[]         bin = swc.toBytes();

                string as3libfile = (string)appSettingsReader.GetValue("as3libfile", typeof(string));
                System.IO.File.WriteAllBytes(as3libfile, bin);

                //ASBinCode.CSWC.loadFromBytes(bin);

                if (notexistdlls.Count > 0)
                {
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("The following DLL file is not found, please check");

                    foreach (var item in notexistdlls)
                    {
                        Console.WriteLine("\t" + item);
                    }
                }

                Console.ResetColor();
                Console.WriteLine("The work is done. Press any key to finish。");
                Console.ReadLine();
            }
            else
            {
                Environment.Exit(1);
            }
        }
Ejemplo n.º 3
0
        static void Main(string[] args)
        {
            ASTool.Grammar grammar = ASCompiler.Grammar.getGrammar();

            string teststring =
                @"package{
                    [Doc] //this is document class
                    class Main
                    {}
                }
                var a=1;
                var b=2;
                trace( a,'+',b,'=', a + b);
                ";


            var proj   = new ASTool.AS3.AS3Proj();
            var srcout = new ASTool.ConSrcOut();


            //build AST
            grammar.hasError = false;
            var tree = grammar.ParseTree(teststring, ASTool.AS3LexKeywords.LEXKEYWORDS,
                                         ASTool.AS3LexKeywords.LEXSKIPBLANKWORDS);

            if (grammar.hasError)
            {
                Console.WriteLine("解析语法树失败!");
                Console.ReadLine();
                return;
            }

            var analyser = new ASTool.AS3FileGrammarAnalyser(proj, "Main.cs");

            if (!analyser.Analyse(tree)) //生成项目的语法树
            {
                Console.WriteLine(analyser.err.ToString());
                Console.WriteLine("语义分析失败!");
                Console.ReadLine();
                return;
            }

            //build bytecode
            ASCompiler.compiler.Builder builder = new ASCompiler.compiler.Builder();

            builder.options.CheckNativeFunctionSignature = false;
            builder.Build(proj, null);

            if (builder.buildErrors.Count == 0)
            {
                ASBinCode.CSWC swc = builder.getBuildOutSWC();

                //save bytecode
                byte[] bin = swc.toBytes();
                swc = ASBinCode.CSWC.loadFromBytes(bin);

                if (swc.blocks.Count > 0)
                {
                    ASRuntime.Player player = new ASRuntime.Player();
                    //load bytecode
                    player.loadCode(swc);


                    Console.WriteLine();
                    Console.WriteLine("========");

                    player.run(null);
                }
                Console.ReadLine();
            }
        }
Ejemplo n.º 4
0
        static void Main(string[] args)
        {
            //{
            //	ASRuntime.Player player = new ASRuntime.Player();

            //	byte[] bytecode = System.IO.File.ReadAllBytes("../Debug/as3unitylib.cswc");
            //	ASBinCode.CSWC swc2 = ASBinCode.CSWC.loadFromBytes(bytecode);
            //	ASRuntime.nativefuncs.BuildInFunctionLoader.loadBuildInFunctions(swc2);
            //	(new extFunctions()).registrationFunction(swc2);

            //	player.loadCode(swc2);

            //	player.run(null);
            //	return;
            //}



            //ASCompiler.compiler.Builder bu = new ASCompiler.compiler.Builder();
            //byte[] b = bu.BuildLibBin();
            //System.IO.File.WriteAllBytes("astoolglobal.swc", b);
            ASTool.Grammar grammar = ASCompiler.Grammar.getGrammar();

            //string teststring = "package{}var a:String = \"first\";var b:String = \"First\"; var c=a==b;";
            string teststring = "package{}";//System.IO.File.ReadAllText("../../testScript/AS3Testproj/src/Main.as");

            string[] files = null;

            Dictionary <string, string> srcFileProjFile = new Dictionary <string, string>();

            if (args.Length > 0)
            {
                string path = args[0]; //path = @"F:\ASTool\ASCTest\bin\Release\tests\2_managed_array\";
                //path = @"F:\ASTool\ASCTest\testScript\AS3Testproj\src\";
                //path = @"E:\Manju-pc\as3protobuf\AS3ProtoBuf\src";
                path = @"E:\Manju-pc\as3protobuf\AS3ProtoBuf\protobuflib";
                //path = @"../..\testScript\AS3Testproj\amd";
                //path = @"../..\testScript\AS3Testproj\src";



                if (path.EndsWith(".as"))
                {
                    path = System.IO.Path.GetDirectoryName(path);
                }

                if (string.IsNullOrEmpty(path))
                {
                    path = ".\\";
                }

                //path = "";
                //files =new string[] { "E:/Manju-pc/as3protobuf/AS3ProtoBuf/src/com/netease/protobuf/Message.as" };

                path = path.Replace('\\', '/');
                string[] ps = path.Split('/');
                if (ps.Length == 2 && string.IsNullOrEmpty(ps[1]) && ps[0].IndexOf(System.IO.Path.VolumeSeparatorChar) > 0)
                {
                    Console.WriteLine("无法在根目录下搜索.请将as源代码放到一个文件夹内");
                    return;
                }
                else if (System.IO.Directory.Exists(path))
                {
                    //Console.WriteLine(path);
                    //teststring = System.IO.File.ReadAllText(args[0]);
                    files = System.IO.Directory.GetFiles(path, "*.as", System.IO.SearchOption.AllDirectories);

                    foreach (var item in files)
                    {
                        string projfile = item.Replace("\\", "/").Replace(path.Replace("\\", "/"), "");
                        if (projfile.StartsWith("/"))
                        {
                            projfile = projfile.Substring(1);
                        }
                        srcFileProjFile.Add(item, projfile);
                    }
                }
            }
            else
            {
                Console.Write("输入as文件所在路径");
                return;
            }

            if (files == null)
            {
                Console.Write("输入as文件所在路径");
                return;
            }


            //*********加入API*****
            //{
            //	string apidir = @"../../..\LinkCodeGenCLI\bin\Debug\as3api";
            //	if (System.IO.Directory.Exists(apidir))
            //	{
            //		var linkapi = System.IO.Directory.GetFiles(apidir, "*.as", System.IO.SearchOption.AllDirectories);

            //		foreach (var item in linkapi)
            //		{
            //			string projfile = item.Replace("\\", "/").Replace(apidir.Replace("\\", "/"), "");
            //			if (projfile.StartsWith("/"))
            //				projfile = projfile.Substring(1);
            //			srcFileProjFile.Add(item, projfile);
            //		}

            //		string[] n = new string[files.Length + linkapi.Length];
            //		linkapi.CopyTo(n, 0);
            //		files.CopyTo(n, linkapi.Length);
            //		files = n;
            //	}
            //}
            //{
            //	string apidir = @"..\..\..\as3_commapi\sharpapi";
            //	if (System.IO.Directory.Exists(apidir))
            //	{
            //		var linkapi = System.IO.Directory.GetFiles(apidir, "*.as", System.IO.SearchOption.AllDirectories);

            //		foreach (var item in linkapi)
            //		{
            //			string projfile = item.Replace("\\", "/").Replace(apidir.Replace("\\", "/"), "");
            //			if (projfile.StartsWith("/"))
            //				projfile = projfile.Substring(1);
            //			srcFileProjFile.Add(item, projfile);
            //		}

            //		string[] n = new string[files.Length + linkapi.Length];
            //		linkapi.CopyTo(n, 0);
            //		files.CopyTo(n, linkapi.Length);
            //		files = n;
            //	}
            //}
            //*********************

            //*********加入ProtoBuf API*****
            //string apidir = @"E:\Manju-pc\as3protobuf\AS3ProtoBuf\protobuflib";
            //if (System.IO.Directory.Exists(apidir))
            //{
            //	var linkapi = System.IO.Directory.GetFiles(apidir, "*.as", System.IO.SearchOption.AllDirectories);
            //	foreach (var item in linkapi)
            //	{
            //		string projfile = item.Replace("\\", "/").Replace(apidir.Replace("\\", "/"), "");
            //		if (projfile.StartsWith("/"))
            //			projfile = projfile.Substring(1);
            //		srcFileProjFile.Add(item, projfile);
            //	}


            //	string[] n = new string[files.Length + linkapi.Length];
            //	linkapi.CopyTo(n, 0);
            //	files.CopyTo(n, linkapi.Length);
            //	files = n;
            //}
            //*********************

            var proj   = new ASTool.AS3.AS3Proj();
            var srcout = new ASTool.ConSrcOut();

            for (int i = 0; i < files.Length; i++)
            {
                grammar.hasError = false;
                teststring       = System.IO.File.ReadAllText(files[i]);
                if (string.IsNullOrEmpty(teststring))
                {
                    continue;
                }



                var tree = grammar.ParseTree(teststring, ASTool.AS3LexKeywords.LEXKEYWORDS,
                                             ASTool.AS3LexKeywords.LEXSKIPBLANKWORDS, srcFileProjFile[files[i]]);

                //System.IO.File.WriteAllText("d:\\" + System.IO.Path.GetFileName(files[i]), tree.GetTreeString());

                if (grammar.hasError)
                {
                    Console.WriteLine(files[i]);
                    Console.WriteLine("解析语法树失败!");
                    Console.ReadLine();
                    return;
                }



                var analyser = new ASTool.AS3FileGrammarAnalyser(proj, srcFileProjFile[files[i]]);
                if (!analyser.Analyse(tree))  //生成项目的语法树
                {
                    Console.WriteLine(analyser.err.ToString());
                    Console.WriteLine("语义分析失败!");
                    Console.ReadLine();
                    return;
                }
#if DEBUG
                //Console.Clear();
#endif
            }

#if DEBUG
            Console.WriteLine();
            Console.WriteLine("====语法树翻译====");

            //runtimeCompiler rtLoader = new runtimeCompiler();
            foreach (var p in proj.SrcFiles)
            {
                p.Write(0, srcout);
            }
#endif
            //Console.Read();
            //return;
            ASCompiler.compiler.Builder builder = new ASCompiler.compiler.Builder();
            //builder.LoadLibrary( System.IO.File.ReadAllBytes("as3protobuf.swc") );

            //builder.LoadLibrary(System.IO.File.ReadAllBytes("F:/ASTool/LinkCodeGenCLI/bin/Debug/as3unitylib.cswc"));

            //builder.LoadLibrary(System.IO.File.ReadAllBytes("astoolglobal.swc"));
            //builder.Build(proj, new ASBinCode.INativeFunctionRegister[] { new extFunctions() } );

            builder.options.CheckNativeFunctionSignature = false;
            builder.Build(proj, null);

            if (builder.buildErrors.Count == 0)
            {
                ASBinCode.CSWC swc = builder.getBuildOutSWC();

                byte[] bin = swc.toBytes();



                swc = ASBinCode.CSWC.loadFromBytes(bin);
                ASRuntime.nativefuncs.BuildInFunctionLoader.loadBuildInFunctions(swc);
                (new extFunctions()).registrationAllFunction(swc);

                //System.IO.File.WriteAllBytes("astoolglobal.swc", swc.toBytes());
                System.IO.File.WriteAllBytes("as3protobuf.swc", swc.toBytes());
                //System.IO.File.WriteAllBytes("as3test.cswc", swc.toBytes());
                //System.IO.File.WriteAllBytes("as3unitylib.cswc", swc.toBytes());

                if (swc != null)
                {
#if DEBUG
                    for (int i = 0; i < swc.blocks.Count; i++)
                    {
                        var block = swc.blocks[i];
                        if (block != null && block.name.EndsWith("::Main"))                        // "CRC32::update"))
                        {
                            Console.WriteLine();
                            Console.WriteLine("====操作指令 block " + block.name + " " + block.id + "====");
                            Console.WriteLine();
                            Console.WriteLine("total registers:" + block.totalStackSlots);
                            Console.WriteLine(block.GetInstruction());
                        }
                    }
#endif

                    if (swc.blocks.Count > 0)
                    {
                        ASRuntime.Player player = new ASRuntime.Player();
                        player.loadCode(swc);

                        //byte[] bytecode = System.IO.File.ReadAllBytes("as3test.cswc");
                        //ASBinCode.CSWC swc2 = ASBinCode.CSWC.loadFromBytes(bytecode);
                        //ASRuntime.nativefuncs.BuildInFunctionLoader.loadBuildInFunctions(swc2);

                        //player.loadCode(swc2);



                        //var d = player.createInstance("SProtoSpace.group_area_info");
                        //uint len = (uint)player.getMemberValue(d, "groupids.length");
                        //player.setMemberValue(d, "groupids.length", 3);
                        //player.setMemberValue(d, "areaGroupName", null);

                        //for (int i = 0; i < 3; i++)
                        //{
                        //	player.setMemberValue(d, "groupids", i + 5, i);
                        //}

                        ////var d = player.createInstance("SProtoSpace.role_base_info");
                        //ASRuntime.flash.utils.ByteArray array;
                        //var byteArray = player.createByteArrayObject(out array);
                        ////player.setMemberValue(d, "groupName", "账号你二大爷");



                        //var r = player.invokeMethod(d, "writeTo", byteArray);
                        //var d2 = player.createInstance("SProtoSpace.group_area_info");

                        //player.setMemberValue(byteArray, "position", 0);
                        //var k = player.invokeMethod(d2, "mergeFrom", byteArray);
                        //var m = player.getMemberValue(d2, "groupids.length");

                        //var ts = player.invokeMethod(byteArray, "toString");

                        //var messageUnion = player.getMemberValue("SProtoSpace.base_msg_id", "name_check_ack_id");

                        //try
                        //{
                        //	player.setMemberValue("SProtoSpace.base_msg_id", "name_check_ack_id", 5);
                        //}
                        //catch (ASBinCode.ASRunTimeException e)
                        //{
                        //	Console.WriteLine(e.ToString());
                        //}

                        //var s = player.invokeMethod("Test", "TTT", 3, 4);

                        //***zip***
                        //ASRuntime.flash.utils.ByteArray array;
                        //var byteArray = player.createByteArrayObject(out array);

                        //var bytes = System.IO.File.ReadAllBytes(@"F:/code/Protobuf-as3-ILRuntime-master.zip");
                        //////var bytes = System.IO.File.ReadAllBytes(@"F:/3STOOGES.zip");
                        //array.writeBytes(bytes, 0, bytes.Length);
                        //array.position = 0;

                        //player.invokeMethod("Main", "showzip", byteArray);
                        ////var by = player.invokeMethod("Main", "saveZip", byteArray);
                        ////System.IO.File.WriteAllBytes("e:/kkk.zip", array.ToArray());


                        Console.WriteLine();
                        Console.WriteLine("====程序输出====");

                        player.run(null);
                    }
                    Console.WriteLine();
                }
            }

#if DEBUG
            Console.WriteLine("按任意键结束");
            Console.ReadLine();
#endif
        }
Ejemplo n.º 5
0
        static void Main(string[] args)
        {
            //-- 分析命令行参数
            var options = new Options();
            var parser  = new CommandLine.Parser(with => with.HelpWriter = Console.Error);

            if (!parser.ParseArgumentsStrict(args, options, () => Environment.Exit(-1)))
            {
                //-- 执行导出操作
                return;
            }


            string outputcsfile = options.OutPutCSFile;            //@"../../../../HotFixProto/proto.cs";

            string outputswcfile = options.OutPutCSWC;             //@"../../../../AS3ProtoBuf_Unity/Assets/StreamingAssets/proto.cswc";

            ASTool.Grammar grammar = ASCompiler.Grammar.getGrammar();

            string teststring = "package{}";

            Dictionary <string, string> srcFiles = new Dictionary <string, string>();

            string[] protofiles = null;


            {
                string path = options.ProtoAS3;

                if (path.EndsWith(".as"))
                {
                    path = System.IO.Path.GetDirectoryName(path);
                }

                if (string.IsNullOrEmpty(path))
                {
                    path = ".\\";
                }

                string[] ps = path.Split(System.IO.Path.DirectorySeparatorChar);
                if (ps.Length == 2 && string.IsNullOrEmpty(ps[1]) && ps[0].IndexOf(System.IO.Path.VolumeSeparatorChar) > 0)
                {
                    Console.WriteLine("无法在根目录下搜索.请将as源代码放到一个文件夹内");
                    return;
                }
                else if (System.IO.Directory.Exists(path))
                {
                    //Console.WriteLine(path);
                    //teststring = System.IO.File.ReadAllText(args[0]);
                    //files = System.IO.Directory.GetFiles(path, "*.as", System.IO.SearchOption.AllDirectories);

                    AddSrcFiles(path, srcFiles);
                    protofiles = new string[srcFiles.Count];
                    srcFiles.Keys.CopyTo(protofiles, 0);                     //(string[])files.Clone();
                }
            }


            if (srcFiles.Count == 0)
            {
                Console.Write("输入as文件所在路径");
                return;
            }

            //*********加入ProtoBuf API*****
            //string apidir = @"../../../../as3protobuflib";
            //if (System.IO.Directory.Exists(apidir))
            //{
            //	AddSrcFiles(apidir, srcFiles);
            //}
            //*********************

            var proj   = new ASTool.AS3.AS3Proj();
            var srcout = new ASTool.ConSrcOut();

            foreach (var src in srcFiles)
            {
                grammar.hasError = false;
                teststring       = System.IO.File.ReadAllText(src.Key);
                if (string.IsNullOrEmpty(teststring))
                {
                    continue;
                }

                teststring = teststring.Replace("override com.netease.protobuf.used_by_generated_code final function", "override protected final function");

                var tree = grammar.ParseTree(teststring, ASTool.AS3LexKeywords.LEXKEYWORDS,
                                             ASTool.AS3LexKeywords.LEXSKIPBLANKWORDS, src.Value);

                if (grammar.hasError)
                {
                    Console.WriteLine(src.Key);
                    Console.WriteLine("解析语法树失败!");
                    Console.ReadLine();
                    return;
                }



                var analyser = new ASTool.AS3FileGrammarAnalyser(proj, src.Value);
                if (!analyser.Analyse(tree))                 //生成项目的语法树
                {
                    Console.WriteLine(analyser.err.ToString());
                    Console.WriteLine("语义分析失败!");
                    Console.ReadLine();
                    return;
                }
#if DEBUG
                //Console.Clear();
#endif
            }

#if DEBUG
            Console.WriteLine();
            Console.WriteLine("====语法树翻译====");

            //runtimeCompiler rtLoader = new runtimeCompiler();
            foreach (var p in proj.SrcFiles)
            {
                p.Write(0, srcout);
            }
#endif
            //Console.Read();
            //return;
            ASCompiler.compiler.Builder builder = new ASCompiler.compiler.Builder();
            builder.LoadLibrary(System.IO.File.ReadAllBytes("as3protobuf.swc"));
            //builder.LoadLibrary( System.IO.File.ReadAllBytes("astoolglobal.swc"));

            builder.Build(proj, null);


            if (builder.buildErrors.Count == 0)
            {
                ASBinCode.CSWC swc = builder.getBuildOutSWC();
                //System.IO.File.WriteAllBytes("astoolglobal.swc", swc.toBytes());
                //System.IO.File.WriteAllBytes("as3protobuf.swc", swc.toBytes());
                System.IO.File.WriteAllBytes(outputswcfile, swc.toBytes());

                if (swc != null)
                {
                    ASRuntime.Player player = new ASRuntime.Player();
                    player.loadCode(swc);

                    StringBuilder stringBuilder = new StringBuilder();
                    stringBuilder.AppendLine("using System;");

                    foreach (var cls in swc.classes)
                    {
                        if (cls.staticClass != null)
                        {
                            //判断是否在编译路径中
                            string fullname = cls.package + (string.IsNullOrEmpty(cls.package)?"":  ".") + cls.name + ".as";
                            foreach (var f in protofiles)
                            {
                                string ff = f.Replace("\\", ".").Replace("/", ".");
                                if (ff.EndsWith(fullname))
                                {
                                    CodeGen codeGen = new CodeGen(cls, swc, player);

                                    string cs = codeGen.GetCode();

                                    Console.Write(cs);
                                    stringBuilder.AppendLine(cs);

                                    break;
                                }
                            }
                        }
                    }

                    System.IO.File.WriteAllText(outputcsfile, stringBuilder.ToString());
                }
            }
        }