/// <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); }