code: private CompositeExpression parseComparisonRange() {
          Token token = tokens.lookahead();
          CompositeExpression expr;
          switch (token.type) {
              case EQUAL:
                  tokens.consume();
                  expr = eq(parseVersion());
                  break;
              case NOT_EQUAL:
                  tokens.consume();
                  expr = neq(parseVersion());
                  break;
              case GREATER:
                  tokens.consume();
                  expr = gt(parseVersion());
                  break;
              case GREATER_EQUAL:
                  tokens.consume();
                  expr = gte(parseVersion());
                  break;
              case LESS:
                  tokens.consume();
                  expr = lt(parseVersion());
                  break;
              case LESS_EQUAL:
                  tokens.consume();
                  expr = lte(parseVersion());
                  break;
              default:
                  expr = eq(parseVersion());
          }
          return expr;
      }
docs: Parses the {@literal <comparison-range>} non-terminal.
  
  <pre>
  {@literal
  <comparison-range> ::= <comparison-op> <version> | <version>
  }
  </pre>
  
  @return the expression AST