code: private CompositeExpression parseRange() {
          if (tokens.positiveLookahead(TILDE)) {
              return parseTildeRange();
          } else if (tokens.positiveLookahead(CARET)) {
              return parseCaretRange();
          } else if (isWildcardRange()) {
              return parseWildcardRange();
          } else if (isHyphenRange()) {
              return parseHyphenRange();
          } else if (isPartialVersionRange()) {
              return parsePartialVersionRange();
          }
          return parseComparisonRange();
      }
docs: Parses the {@literal <range>} non-terminal.
  
  <pre>
  {@literal
  <expr> ::= <comparison-range>
  | <wildcard-expr>
  | <tilde-range>
  | <caret-range>
  | <hyphen-range>
  | <partial-version-range>
  }
  </pre>
  
  @return the expression AST