Пример #1
0
        public static FCodeLogic Tokenize(string fileName, string content)
        {
            FCodeLLex llex = new FCodeLLex(new StringLoadInfo(content));
            Dictionary <string, object> result = Tokenizing(llex);
            FCodeLogic logic = new FCodeLogic()
            {
                name = fileName
            };
            List <FCodeLuaFunction> functions = null;

            if (result.TryGetValue("functions", out var ot))
            {
                functions = (List <FCodeLuaFunction>)ot;
            }

            if (result.TryGetValue("line2Tokens", out var ol))
            {
                var line2Tokens = (Dictionary <int, List <Token> >)ol;
                var entry       = line2Tokens.FirstOrDefault(item => item.Value.Select(v => v.Original() == "logicList").Any());
                int startLine   = entry.Key;
                if (!result.TryGetValue("maxLine", out var endLine))
                {
                    endLine = startLine;
                    Error("Tokenizing中找不到返回值endLine 使用startLine作为endLine?");
                }
                ParseSingleLogic(line2Tokens, startLine, (int)endLine, ref functions, ref logic);

                // ** 找到有 vars 关键字 且 token 数量为2的行
                var enties = line2Tokens.Where(item => item.Value.Select(v => v.Original() == "vars").Any()).ToArray();
                entry = enties.FirstOrDefault(item => item.Value.Count == 2);
                if (entry.Value != null)
                {
                    startLine = entry.Key;
                    ParseVars(line2Tokens, startLine, (int)endLine, ref functions, ref logic);
                }
            }

            return(logic);
        }
Пример #2
0
        static void ParseVars(Dictionary <int, List <Token> > line2Tokens, int startLine, int endLine,
                              ref List <FCodeLuaFunction> functions, ref FCodeLogic logic)
        {
            FCodeWindow w = EditorWindow.GetWindow <FCodeWindow>();
            Dictionary <string, string> fcodeSignature = w.fcodeSignature;
            var isVarsStarted = false;

            for (int currentLine = startLine + 1; currentLine < endLine; currentLine++)
            {
                if (line2Tokens.TryGetValue(currentLine, out List <Token> lineContent))
                {
                    // ** 从签名开始处
                    if (!isVarsStarted)
                    {
                        isVarsStarted = ValidSignature(lineContent, fcodeSignature, "VarsStart");
                        continue;
                    }
                    else if (ValidSignature(lineContent, fcodeSignature, "VarsStart"))
                    {
                        Error("重复的FCodeSignature:Vars:Start签名??");
                    }
                    // ** 把签名中的所有函数都加到vars中
                    var f = functions?.Find(luaFunc => luaFunc.fileStartLine == currentLine);
                    if (f != null)
                    {
                        logic.vars.Add(f);
                    }

                    // ** 到签名结束
                    if (ValidSignature(lineContent, fcodeSignature, "VarsEnd"))
                    {
                        isVarsStarted = false;
                    }
                }
            }
        }
Пример #3
0
        static void ParseSingleLogic(Dictionary <int, List <Token> > line2Tokens, int startLine, int endLine, ref List <FCodeLuaFunction> functions, ref FCodeLogic logic)
        {
            FCodeWindow w = EditorWindow.GetWindow <FCodeWindow>();
            Dictionary <string, string> fcodeSignature = w.fcodeSignature;
            var              isSingleLogicStarted      = false;
            FCodeTiming      timing = 0;
            FCodeLuaFunction command = null, condition = null;

            for (int currentLine = startLine + 1; currentLine < endLine; currentLine++)
            {
                if (line2Tokens.TryGetValue(currentLine, out List <Token> lineContent))
                {
                    // ** 从签名开始处
                    if (!isSingleLogicStarted)
                    {
                        isSingleLogicStarted = ValidSignature(lineContent, fcodeSignature, "SingleLogicStart");
                        continue;
                    }
                    else if (ValidSignature(lineContent, fcodeSignature, "SingleLogicStart"))
                    {
                        Error("重复的FCodeSignature:SingleLogic:Start签名??");
                    }

                    // ** 从签名开始的下一行 直到签名结束的行内容都会在此处解析
                    var s = lineContent[0].Original();
                    switch (s)
                    {
                    case "timing":
                        var end = lineContent.Find(item => item.Original() == "FCodeTiming");
                        if (end != null)
                        {
                            var index = lineContent.IndexOf(end);
                            if (!Enum.TryParse(lineContent[index + 2].Original(), out timing))
                            {
                                Error($"解析FCodeTiming字符串出错 未定义的 {lineContent[index + 2].Original()}??");
                            }
                        }
                        else
                        {
                            Error("timing 字段中 未找到FCodeTiming关键字??");
                        }
                        break;

                    case "command":
                        command = functions?.Find(luaFunc => luaFunc.fileStartLine == currentLine);
                        break;

                    case "condition":
                        condition = functions?.Find(luaFunc => luaFunc.fileStartLine == currentLine);
                        break;
                    }

                    // ** 到签名结束
                    if (ValidSignature(lineContent, fcodeSignature, "SingleLogicEnd"))
                    {
                        isSingleLogicStarted = false;
                        var singleLogic = new FCodeLogic.SingleLogic(timing, command ?? GenFunction("command"), condition ?? GenFunction("condition"));
                        command   = null;
                        condition = null;
                        logic.logicList.Add(singleLogic);
                    }
                }
            }
        }