AdvancedScripts/src/main/java/de/zonlykroks/advancedscripts/lexer/ScriptSyntaxPacketParser.java

79 Zeilen
2.5 KiB
Java

package de.zonlykroks.advancedscripts.lexer;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class ScriptSyntaxPacketParser {
private ScriptSyntaxPacketParser() {
throw new IllegalStateException("Utility class");
}
private static final TokenType[] TOKEN_TYPES = TokenType.values();
private static void reset() {
Operators.OPERATORS.clear();
Headers.HEADERS.clear();
VariablePrefixes.RPEFIXES.clear();
VariableSuffixes.SUFFIXES.clear();
Commands.COMMANDS.clear();
}
public static synchronized void parse(String scriptSyntax) {
reset();
JsonObject jsonObject = JsonParser.parseString(scriptSyntax).getAsJsonObject();
for (String key : jsonObject.keySet()) {
JsonArray jsonElements = jsonObject.get(key).getAsJsonArray();
if (key.startsWith("@")) {
parseSpecial(key, jsonElements);
} else {
parseCommand(key, jsonElements);
}
}
}
private static void parseCommand(String key, JsonArray value) {
boolean repeating = value.get(0).getAsBoolean();
List<List<TokenType>> validArgumentTypes = new ArrayList<>();
for (int i = 1; i < value.size(); i++) {
JsonArray parameters = value.get(i).getAsJsonArray();
List<TokenType> parameterTypes = new ArrayList<>();
for (JsonElement parameter : parameters) {
parameterTypes.add(TOKEN_TYPES[parameter.getAsInt()]);
}
validArgumentTypes.add(parameterTypes);
}
Commands.COMMANDS.put(key, new Command(repeating, validArgumentTypes));
}
private static void parseSpecial(String key, JsonArray value) {
Set<String> set;
switch (key) {
case "@operators":
set = Operators.OPERATORS;
break;
case "@headers":
set = Headers.HEADERS;
break;
case "@prefixes":
set = VariablePrefixes.RPEFIXES;
break;
case "@suffixes":
set = VariableSuffixes.SUFFIXES;
break;
default:
return;
}
for (JsonElement element : value) {
set.add(element.getAsString());
}
}
}