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()}"); }