Exemplo n.º 1
0
        public int 条件_less(string expression)
        {
            var node = new Node(expression);

            node.Parse();
            return(Node.Compute(node));
        }
Exemplo n.º 2
0
        public int 計算_if(string expression)
        {
            var row = new Dictionary <string, int>()
            {
                { "X", 4 }, { "Y", 2 }
            };
            var tbl = new[]
            {
                new Dictionary <string, int>()
                {
                    { "A", 1 }, { "B", 3 }
                },
                new Dictionary <string, int>()
                {
                    { "A", 2 }, { "B", 6 }
                },
                new Dictionary <string, int>()
                {
                    { "A", 3 }, { "B", 7 }
                },
            };

            var node = new Node(expression);

            node.Parse();
            return(Node.Compute(node, row, tbl));
        }
Exemplo n.º 3
0
        public int 計算_カラム(string expression)
        {
            var row = new Dictionary <string, int>()
            {
                { "A", 1 }, { "B", 2 }
            };
            var tbl = new[]
            {
                new Dictionary <string, int>()
                {
                    { "A", 1 }
                },
                new Dictionary <string, int>()
                {
                    { "A", 2 }
                },
                new Dictionary <string, int>()
                {
                    { "A", 3 }
                },
            };

            var node = new Node(expression);

            node.Parse();
            var ans = Node.Compute(node, row, tbl);

            return(ans);
        }
Exemplo n.º 4
0
        public void parse_1項_1()
        {
            var node = new Node("2");

            node.Parse();
            Assert.True(node.Expression == "2");
            Assert.True(node.Type == NodeType.Constant);
            return;
        }
Exemplo n.º 5
0
        public void parse_1項_3()
        {
            var node = new Node("-2");

            node.Parse();
            Assert.True(node.Expression == "-");
            Assert.True(node.Right.Expression == "2");
            return;
        }
Exemplo n.º 6
0
        public int 計算(string expression)
        {
            var node = new Node(expression);

            node.Parse();
            //var ans = node.Compute();
            var ans = Node.Compute(node);

            return(ans);
        }
Exemplo n.º 7
0
        public void parse_1項_2()
        {
            var node = new Node("+2");

            node.Parse();
            Assert.True(node.Expression == "+");
            Assert.True(node.Type == NodeType.Operator);
            Assert.True(node.Right.Expression == "2");
            return;
        }
Exemplo n.º 8
0
        public void parse_関数_2項()
        {
            var node = new Node("SUM(2,3)");

            node.Parse();
            Assert.True(node.Expression == "SUM");
            Assert.True(node.Type == NodeType.Function);
            Assert.True(node.Left.Expression == "2");
            Assert.True(node.Right.Expression == "3");
        }
Exemplo n.º 9
0
        public void parse_関数_1項_1()
        {
            var node = new Node("SUM(2)");

            node.Parse();
            {
                Assert.True(node.Left.Expression == "2");
            }
            Assert.True(node.Expression == "SUM");
            Assert.True(node.Right == null);

            return;
        }
Exemplo n.º 10
0
        public void parse_3項カッコあり()
        {
            var node = new Node("(2+3+4)");

            node.Parse();
            Assert.True(node.Left.Expression == "2");
            Assert.True(node.Expression == "+");

            Assert.True(node.Right.Left.Expression == "3");
            Assert.True(node.Right.Expression == "+");
            Assert.True(node.Right.Right.Expression == "4");
            return;
        }
Exemplo n.º 11
0
        public void parse_関数_1項_2()
        {
            var node = new Node("SUM(-2)");

            node.Parse();
            Assert.True(node.Expression == "SUM");
            Assert.True(node.Type == NodeType.Function);
            Assert.True(node.Left.Expression == "-");
            {
                Assert.True(node.Left.Left == null);
                Assert.True(node.Left.Right.Expression == "2");
            }
            Assert.True(node.Right == null);
        }
Exemplo n.º 12
0
        public void parse_関数_1項_2()
        {
            var node = new Node("SUM(-2)");

            node.Parse();
            Assert.True(node.Expression     == "SUM");
            Assert.True(node.Type           == NodeType.Function);
            Assert.True(node.Left.Expression    == "-");
            {
                Assert.True(node.Left.Left              == null);
                Assert.True(node.Left.Right.Expression  == "2");
            }
            Assert.True(node.Right              == null);
        }
Exemplo n.º 13
0
        public void parse_関数_1項_1()
        {
            var node = new Node("SUM(2)");

            node.Parse();
            {
                Assert.True(node.Left.Expression       == "2");

            }
            Assert.True(node.Expression             == "SUM");
            Assert.True(node.Right                  == null);

            return;
        }
Exemplo n.º 14
0
        public void parse_2項変数()
        {
            var node = new Node("2+abc");

            node.Parse();

            Assert.True(node.Left.Expression    == "2");
            Assert.True(node.Left.Type == NodeType.Constant);

            Assert.True(node.Expression         == "+");
            Assert.True(node.Type               == NodeType.Operator);

            Assert.True(node.Right.Expression   == "abc");
            Assert.True(node.Right.Type         == NodeType.Item);
            return;
        }
Exemplo n.º 15
0
        public void parse_2項変数()
        {
            var node = new Node("2+abc");

            node.Parse();

            Assert.True(node.Left.Expression == "2");
            Assert.True(node.Left.Type == NodeType.Constant);

            Assert.True(node.Expression == "+");
            Assert.True(node.Type == NodeType.Operator);

            Assert.True(node.Right.Expression == "abc");
            Assert.True(node.Right.Type == NodeType.Item);
            return;
        }
Exemplo n.º 16
0
        public void parse_関数引数取得1()
        {
            var node = new Node("SUM(2,3+4,5)");

            node.Parse();
            var nodes = Node.GetArgumentNodes(node);

            Assert.True(nodes [0].Type == NodeType.Constant);
            Assert.True(nodes [0].Expression == "2");
            Assert.True(nodes [1].Type == NodeType.Operator);
            Assert.True(nodes [1].Expression == "+");
            {
                Assert.True(nodes [1].Left.Expression == "3");
                Assert.True(nodes [1].Right.Expression == "4");
            }
            Assert.True(nodes [2].Type == NodeType.Constant);
            Assert.True(nodes [2].Expression == "5");
        }
Exemplo n.º 17
0
        public void parse_4項カッコあり()
        {
            var node = new Node("(2+3+4)+5");

            node.Parse();
            {
                Assert.True(node.Left.Left.Expression  == "2");
                Assert.True(node.Left.Expression       == "+");
                {
                    Assert.True(node.Left.Right.Left.Expression  == "3");
                    Assert.True(node.Left.Right.Expression       == "+");
                    Assert.True(node.Left.Right.Right.Expression == "4");
                }

            }
            Assert.True(node.Expression             == "+");
            Assert.True(node.Right.Expression       == "5");
            return;
        }
Exemplo n.º 18
0
        public void parse_関数_3項()
        {
            var node = new Node("SUM(2,3+4,5)");

            node.Parse();
            Assert.True(node.Expression == "SUM");
            Assert.True(node.Type == NodeType.Function);
            Assert.True(node.Left.Expression == "2");
            Assert.True(node.Right.Expression == ",");
            {
                Assert.True(node.Right.Left.Expression == "+");
                {
                    Assert.True(node.Right.Left.Left.Expression == "3");
                    Assert.True(node.Right.Left.Right.Expression == "4");
                }
                Assert.True(node.Right.Right.Expression == "5");
            }

            var nodes = Node.GetArgumentNodes(node);
        }
Exemplo n.º 19
0
        public int 計算(string expression)
        {
            var node = new Node(expression);

            node.Parse();
            //var ans = node.Compute();
            var ans = Node.Compute(node);
            return ans;
        }
Exemplo n.º 20
0
 public int 条件_less(string expression)
 {
     var node = new Node(expression);
     node.Parse();
     return Node.Compute(node);
 }
Exemplo n.º 21
0
        public void parse_3項()
        {
            var node = new Node("2+3+4");

            node.Parse();
            Assert.True(node.Left.Expression  == "2");
            Assert.True(node.Expression       == "+");

            Assert.True(node.Right.Left.Expression  == "3");
            Assert.True(node.Right.Expression       == "+");
            Assert.True(node.Right.Right.Expression == "4");
            return;
        }
Exemplo n.º 22
0
        public void parse_2項()
        {
            var node = new Node("2+3");

            node.Parse();
            Assert.True(node.Left.Expression    == "2");
            Assert.True(node.Expression         == "+");
            Assert.True(node.Type               == NodeType.Operator);
            Assert.True(node.Right.Expression   == "3");
            return;
        }
Exemplo n.º 23
0
        public void parse_関数引数取得2()
        {
            var node = new Node("SUM(2,3+4,-5)");

            node.Parse();
            var nodes = Node.GetArgumentNodes(node);

            Assert.True(nodes [ 0 ].Type        == NodeType.Constant);
            Assert.True(nodes [ 0 ].Expression  == "2");
            Assert.True(nodes [ 1 ].Type        == NodeType.Operator);
            Assert.True(nodes [ 1 ].Expression  == "+");
            {
                Assert.True(nodes [ 1 ].Left.Expression     == "3");
                Assert.True(nodes [ 1 ].Right.Expression    == "4");
            }
            Assert.True(nodes [ 2 ].Type        == NodeType.Operator);
            Assert.True(nodes [ 2 ].Expression  == "-");
            {
                Assert.True(nodes [ 2 ].Left                == null);
                Assert.True(nodes [ 2 ].Right.Expression    == "5");
            }
        }
Exemplo n.º 24
0
        public void parse_関数_3項()
        {
            var node = new Node("SUM(2,3+4,5)");

            node.Parse();
            Assert.True(node.Expression         == "SUM");
            Assert.True(node.Type               == NodeType.Function);
            Assert.True(node.Left.Expression    == "2");
            Assert.True(node.Right.Expression  == ",");
            {
                Assert.True(node.Right.Left.Expression  == "+");
                {
                    Assert.True(node.Right.Left.Left.Expression  == "3");
                    Assert.True(node.Right.Left.Right.Expression == "4");
                }
                Assert.True(node.Right.Right.Expression == "5");
            }

            var nodes = Node.GetArgumentNodes(node);
        }
Exemplo n.º 25
0
        public void parse_関数_2項()
        {
            var node = new Node("SUM(2,3)");

            node.Parse();
            Assert.True(node.Expression     == "SUM");
            Assert.True(node.Type           == NodeType.Function);
            Assert.True(node.Left.Expression  == "2");
            Assert.True(node.Right.Expression == "3");
        }
Exemplo n.º 26
0
        /// <summary>
        /// 式解析
        /// </summary>
        /// <remarks>再帰的に呼び出される</remarks>
        public void Parse()
        {
            int pos = GetOperatorPosition((this.Expression));

            // 符号として+-が指定されるケース
            if (pos == 0)
            {
                // TODO いきなり+-以外の演算子が出現したら異常
                this.Left  = null;
                this.Right = new Node(this.Expression.Substring(pos + 1));
                this.Right.Parse();
                this.Expression = this.Expression[pos].ToString();
                this.Type       = NodeType.Operator;
            }
            // 「項 演算子 項」のケース
            else if (pos > 0)
            {
                this.Left = new Node(this.Expression.Substring(0, pos));
                this.Left.Parse();
                this.Right = new Node(this.Expression.Substring(pos + 1));
                this.Right.Parse();
                this.Expression = this.Expression [pos].ToString();
                this.Type       = NodeType.Operator;
            }
            // 関数「Func(項・・・)」のケース
            else if (IsFunction(this.Expression) == true)
            {
                // 関数名だけをExpressionとして保存する。本当は属性を何か持ちたい
                var functionName = (new Regex(@"^" + functionMatcher)).Match(this.Expression).ToString();
                if (functionDictionary.ContainsKey(functionName) == false)
                {
                    throw new Exception("サポートされていない関数名が指定されています(" + functionName + ")");
                }
                else
                {
                    // 一旦オペランド部を解析する
                    var operandNode = new Node(Regex.Replace(Expression, @"^(" + functionMatcher + @")\((.+)\)$", "$2"));
                    operandNode.Parse();

                    // 多項の引数の場合
                    if (operandNode.Expression == ",")
                    {
                        this.Left  = operandNode.Left;
                        this.Right = operandNode.Right;
                    }
                    // 1項の引数の場合
                    else
                    {
                        this.Left  = operandNode;
                        this.Right = null;
                    }
                    this.Expression = functionName;
                    this.Type       = NodeType.Function;
                }
            }
            // 式を含まないケース
            else
            {
                if ((new Regex(@".*[^0-9].*")).IsMatch(this.Expression))
                {
                    this.Type = NodeType.Item;
                }
                else
                {
                    this.Type = NodeType.Constant;
                }
            }
            return;
        }
Exemplo n.º 27
0
        public int 計算_if(string expression)
        {
            var row = new Dictionary<string, int>() { { "X", 4 }, { "Y", 2 } };
            var tbl = new[]
                {
                    new Dictionary<string, int>() {{"A", 1},{"B", 3}},
                    new Dictionary<string, int>() {{"A", 2},{"B", 6}},
                    new Dictionary<string, int>() {{"A", 3},{"B", 7}},
                };

            var node = new Node(expression);

            node.Parse();
            return Node.Compute(node, row, tbl);
        }
Exemplo n.º 28
0
        public int 計算_カラム(string expression)
        {
            var row = new Dictionary<string, int>() { { "A", 1 }, { "B", 2 } };
            var tbl = new[]
                {
                    new Dictionary<string, int>() {{"A", 1}},
                    new Dictionary<string, int>() {{"A", 2}},
                    new Dictionary<string, int>() {{"A", 3}},
                };

            var node = new Node(expression);
            node.Parse();
            var ans = Node.Compute(node, row, tbl);
            return ans;
        }
Exemplo n.º 29
0
        public void parse_1項_1()
        {
            var node = new Node("2");

            node.Parse();
            Assert.True(node.Expression == "2");
            Assert.True(node.Type       == NodeType.Constant);
            return;
        }
Exemplo n.º 30
0
        /// <summary>
        /// 式解析
        /// </summary>
        /// <remarks>再帰的に呼び出される</remarks>
        public void Parse()
        {
            int pos = GetOperatorPosition((this.Expression));

            // 符号として+-が指定されるケース
            if (pos == 0)
            {
                // TODO いきなり+-以外の演算子が出現したら異常
                this.Left       = null;
                this.Right      = new Node(this.Expression.Substring(pos + 1));
                this.Right.Parse();
                this.Expression = this.Expression[pos].ToString();
                this.Type       = NodeType.Operator;
            }
            // 「項 演算子 項」のケース
            else if (pos > 0)
            {
                this.Left       = new Node(this.Expression.Substring(0, pos));
                this.Left.Parse();
                this.Right      = new Node(this.Expression.Substring(pos+1));
                this.Right.Parse();
                this.Expression = this.Expression [ pos ].ToString();
                this.Type       = NodeType.Operator;
            }
            // 関数「Func(項・・・)」のケース
            else if (IsFunction(this.Expression) == true)
            {
                // 関数名だけをExpressionとして保存する。本当は属性を何か持ちたい
                var functionName = ( new Regex(@"^"+functionMatcher) ).Match(this.Expression).ToString();
                if (functionDictionary.ContainsKey(functionName) == false)
                {
                    throw new Exception("サポートされていない関数名が指定されています("+functionName+")");
                }
                else
                {
                    // 一旦オペランド部を解析する
                    var operandNode = new Node(Regex.Replace(Expression, @"^(" + functionMatcher +@")\((.+)\)$", "$2"));
                    operandNode.Parse();

                    // 多項の引数の場合
                    if (operandNode.Expression == ",")
                    {
                        this.Left  = operandNode.Left;
                        this.Right = operandNode.Right;
                    }
                    // 1項の引数の場合
                    else
                    {
                        this.Left = operandNode;
                        this.Right = null;
                    }
                    this.Expression = functionName;
                    this.Type       = NodeType.Function;
                }
            }
            // 式を含まないケース
            else
            {
                if((new Regex(@".*[^0-9].*")).IsMatch(this.Expression) )
                {
                    this.Type   = NodeType.Item;
                }else{
                    this.Type   = NodeType.Constant;
                }
            }
            return;
        }
Exemplo n.º 31
0
        public void parse_1項_3()
        {
            var node = new Node("-2");

            node.Parse();
            Assert.True(node.Expression == "-");
            Assert.True(node.Right.Expression == "2");
            return;
        }