package net.minecraft.command.type.custom.json; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.google.gson.JsonPrimitive; import com.google.gson.internal.LazilyParsedNumber; import net.minecraft.command.ParsingUtilities; import net.minecraft.command.SyntaxErrorException; import net.minecraft.command.arg.CommandArg; import net.minecraft.command.parser.MatcherRegistry; import net.minecraft.command.parser.Parser; import net.minecraft.command.type.IComplete; import net.minecraft.command.type.base.ExCustomParse; import net.minecraft.command.type.custom.json.JsonDescriptor.Element; import net.minecraft.command.type.custom.json.JsonUtilities.JsonData; import net.minecraft.command.type.metadata.ICompletable; public class ParserJsonElement extends ExCustomParse<Void, JsonData> { public static final MatcherRegistry specialMatcher = new MatcherRegistry("\\G\\s*+(['\"\\[{]|\\\\[@\\$])"); public static final MatcherRegistry literalMatcher = new MatcherRegistry(Pattern.compile( "\\G\\s*+(?:(?:([+-]?+(?=\\.?+\\d)\\d*+\\.?+\\d*+(?:e[+-]?+\\d++)?+)|(true)|(false)|(null))(?=\\s*+(?:[,\\]}]|\\z))|((?:\\s*+[^,\\]}\\s]++)++))", Pattern.CASE_INSENSITIVE)); private final JsonDescriptor.Element descriptor; public ParserJsonElement(final JsonDescriptor.Element descriptor) { this.descriptor = descriptor; } public ParserJsonElement(final Element descriptor, final IComplete completer) { this(descriptor); this.addEntry(new ICompletable.Default(completer)); } @Override public Void iParse(final Parser parser, final JsonData parserData) throws SyntaxErrorException { final Matcher m = parser.getMatcher(specialMatcher); if (parser.findInc(m)) switch (m.group(1)) { case "'": case "\"": final CommandArg<String> ret = ParsingUtilities.parseQuotedString(parser, parserData, m.group(1).charAt(0)); if (ret != null) parserData.add(JsonUtilities.tranfsorm(ret)); return null; case "\\@": parserData.add(JsonUtilities.parseSelector(parser)); return null; case "\\$": parserData.add(JsonUtilities.parseLabel(parser)); return null; case "[": this.descriptor.getArrayParser().parse(parser, parserData); return null; case "{": this.descriptor.getObjectParser().parse(parser, parserData); return null; } final Matcher nm = parser.getMatcher(literalMatcher); parserData.put( parser.findInc(nm) ? nm.group(1) == null ? nm.group(2) == null ? nm.group(3) == null ? nm.group(4) == null ? new JsonPrimitive(nm.group(5)) : null : new JsonPrimitive(false) : new JsonPrimitive(true) : new JsonPrimitive(new LazilyParsedNumber(nm.group(1))) : null, this.descriptor.type()); return null; } }