Code/net/minecraft/util/parsing/packrat/commands/StringReaderTerms.java

98 lines
3.9 KiB
Java

package net.minecraft.util.parsing.packrat.commands;
import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import it.unimi.dsi.fastutil.chars.CharList;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import net.minecraft.util.parsing.packrat.Control;
import net.minecraft.util.parsing.packrat.DelayedException;
import net.minecraft.util.parsing.packrat.ParseState;
import net.minecraft.util.parsing.packrat.Scope;
import net.minecraft.util.parsing.packrat.SuggestionSupplier;
import net.minecraft.util.parsing.packrat.Term;
public interface StringReaderTerms {
static Term<StringReader> word(String p_327924_) {
return new StringReaderTerms.TerminalWord(p_327924_);
}
static Term<StringReader> character(final char p_329750_) {
return new StringReaderTerms.TerminalCharacters(CharList.of(p_329750_)) {
@Override
protected boolean isAccepted(char p_391277_) {
return p_329750_ == p_391277_;
}
};
}
static Term<StringReader> characters(final char p_395208_, final char p_393692_) {
return new StringReaderTerms.TerminalCharacters(CharList.of(p_395208_, p_393692_)) {
@Override
protected boolean isAccepted(char p_393492_) {
return p_393492_ == p_395208_ || p_393492_ == p_393692_;
}
};
}
static StringReader createReader(String p_397367_, int p_395927_) {
StringReader stringreader = new StringReader(p_397367_);
stringreader.setCursor(p_395927_);
return stringreader;
}
public abstract static class TerminalCharacters implements Term<StringReader> {
private final DelayedException<CommandSyntaxException> error;
private final SuggestionSupplier<StringReader> suggestions;
public TerminalCharacters(CharList p_395243_) {
String s = p_395243_.intStream().mapToObj(Character::toString).collect(Collectors.joining("|"));
this.error = DelayedException.create(CommandSyntaxException.BUILT_IN_EXCEPTIONS.literalIncorrect(), String.valueOf(s));
this.suggestions = p_392492_ -> p_395243_.intStream().mapToObj(Character::toString);
}
@Override
public boolean parse(ParseState<StringReader> p_393490_, Scope p_391874_, Control p_397093_) {
p_393490_.input().skipWhitespace();
int i = p_393490_.mark();
if (p_393490_.input().canRead() && this.isAccepted(p_393490_.input().read())) {
return true;
} else {
p_393490_.errorCollector().store(i, this.suggestions, this.error);
return false;
}
}
protected abstract boolean isAccepted(char p_394606_);
}
public static final class TerminalWord implements Term<StringReader> {
private final String value;
private final DelayedException<CommandSyntaxException> error;
private final SuggestionSupplier<StringReader> suggestions;
public TerminalWord(String p_329076_) {
this.value = p_329076_;
this.error = DelayedException.create(CommandSyntaxException.BUILT_IN_EXCEPTIONS.literalIncorrect(), p_329076_);
this.suggestions = p_390460_ -> Stream.of(p_329076_);
}
@Override
public boolean parse(ParseState<StringReader> p_333566_, Scope p_332362_, Control p_328812_) {
p_333566_.input().skipWhitespace();
int i = p_333566_.mark();
String s = p_333566_.input().readUnquotedString();
if (!s.equals(this.value)) {
p_333566_.errorCollector().store(i, this.suggestions, this.error);
return false;
} else {
return true;
}
}
@Override
public String toString() {
return "terminal[" + this.value + "]";
}
}
}