Inheritance: OperatorExpression
コード例 #1
0
ファイル: Visitor.cs プロジェクト: gsscoder/exprengine
 public abstract void Visit(UnaryExpression expression);
コード例 #2
0
ファイル: Parser.cs プロジェクト: gsscoder/exprengine
        private Expression ParseUnary()
        {
            if (_current == null)
            {
                throw new EvaluatorException(_scanner.Column, "Expected unary operator, literal or open bracket.");
            }

            if (_current.Type == TokenType.Literal)
            {
                var literal = ParseLiteral();
                Consume();
                return literal;
            }

            var unary = new UnaryExpression();
            if (_current.Type == TokenType.Minus)
            {
                unary.Operator = OperatorType.UnaryMinus;
                Expect(MiddleGroupUnary);
            }
            else if (_current.Type == TokenType.Plus)
            {
                unary.Operator = OperatorType.UnaryPlus;
                Expect(MiddleGroupUnary);
            }

            if (_current.Type == TokenType.Literal)
            {
                unary.Value = ParseLiteral();
                //if (_scanner.PeekToken() != null && _scanner.PeekToken().Type == TokenType.Literal)
                //{
                //    throw new EvaluatorException(_scanner.Column, "Expected expression.");
                //}
            }
            else if (_current.Type == TokenType.LeftParenthesis)
            {
                unary.Value = ParseExpression();
            }
            else if (_current.Type == TokenType.Identifier)
            {
                unary.Value = ParseIdentifier();
            }
            else
            {
                throw new EvaluatorException(_scanner.Column, "Expected literal or open bracket.");
            }
            Consume();
            return unary;
        }