private Expr And() { var expr = Equality(); while (Match(TokenType.And)) { var op = Previous(); var right = Equality(); expr = new Logical(expr, op, right); } return(expr); }
private Expr Or() { var expr = And(); while (Match(TokenType.Or)) { var op = Previous(); var right = And(); expr = new Logical(expr, op, right); } return(expr); }
public object VisitLogical(Logical logical) { object left = logical.Left.Accept(this); if (logical.Op.Type == OR && IsTrue(left)) { return(left);//early out -> TRUE } if (logical.Op.Type == AND && !IsTrue(left)) { return(left);//early out -> FALSE } object right = logical.Right.Accept(this); return(right); }
public object Visit(Logical expr) { var left = Evaluate(expr.Left); if (expr.Op.Type == Or) { if (IsTruthy(left)) { return(left); } } else { if (!IsTruthy(left)) { return(left); } } return(Evaluate(expr.Right)); }