54 lines
1.2 KiB
Java
54 lines
1.2 KiB
Java
package net.minecraft.util.parsing.packrat;
|
|
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
public interface Rule<S, T> {
|
|
@Nullable
|
|
T parse(ParseState<S> parseState);
|
|
|
|
static <S, T> Rule<S, T> fromTerm(Term<S> child, Rule.RuleAction<S, T> action) {
|
|
return new Rule.WrappedTerm<>(action, child);
|
|
}
|
|
|
|
static <S, T> Rule<S, T> fromTerm(Term<S> child, Rule.SimpleRuleAction<S, T> action) {
|
|
return new Rule.WrappedTerm<>(action, child);
|
|
}
|
|
|
|
@FunctionalInterface
|
|
public interface RuleAction<S, T> {
|
|
@Nullable
|
|
T run(ParseState<S> parseState);
|
|
}
|
|
|
|
@FunctionalInterface
|
|
public interface SimpleRuleAction<S, T> extends Rule.RuleAction<S, T> {
|
|
T run(Scope scope);
|
|
|
|
@Override
|
|
default T run(ParseState<S> parseState) {
|
|
return this.run(parseState.scope());
|
|
}
|
|
}
|
|
|
|
public record WrappedTerm<S, T>(Rule.RuleAction<S, T> action, Term<S> child) implements Rule<S, T> {
|
|
@Nullable
|
|
@Override
|
|
public T parse(ParseState<S> parseState) {
|
|
Scope scope = parseState.scope();
|
|
scope.pushFrame();
|
|
|
|
Object var3;
|
|
try {
|
|
if (!this.child.parse(parseState, scope, Control.UNBOUND)) {
|
|
return null;
|
|
}
|
|
|
|
var3 = this.action.run(parseState);
|
|
} finally {
|
|
scope.popFrame();
|
|
}
|
|
|
|
return (T)var3;
|
|
}
|
|
}
|
|
}
|