code: private Expression parseExpression() {
      if (tokens.positiveLookahead(TILDE)) {
        return parseTildeExpression();
      } else if (isVersionExpression()) {
        return parseVersionExpression();
      } else if (isRangeExpression()) {
        return parseRangeExpression();
      }
      return parseComparisonExpression();
    }
docs: Parses the {@literal <expr>} non-terminal.
  
  <pre>
  {@literal
  <expr> ::= <comparison-expr>
  | <version-expr>
  | <tilde-expr>
  | <range-expr>
  }
  </pre>
  
  @return the expression AST