示例#1
0
文件: Calc.cs 项目: theta1220/sumi
        public static Value Execute(Block parentBlock, string source, System.Type type)
        {
            source = String.PoRemove(source, ' ');

            var splitedFormula = Split(source);

            // 単一項のときは関数か変数か配列か実数(実数はこのifでは処理されない)
            if (splitedFormula.Length == 1)
            {
                var formula = splitedFormula[0];

                // 配列
                if (formula.Length >= 2 && formula.First() == '[' && formula.Last() == ']')
                {
                    return(new Value("", ExecuteArray(parentBlock, formula)));
                }
                // 括弧
                else if (formula.Length >= 2 && formula.First() == '(' && formula.Last() == ')')
                {
                    return(Execute(parentBlock, formula.PoExtract('(', ')'), type));
                }
                // 関数
                else if (formula.Last() == ')')
                {
                    var caller = new Caller(parentBlock, formula);
                    caller.ForceExecute();
                    Log.Assert(caller.Function != null, "呼ぼうとした関数が見つかりませんでした:{0}->{1}", parentBlock.FullName, caller.Name);
                    return(new Value("", caller.Function.ReturnedValue));
                }
                // 変数
                else
                {
                    var value = parentBlock.FindValue(formula);
                    if (value != null)
                    {
                        return(value);
                    }
                }
            }
            // 括弧を計算
            source = ExecuteBracketCalc(parentBlock, source, type);

            if (source == "null")
            {
                return(new Value(""));
            }
            if (type == typeof(int))
            {
                return(new Value("", ExecuteCalcInt(parentBlock, source)));
            }
            if (type == typeof(bool))
            {
                return(new Value("", ExecuteCalcBool(parentBlock, source)));
            }
            if (type == typeof(string))
            {
                return(new Value("", ExecuteCalcString(parentBlock, source)));
            }

            Log.Error("理解できない計算式を演算しようとした:{0} / {1}", source, type.ToString());
            return(null);
        }