Exemplo n.º 1
0
        /// <summary>
        /// 编译代码
        /// </summary>
        /// <param name="code">代码字节</param>
        public void CompileCode(TSLexer lexer, string code)
        {
            //编译步骤
            //第一步:词法分析
            TokenData tokenData = lexer.GetTokens(code, this.PackageName);
            //第二部:词法解释器,根据上下文无关文法(例如BNF巴科斯范式)生成抽象语法树
            TSParser parser = new TSParser(tokenData);

            parser.Parse();
        }
Exemplo n.º 2
0
        void Start()
        {
            if (MissionPath.Length == 0)
            {
                return;
            }

            TSLexer  lexer  = new TSLexer(new AntlrFileStream(Path.Combine(Application.streamingAssetsPath, MissionPath)));
            TSParser parser = new TSParser(new CommonTokenStream(lexer));
            var      file   = parser.start();

            if (parser.NumberOfSyntaxErrors > 0)
            {
                Debug.LogError("Could not parse!");
                return;
            }

            MissionObjects = new List <TSObject>();

            foreach (var decl in file.decl())
            {
                var objectDecl = decl.stmt()?.expression_stmt()?.stmt_expr()?.object_decl();
                if (objectDecl == null)
                {
                    continue;
                }

                if (MissionObjects.Count > 0)
                {
                    Debug.Log("Mission with two mission groups?");
                }

                MissionObjects.Add(ProcessObject(objectDecl));
            }

            if (MissionObjects.Count <= 0)
            {
                return;
            }

            var mis = MissionObjects[0];

            foreach (var obj in mis.RecursiveChildren())
            {
                if (obj.ClassName == "InteriorInstance")
                {
                    var gobj = Instantiate(InteriorPrefab, transform, false);

                    var positionParts = ParseVectorString(obj.GetField("position"));
                    var position      = ConvertPoint(positionParts);

                    var rotationParts = ParseVectorString(obj.GetField("rotation"));
                    var rotation      = ConvertRotation(rotationParts);

                    var scaleParts = ParseVectorString(obj.GetField("scale"));
                    var scale      = ConvertScale(scaleParts);

                    gobj.transform.localPosition = position;
                    gobj.transform.localRotation = rotation;
                    gobj.transform.localScale    = scale;

                    var difPath = ResolvePath(obj.GetField("interiorFile"), MissionPath);
                    gobj.GetComponent <Dif>().filePath = difPath;
                    gobj.GetComponent <Dif>().GenerateMesh();

                    GlobalMarble.GetComponent <Movement>().AddMesh(gobj.GetComponent <MeshCollider>());
                }

                if (obj.ClassName == "StaticShape" && obj.GetField("dataBlock") == "StartPad")
                {
                    var positionParts = ParseVectorString(obj.GetField("position"));
                    var position      = ConvertPoint(positionParts);

                    var rotationParts = ParseVectorString(obj.GetField("rotation"));
                    var rotation      = ConvertRotation(rotationParts);

                    var spawnPoint = position + rotation * new Vector3(0, 0, 3);

                    GlobalMarble.transform.localPosition            = spawnPoint;
                    GlobalMarble.GetComponent <Marble>().StartPoint = spawnPoint;

                    var skybox = Instantiate(SkyboxPrefab, transform, false);
                    skybox.transform.localPosition = spawnPoint;
                }
            }
        }
Exemplo n.º 3
0
 public TSAssembly(TScript script)
 {
     _script = script;
     _lexer  = new TSLexer();
 }