/// <summary>
        /// 判断变量格式是否正确,并赋值给`variable`。
        ///     `isExist`: 指定变量在使用之前,是否存在。
        /// </summary>
        /// <param name="varStr"></param>
        /// <param name="isExist"></param>
        /// <param name="variable"></param>
        /// <param name="error"></param>
        /// <returns></returns>
        protected bool IsMatchVar(string varStr, bool isExist, ref string variable, out string error)
        {
            if (!RegexUtility.IsMatchVariable(varStr))
            {
                error = GetMatchVariableErrorString(varStr);
                return(false);
            }

            if (ScenarioBlackboard.Contains(varStr) != isExist)
            {
                error = GetVariableExistErrorString(varStr, !isExist);
                return(false);
            }

            variable = varStr;
            error    = null;
            return(true);
        }
Example #2
0
        public override bool ParseArgs(IScenarioContent content, ref VarArgs args, out string error)
        {
            // var a;
            // var b = 10;
            // var c = b;
            if (content.length != 2 && content.length != 4)
            {
                error = GetLengthErrorString(2, 4);
                return(false);
            }

            // 变量名只能包含数字,字母(中文),下划线,且不能以数字开头
            if (!RegexUtility.IsMatchVariable(content[1]))
            {
                error = GetMatchVariableErrorString(content[1]);
                return(false);
            }
            args.name = content[1];

            //// 你也可以使用这个方法,这里确保了变量必须不存在
            //if (!IsMatchVar(content[1], false, ref args.name, out error))
            //{
            //    return false;
            //}

            args.value = 0;

            if (content.length == 4)
            {
                if (content[2] != "=")
                {
                    error = GetMatchOperatorErrorString(content[2], "=");
                    return(false);
                }

                if (!ParseOrGetVarValue(content[3], ref args.value, out error))
                {
                    return(false);
                }
            }

            error = null;
            return(true);
        }
        /// <summary>
        /// 如果是数字,直接赋值;如果是变量,就获取变量
        /// </summary>
        /// <param name="numOrVar"></param>
        /// <param name="value"></param>
        /// <param name="error"></param>
        /// <returns></returns>
        protected bool ParseOrGetVarValue(string numOrVar, ref int value, out string error)
        {
            if (!int.TryParse(numOrVar, out value))
            {
                if (!RegexUtility.IsMatchVariable(numOrVar))
                {
                    error = GetMatchVariableErrorString(numOrVar);
                    return(false);
                }

                if (!ScenarioBlackboard.TryGet(numOrVar, out value))
                {
                    error = GetVariableExistErrorString(numOrVar, false);
                    return(false);
                }
            }

            error = null;
            return(true);
        }
Example #4
0
        public override bool ParseArgs(IScenarioContent content, ref MenuArgs args, out string error)
        {
            /// menu option
            ///     option0
            ///     option1
            ///     ...;
            if (content.length < 3)
            {
                error = GetLengthErrorString();
                return(false);
            }

            // 获取使用的变量
            if (!RegexUtility.IsMatchVariable(content[1]))
            {
                error = GetMatchVariableErrorString(content[1]);
                return(false);
            }
            args.menuName = content[1];

            TextInfoConfig config  = TextInfoConfig.Get <TextInfoConfig>();
            List <string>  options = new List <string>();
            int            index   = 2;

            while (index < content.length)
            {
                string line;
                if (content[index].StartsWith("\""))
                {
                    if (!ScenarioUtility.ParseContentString(content, ref index, out line, out error))
                    {
                        return(false);
                    }
                }
                else
                {
                    // 可能是个变量
                    int id = -1;
                    if (!ParseOrGetVarValue(content[index], ref id, out error))
                    {
                        return(false);
                    }

                    TextInfo info = config[id];
                    if (info == null)
                    {
                        error = string.Format(
                            "{0} ParseArgs error: text id `{1}` was not found.",
                            typeName,
                            content[index]);
                        return(false);
                    }

                    line = info.text;
                    index++;
                }
                options.Add(line);
            }
            args.options = options.ToArray();

            error = null;
            return(true);
        }