anchor.diff:    ///
     /// The follow-set of a parser is the list of terminal parsers that can
     /// appear immediately after [parser]. Includes [sentinel], if the parse can
  -  /// end here.
  +  /// complete when starting at [root].
     Iterable<Parser> followSet(Parser parser) => _followSet[parser]!;
   
     late final Map<Parser, Set<Parser>> _followSet = computeFollowSets(
  
positive.code: import 'internal/follow_set.dart';
  import 'iterable.dart';
  
  /// Helper to efficiently analyze properties of a grammar.
  class Analyzer {
    Analyzer(this.root);
  
    /// The root of this parser.
    final Parser root;
  
    /// Returns a set of all parsers reachable from [root].
    Iterable<Parser> get parsers => _parsers;
  
    late final List<Parser> _parsers = allParser(root).toList(growable: false);
  
    /// Returns `true` if [parser] is transitively nullable, that is it can
    /// successfully parse nothing.
  
negative.code:   late final Map<Parser, List<Parser>> _cycleSet =
        computeCycleSets(parsers: _parsers, firstSets: _firstSets);
  
    /// Helper to do a global replace of [source] with [target].
    void replaceAll(Parser source, Parser target) {
      for (final parent in _parsers) {
        parent.replace(source, target);
      }
    }
  
    /// A unique parser used as a marker in [firstSet] and [followSet]
    /// computations.
    static final EpsilonParser sentinel = EpsilonParser<void>(null);
  }
  