Пример #1
0
        private VisitResult VisitBinaryOperator(ASTBinaryOperator node)
        {
            switch (node.Type)
            {
            case TokenType.Plus:
                return(new VisitResult
                {
                    Value = Visit(node.Left).Value + Visit(node.Right).Value
                });

            case TokenType.Minus:
                return(new VisitResult
                {
                    Value = Visit(node.Left).Value - Visit(node.Right).Value
                });

            case TokenType.Multiplication:
                return(new VisitResult
                {
                    Value = Visit(node.Left).Value *Visit(node.Right).Value
                });

            case TokenType.Divide:
                return(new VisitResult
                {
                    Value = Visit(node.Left).Value / Visit(node.Right).Value
                });

            case TokenType.Modulo:
                return(new VisitResult
                {
                    Value = Visit(node.Left).Value % Visit(node.Right).Value
                });

            case TokenType.Equal:
                return(new VisitResult
                {
                    Value = Visit(node.Left).Value == Visit(node.Right).Value
                });

            case TokenType.NotEqual:
                return(new VisitResult
                {
                    Value = Visit(node.Left).Value != Visit(node.Right).Value
                });

            case TokenType.Greater:
                return(new VisitResult
                {
                    Value = Visit(node.Left).Value > Visit(node.Right).Value
                });

            case TokenType.GreaterEqual:
                return(new VisitResult
                {
                    Value = Visit(node.Left).Value >= Visit(node.Right).Value
                });

            case TokenType.Less:
                return(new VisitResult
                {
                    Value = Visit(node.Left).Value < Visit(node.Right).Value
                });

            case TokenType.LessEqual:
                return(new VisitResult
                {
                    Value = Visit(node.Left).Value <= Visit(node.Right).Value
                });

            case TokenType.And:
                return(new VisitResult
                {
                    Value = Visit(node.Left).Value&& Visit(node.Right).Value
                });

            case TokenType.Or:
                return(new VisitResult
                {
                    Value = Visit(node.Left).Value || Visit(node.Right).Value
                });
            }

            throw new ArgumentException($"Invalid AST node type {node.GetType()}");
        }