package bjc.dicelang.scl; import java.util.HashMap; import java.util.Map; import bjc.dicelang.Errors; import bjc.utils.parserutils.TokenUtils; import static bjc.dicelang.Errors.ErrorKey.EK_SCL_INVTOKEN; import static bjc.dicelang.scl.SCLToken.Type.*; import static bjc.dicelang.scl.SCLToken.Word.*; public class SCLToken { public static enum Type { /* Natural tokens. These come directly from strings */ ILIT, FLIT, BLIT, SQUOTE, DQUOTE, OBRACKET, OBRACE, SYMBOL, WORD, /* Synthetic tokens. These are produced from special tokens. */ SLIT, WORDS, ARRAY, } public static enum Word { /* Array manipulation */ MAKEARRAY, MAKEEXEC, MAKEUNEXEC, /* Stream manipulation */ NEWSTREAM, LEFTSTREAM, RIGHTSTREAM, DELETESTREAM, MERGESTREAM, /* Stack manipulation */ STACKCOUNT, STACKEMPTY, DROP, NDROP, NIP, NNIP, } public SCLToken.Type type; public static SCLToken tokenizeString(final String token) { if (litTokens.containsKey(token)) { return new IntSCLToken(litTokens.get(token)); } else if (token.startsWith("\\")) { return new StringSCLToken(true, token.substring(1)); } else if (builtinWords.containsKey(token)) { return new WordSCLToken(builtinWords.get(token)); } else if (token.equals("true")) { return new BooleanSCLToken(true); } else if (token.equals("false")) { return new BooleanSCLToken(false); } else if (TokenUtils.isInt(token)) { return new IntSCLToken(Long.parseLong(token)); } else if (TokenUtils.isDouble(token)) { return new FloatSCLToken(Double.parseDouble(token)); } else { Errors.inst.printError(EK_SCL_INVTOKEN, token); return null; } } protected static final Map litTokens; protected static final Map builtinWords; protected SCLToken() { } protected SCLToken(Type typ) { type = typ; } static { /* Init literal tokens. */ litTokens = new HashMap<>(); litTokens.put("'", SQUOTE); litTokens.put("\"", DQUOTE); litTokens.put("[", OBRACKET); litTokens.put("{", OBRACE); /* Init builtin words. */ builtinWords = new HashMap<>(); builtinWords.put("makearray", MAKEARRAY); builtinWords.put("+stream", NEWSTREAM); builtinWords.put(">stream", LEFTSTREAM); builtinWords.put("