Example #1
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();
            }
        }
Example #2
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
        }
Example #3
0
        public static ASBinCode.RunTimeValueBase Eval(ASTool.AS3.AS3Expression expression,
                                                      Builder importBuilder = null
                                                      )
        {
            try
            {
                Builder builder = new Builder(new BuildOptions()
                {
                    isConsoleOut = false
                }, true);

                int bid = builder.getBlockId();

                if (importBuilder != null && importBuilder._currentImports.Count > 0)
                {
                    List <ASBinCode.rtti.Class> imps = new List <ASBinCode.rtti.Class>();
                    imps.AddRange(importBuilder._currentImports.Peek());

                    builder._currentImports.Push(imps);

                    bid = importBuilder.bin.blocks.Count;
                }

                CompileEnv tempEnv = new CompileEnv(new CodeBlock(bid, "temp", -65535, true), true);
                tempEnv.block.scope = new ASBinCode.scopes.StartUpBlockScope();
                builder.buildExpressNotEval(tempEnv, expression);

                tempEnv.completSteps(builder);
                tempEnv.block.totalStackSlots = tempEnv.combieNeedStackSlots();

                if (builder.buildErrors.Count == 0)
                {
                    RightValueBase value = builds.ExpressionBuilder.getRightValue(tempEnv, expression.Value, expression.token, builder);

                    if (player == null)
                    {
                        player = new ASRuntime.Player(null);
                    }
                    CSWC tempswc = new CSWC();
                    if (importBuilder != null)
                    {
                        tempswc.blocks.AddRange(importBuilder.bin.blocks);
                        tempswc.classes.AddRange(importBuilder.bin.classes);
                        tempswc.functions.AddRange(importBuilder.bin.functions);
                    }
                    tempswc.blocks.Add(tempEnv.block);

                    Variable variableResult = new Variable("@@", tempEnv.block.scope.members.Count, tempEnv.block.id);
                    tempEnv.block.scope.members.Add(variableResult);
                    OpStep step = new OpStep(OpCode.assigning, new SourceToken(0, 0, ""));
                    step.reg  = variableResult;
                    step.arg1 = value;
                    tempEnv.block.opSteps.Add(step);
                    tempEnv.block.instructions = tempEnv.block.opSteps.ToArray();
                    tempEnv.block.opSteps      = null;
                    player.loadCode(tempswc, tempEnv.block);

                    RunTimeValueBase result = player.run(variableResult);

                    return(result);
                    //IRunTimeScope scope = player.run();

                    //if (player.runtimeError ==null)
                    //{
                    //    return value.getValue(scope);
                    //}
                    //else
                    //{
                    //    return null;
                    //}
                }
                else
                {
                    return(null);
                }
            }
            catch (BuildException)
            {
                return(null);
            }
        }