AstNode? _parseRange()

in lib/src/parser.dart [90:132]


  AstNode? _parseRange() {
    if (!_scanner.scan('[')) return null;
    if (_scanner.matches(']')) _scanner.error('unexpected "]".');
    var negated = _scanner.scan('!') || _scanner.scan('^');

    int readRangeChar() {
      var char = _scanner.readChar();
      if (negated || char != _slash) return char;
      _scanner.error('"/" may not be used in a range.',
          position: _scanner.position - 1);
    }

    var ranges = <Range>[];
    while (!_scanner.scan(']')) {
      var start = _scanner.position;
      // Allow a backslash to escape a character.
      _scanner.scan('\\');
      var char = readRangeChar();

      if (_scanner.scan('-')) {
        if (_scanner.matches(']')) {
          ranges.add(Range.singleton(char));
          ranges.add(Range.singleton(_hyphen));
          continue;
        }

        // Allow a backslash to escape a character.
        _scanner.scan('\\');

        var end = readRangeChar();

        if (end < char) {
          _scanner.error('Range out of order.',
              position: start, length: _scanner.position - start);
        }
        ranges.add(Range(char, end));
      } else {
        ranges.add(Range.singleton(char));
      }
    }

    return RangeNode(ranges, negated: negated, caseSensitive: _caseSensitive);
  }