code: private Expression parseComparisonExpression() {
      Token token = tokens.lookahead();
      Expression expr;
      switch (token.type) {
        case EQUAL:
          tokens.consume();
          expr = new Equal(parseVersion());
          break;
        case NOT_EQUAL:
          tokens.consume();
          expr = new NotEqual(parseVersion());
          break;
        case GREATER:
          tokens.consume();
          expr = new Greater(parseVersion());
          break;
        case GREATER_EQUAL:
          tokens.consume();
          expr = new GreaterOrEqual(parseVersion());
          break;
        case LESS:
          tokens.consume();
          expr = new Less(parseVersion());
          break;
        case LESS_EQUAL:
          tokens.consume();
          expr = new LessOrEqual(parseVersion());
          break;
        default:
          expr = new Equal(parseVersion());
      }
      return expr;
    }
docs: Parses the {@literal <comparison-expr>} non-terminal.
  
  <pre>
  {@literal
  <comparison-expr> ::= <comparison-op> <version>
  | <version>
  }
  </pre>
  
  @return the expression AST