private static void toString(@NonNull StringBuilder builder, @NonNull Cache cache, @NonNull Prism4j.Token token) { builder .append("Token{id=0x") .append(Integer.toHexString(System.identityHashCode(token))) .append(",name=\"") .append(token.name()) .append('\"'); if (cache.visited(token)) { builder.append(",[...]"); } else { cache.markVisited(token); builder.append(",patterns=["); boolean first = true; for (Prism4j.Pattern pattern : token.patterns()) { if (first) { first = false; } else { builder.append(','); } toString(builder, cache, pattern); } builder.append(']'); } builder.append('}'); }
@NonNull private Prism4j.Token clone(@NonNull Context context, @NonNull Prism4j.Token token) { Prism4j.Token clone = context.token(token); if (clone != null) { return clone; } final List<Prism4j.Pattern> patterns = token.patterns(); final List<Prism4j.Pattern> out = new ArrayList<>(patterns.size()); clone = new TokenImpl(token.name(), out); context.save(token, clone); for (Prism4j.Pattern pattern : patterns) { out.add(clone(context, pattern)); } return clone; }
token.name(), tokenEntries, pattern.alias(),
if (part.equals(token.name())) {
@NonNull public static Prism4j.Grammar extend( @NonNull Prism4j.Grammar grammar, @NonNull String name, Prism4j.Token... tokens) { // we clone the whole grammar, but override top-most tokens that are passed here final int size = tokens != null ? tokens.length : 0; if (size == 0) { return new GrammarImpl(name, clone(grammar).tokens()); } final Map<String, Prism4j.Token> overrides = new HashMap<>(size); for (Prism4j.Token token : tokens) { overrides.put(token.name(), token); } final List<Prism4j.Token> origins = grammar.tokens(); final List<Prism4j.Token> out = new ArrayList<>(origins.size()); Prism4j.Token override; for (Prism4j.Token origin : origins) { override = overrides.get(origin.name()); if (override != null) { out.add(override); } else { out.add(clone(origin)); } } return new GrammarImpl(name, out); }
@Nullable private static Prism4j.Token findToken(@NonNull Prism4j.Grammar grammar, @NonNull String[] parts, int index) { final String part = parts[index]; final boolean last = index == parts.length - 1; for (Prism4j.Token token : grammar.tokens()) { if (part.equals(token.name())) { if (last) { return token; } else { final Prism4j.Grammar inside = findFirstInsideGrammar(token); if (inside != null) { return findToken(inside, parts, index + 1); } else { break; } } } } return null; }