Inheritance: IFilterNode, IOperatorNode
        private IFilterNode ParseFunctionExpression()
        {
            FilterToken function = Expect(FilterTokenType.Function);

            var functionNode = new FunctionNode
            {
                FilterOperator = function.ToFilterOperator()
            };

            Expect(FilterTokenType.LeftParenthesis);

            functionNode.Arguments.Add(Expression());

            while (Is(FilterTokenType.Comma))
            {
                Expect(FilterTokenType.Comma);
                functionNode.Arguments.Add(Expression());
            }

            Expect(FilterTokenType.RightParenthesis);

            return(functionNode);
        }
        public void FunctionNode_should_accept_visitor()
        {
            visitor.Setup(v => v.StartVisit(It.IsAny<FunctionNode>())).Verifiable();
            visitor.Setup(v => v.EndVisit()).Verifiable();

            Mock<IFilterNode> first = new Mock<IFilterNode>();
            first.Setup(f => f.Accept(It.IsAny<IFilterNodeVisitor>())).Verifiable();

            FunctionNode functionNode = new FunctionNode
            {
                Arguments = { first.Object }
            };

            functionNode.Accept(visitor.Object);

            visitor.VerifyAll();
            first.Verify();
        }
        private IFilterNode ParseFunctionExpression()
        {
            FilterToken function = Expect(FilterTokenType.Function);

            var functionNode = new FunctionNode
                                   {
                                       FilterOperator = function.ToFilterOperator()
                                   };

            Expect(FilterTokenType.LeftParenthesis);

            functionNode.Arguments.Add(Expression());

            while (Is(FilterTokenType.Comma))
            {
                Expect(FilterTokenType.Comma);
                functionNode.Arguments.Add(Expression());
            }

            Expect(FilterTokenType.RightParenthesis);

            return functionNode;
        }
        private IFilterNode ParseComparisonExpression(IFilterNode firstArgument)
        {
            if (Is(FilterTokenType.ComparisonOperator))
            {
                FilterToken comparison = Expect(FilterTokenType.ComparisonOperator);

                IFilterNode secondArgument = PrimaryExpression();

                return new ComparisonNode
                           {
                               First = firstArgument,
                               FilterOperator = comparison.ToFilterOperator(),
                               Second = secondArgument
                           };
            }

            FilterToken function = Expect(FilterTokenType.Function);

            var functionNode = new FunctionNode
            {
                FilterOperator = function.ToFilterOperator()
            };

            functionNode.Arguments.Add(firstArgument);
            functionNode.Arguments.Add(PrimaryExpression());

            return functionNode;
        }