Example #1
0
        /// <summary>
        /// 評価
        /// </summary>
        /// <param name="node"></param>
        /// <param name="row">親テーブルの一行</param>
        /// <param name="tbl">テーブル</param>
        /// <returns></returns>
        static public int Compute(Node node, Dictionary <string, int> row = null, Dictionary <string, int> [] tbl = null)
        {
            var ans = 0;

            // 無効ノード
            if (node.Expression == null || node.Type == NodeType.None)
            {
                return(ans);
            }

            #region 特殊ケース
            // 関数処理
            if (node.Type == NodeType.Function)
            {
                if (node.Expression == "SUM")
                {
                    return(Node.sum(node.Left, tbl));
                }
                else
                if (node.Expression == "lt")
                {
                    return(Node.lt(node.Left, node.Right, row, tbl));
                }
                else
                if (node.Expression == "eq")
                {
                    return(Node.eq(node.Left, node.Right, row, tbl));
                }
                else
                if (node.Expression == "gt")
                {
                    return(Node.gt(node.Left, node.Right, row, tbl));
                }
                else
                if (node.Expression == "if")
                {
                    var nodes = GetArgumentNodes(node);
                    return(Node.iif(nodes, row, tbl));
                }
                else
                if (node.Expression == "and")
                {
                    var nodes = GetArgumentNodes(node);
                    return(Node.and(nodes, row, tbl));
                }
                else
                if (node.Expression == "or")
                {
                    var nodes = GetArgumentNodes(node);
                    return(Node.or(nodes, row, tbl));
                }
                else
                {
                    throw new Exception("この関数は実装されていません(" + node.Expression + ")");
                }
            }

            // 行中のカラム指定
            if (node.Type == NodeType.Item)
            {
                return(row[node.Expression]);
            }
            #endregion


            // 左要素の評価
            if (node.Left != null)
            {
                ans = Compute(node.Left, row);
            }

            // 演算子に応じて評価
            if (node.Expression == "-")
            {
                ans -= Compute(node.Right, row);
            }
            else if (node.Expression == "+")
            {
                ans += Compute(node.Right, row);
            }
            else if (node.Expression == "/")
            {
                if (node.Right == null)
                {
                    throw new Exception("除算ですが項が不足しています");
                }
                ans /= Compute(node.Right, row);
            }
            else if (node.Expression == "*")
            {
                if (node.Right == null)
                {
                    throw new Exception("乗算ですが項が不足しています");
                }
                ans *= Compute(node.Right, row);
            }
            else
            {
                ans = int.Parse(node.Expression);
            }
            return(ans);
        }