/// <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(); }
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; } } }
public TSAssembly(TScript script) { _script = script; _lexer = new TSLexer(); }