toStrings method

List<String> toStrings(
  1. Recognizer<ATNSimulator>? recognizer,
  2. PredictionContext stop,
  3. int currentState
)

Implementation

List<String> toStrings(
  Recognizer? recognizer,
  PredictionContext stop,
  int currentState,
) {
  final result = <String>[];

  outer:
  for (var perm = 0;; perm++) {
    var offset = 0;
    var last = true;
    var p = this;
    var stateNumber = currentState;
    final localBuffer = StringBuffer();
    localBuffer.write('[');
    while (!p.isEmpty && p != stop) {
      var index = 0;
      if (p.length > 0) {
        var bits = 1;
        while ((1 << bits) < p.length) {
          bits++;
        }

        final mask = (1 << bits) - 1;
        index = (perm >> offset) & mask;
        last &= index >= p.length - 1;
        if (index >= p.length) {
          continue outer;
        }
        offset += bits;
      }

      if (recognizer != null) {
        if (localBuffer.length > 1) {
          // first char is '[', if more than that this isn't the first rule
          localBuffer.write(' ');
        }

        final atn = recognizer.getATN();
        final s = atn.states[stateNumber]!;
        final ruleName = recognizer.ruleNames[s.ruleIndex];
        localBuffer.write(ruleName);
      } else if (p.getReturnState(index) != EMPTY_RETURN_STATE) {
        if (!p.isEmpty) {
          if (localBuffer.length > 1) {
            // first char is '[', if more than that this isn't the first rule
            localBuffer.write(' ');
          }

          localBuffer.write(p.getReturnState(index));
        }
      }
      stateNumber = p.getReturnState(index);
      p = p.getParent(index) ?? EmptyPredictionContext.Instance;
    }
    localBuffer.write(']');
    result.add(localBuffer.toString());

    if (last) {
      break;
    }
  }

  return result;
}