package net.minecraft.util.parsing.packrat; import java.util.ArrayList; import java.util.List; public interface Term { boolean parse(ParseState p_334989_, Scope p_334936_, Control p_335743_); static Term marker(Atom p_333477_, T p_335010_) { return new Term.Marker<>(p_333477_, p_335010_); } @SafeVarargs static Term sequence(Term... p_331306_) { return new Term.Sequence<>(p_331306_); } @SafeVarargs static Term alternative(Term... p_334441_) { return new Term.Alternative<>(p_334441_); } static Term optional(Term p_335256_) { return new Term.Maybe<>(p_335256_); } static Term repeated(NamedRule p_391997_, Atom> p_395278_) { return repeated(p_391997_, p_395278_, 0); } static Term repeated(NamedRule p_394090_, Atom> p_396235_, int p_397596_) { return new Term.Repeated<>(p_394090_, p_396235_, p_397596_); } static Term repeatedWithTrailingSeparator(NamedRule p_395582_, Atom> p_391503_, Term p_394717_) { return repeatedWithTrailingSeparator(p_395582_, p_391503_, p_394717_, 0); } static Term repeatedWithTrailingSeparator(NamedRule p_397489_, Atom> p_392214_, Term p_395301_, int p_391759_) { return new Term.RepeatedWithSeparator<>(p_397489_, p_392214_, p_395301_, p_391759_, true); } static Term repeatedWithoutTrailingSeparator(NamedRule p_392740_, Atom> p_397250_, Term p_393470_) { return repeatedWithoutTrailingSeparator(p_392740_, p_397250_, p_393470_, 0); } static Term repeatedWithoutTrailingSeparator(NamedRule p_393071_, Atom> p_395445_, Term p_395475_, int p_392015_) { return new Term.RepeatedWithSeparator<>(p_393071_, p_395445_, p_395475_, p_392015_, false); } static Term positiveLookahead(Term p_395551_) { return new Term.LookAhead<>(p_395551_, true); } static Term negativeLookahead(Term p_395059_) { return new Term.LookAhead<>(p_395059_, false); } static Term cut() { return new Term() { @Override public boolean parse(ParseState p_333527_, Scope p_336097_, Control p_335047_) { p_335047_.cut(); return true; } @Override public String toString() { return "\u2191"; } }; } static Term empty() { return new Term() { @Override public boolean parse(ParseState p_328418_, Scope p_332040_, Control p_328784_) { return true; } @Override public String toString() { return "\u03b5"; } }; } static Term fail(final Object p_396725_) { return new Term() { @Override public boolean parse(ParseState p_394241_, Scope p_396858_, Control p_393969_) { p_394241_.errorCollector().store(p_394241_.mark(), p_396725_); return false; } @Override public String toString() { return "fail"; } }; } public record Alternative(Term[] elements) implements Term { @Override public boolean parse(ParseState p_328094_, Scope p_331753_, Control p_334626_) { Control control = p_328094_.acquireControl(); try { int i = p_328094_.mark(); p_331753_.splitFrame(); for (Term term : this.elements) { if (term.parse(p_328094_, p_331753_, control)) { p_331753_.mergeFrame(); return true; } p_331753_.clearFrameValues(); p_328094_.restore(i); if (control.hasCut()) { break; } } p_331753_.popFrame(); return false; } finally { p_328094_.releaseControl(); } } } public record LookAhead(Term term, boolean positive) implements Term { @Override public boolean parse(ParseState p_391493_, Scope p_395827_, Control p_391882_) { int i = p_391493_.mark(); boolean flag = this.term.parse(p_391493_.silent(), p_395827_, p_391882_); p_391493_.restore(i); return this.positive == flag; } } public record Marker(Atom name, T value) implements Term { @Override public boolean parse(ParseState p_332878_, Scope p_331621_, Control p_334053_) { p_331621_.put(this.name, this.value); return true; } } public record Maybe(Term term) implements Term { @Override public boolean parse(ParseState p_332001_, Scope p_329861_, Control p_331352_) { int i = p_332001_.mark(); if (!this.term.parse(p_332001_, p_329861_, p_331352_)) { p_332001_.restore(i); } return true; } } public record Repeated(NamedRule element, Atom> listName, int minRepetitions) implements Term { @Override public boolean parse(ParseState p_393223_, Scope p_397132_, Control p_396901_) { int i = p_393223_.mark(); List list = new ArrayList<>(this.minRepetitions); while (true) { int j = p_393223_.mark(); T t = p_393223_.parse(this.element); if (t == null) { p_393223_.restore(j); if (list.size() < this.minRepetitions) { p_393223_.restore(i); return false; } else { p_397132_.put(this.listName, list); return true; } } list.add(t); } } } public record RepeatedWithSeparator(NamedRule element, Atom> listName, Term separator, int minRepetitions, boolean allowTrailingSeparator) implements Term { @Override public boolean parse(ParseState p_396935_, Scope p_392276_, Control p_393022_) { int i = p_396935_.mark(); List list = new ArrayList<>(this.minRepetitions); boolean flag = true; while (true) { int j = p_396935_.mark(); if (!flag && !this.separator.parse(p_396935_, p_392276_, p_393022_)) { p_396935_.restore(j); break; } int k = p_396935_.mark(); T t = p_396935_.parse(this.element); if (t == null) { if (flag) { p_396935_.restore(k); } else { if (!this.allowTrailingSeparator) { p_396935_.restore(i); return false; } p_396935_.restore(k); } break; } list.add(t); flag = false; } if (list.size() < this.minRepetitions) { p_396935_.restore(i); return false; } else { p_392276_.put(this.listName, list); return true; } } } public record Sequence(Term[] elements) implements Term { @Override public boolean parse(ParseState p_330195_, Scope p_336361_, Control p_328798_) { int i = p_330195_.mark(); for (Term term : this.elements) { if (!term.parse(p_330195_, p_336361_, p_328798_)) { p_330195_.restore(i); return false; } } return true; } } }