private static void toString(@NonNull StringBuilder builder, @NonNull Cache cache, @NonNull Prism4j.Grammar grammar) { builder .append("Grammar{id=0x") .append(Integer.toHexString(System.identityHashCode(grammar))) .append(",name=\"") .append(grammar.name()) .append('\"'); if (cache.visited(grammar)) { builder.append(",[...]"); } else { cache.markVisited(grammar); builder.append(",tokens=["); boolean first = true; for (Prism4j.Token token : grammar.tokens()) { if (first) { first = false; } else { builder.append(','); } toString(builder, cache, token); } builder.append(']'); } builder.append('}'); }
@NonNull private Prism4j.Grammar clone(@NonNull Context context, @NonNull Prism4j.Grammar grammar) { Prism4j.Grammar clone = context.grammar(grammar); if (clone != null) { return clone; } final List<Prism4j.Token> tokens = grammar.tokens(); final List<Prism4j.Token> out = new ArrayList<>(tokens.size()); clone = new GrammarImpl(grammar.name(), out); context.save(grammar, clone); for (Prism4j.Token token : tokens) { out.add(clone(context, token)); } return clone; }
final List<Prism4j.Token> origins = grammar.tokens(); final List<Prism4j.Token> out = new ArrayList<>(origins.size());
for (Token token : grammar.tokens()) {
final boolean last = index == parts.length - 1; final List<Prism4j.Token> grammarTokens = grammar.tokens();
@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; }