public List<TokenInfo[]> getAltLookaheadAsStringLists(IntervalSet[] altLookSets) {
		List<TokenInfo[]> altLook = new ArrayList<>();
		Target target = factory.getGenerator().getTarget();
		Grammar grammar = factory.getGrammar();
		for (IntervalSet s : altLookSets) {
			IntegerList list = s.toIntegerList();
			TokenInfo[] info = new TokenInfo[list.size()];
			for (int i = 0; i < info.length; i++) {
				info[i] = new TokenInfo(list.get(i), target.getTokenTypeAsTargetLabel(grammar, list.get(i)));
			}
			altLook.add(info);
		}
		return altLook;
	}
The class hierarchy underneath SrcOp is pretty deep but makes sense that,
 for example LL1StarBlock is a kind of LL1Loop which is a kind of Choice.
 The problem is it's impossible to figure
 out how to construct one of these deeply nested objects because of the
 long super constructor call chain. Instead, I decided to in-line all of
 this and then look for opportunities to re-factor code into functions.
 It makes sense to use a class hierarchy to share data fields, but I don't
 think it makes sense to factor code using super constructors because
 it has too much work to do.
tool/src/org/antlr/v4/codegen/model/Choice.java