public object VisitBinary(Expression.Binary expression) { var left = Evaluate(expression.Left); var right = Evaluate(expression.Right); switch (expression.Operator.Type) { case TokenType.Minus: CheckNumberOperands(expression.Operator, left, right); return((double)left - (double)right); case TokenType.Slash: CheckNumberOperands(expression.Operator, left, right); return((double)left / (double)right); case TokenType.Star: CheckNumberOperands(expression.Operator, left, right); return((double)left * (double)right); case TokenType.Plus: if (left is double && right is double) { return((double)left + (double)right); } if (left is string && right is string) { return((string)left + (string)right); } throw new RuntimeError(expression.Operator, "Operands must be two numbers or two strings."); case TokenType.Greater: CheckNumberOperands(expression.Operator, left, right); return((double)left > (double)right); case TokenType.GreaterEqual: CheckNumberOperands(expression.Operator, left, right); return((double)left >= (double)right); case TokenType.Less: CheckNumberOperands(expression.Operator, left, right); return((double)left < (double)right); case TokenType.LessEqual: CheckNumberOperands(expression.Operator, left, right); return((double)left <= (double)right); case TokenType.BangEqual: return(!IsEqual(left, right)); case TokenType.EqualEqual: return(IsEqual(left, right)); default: throw new NotImplementedException(); } }
private Expression Multiplication() { var expression = Unary(); while (Match(TokenType.Star, TokenType.Slash)) { var @operator = Previous(); var right = Unary(); expression = new Expression.Binary(expression, @operator, right); } return(expression); }
private Expression Addition() { var expression = Multiplication(); while (Match(TokenType.Minus, TokenType.Plus)) { var @operator = Previous(); var right = Multiplication(); expression = new Expression.Binary(expression, @operator, right); } return(expression); }
private Expression Comparison() { var expression = Addition(); while (Match(TokenType.Greater, TokenType.GreaterEqual, TokenType.Less, TokenType.LessEqual)) { var @operator = Previous(); var right = Addition(); expression = new Expression.Binary(expression, @operator, right); } return(expression); }
private Expression Equality() { var expression = Comparison(); while (Match(TokenType.BangEqual, TokenType.EqualEqual)) { var @operator = Previous(); var right = Comparison(); expression = new Expression.Binary(expression, @operator, right); } return(expression); }
public string VisitBinary(Expression.Binary expression) { return(Parenthesize(expression.Operator.Lexeme, expression.Left, expression.Right)); }