namespace Qrakhen.Qamp.Core.Tokenization; using static TokenType; public class Dialect { private char[][] _sequences; public Dialect() { _sequences = new char[0x80][]; } public void Define(TokenType type, string sequence) => Define(type, sequence.ToCharArray()); public void Define(TokenType type, char[] sequence) { _sequences[(int)type] = sequence; } public char[] Get(TokenType type) => _sequences[(int)type]; } public class DefaultDialect : Dialect { public DefaultDialect() { Define(Null, "null"); Define(GroupOpen, "("); Define(GroupClose, ")"); Define(ContextOpen, "{"); Define(ContextClose, "}"); Define(ArrayOpen, "["); Define(ArrayClose, "]"); Define(ArrayAdd, "<+"); Define(ArrayRemove, "->"); Define(Comma, ","); Define(Dot, "."); Define(Colon, ":"); Define(Semicolon, ";"); Define(Minus, "-"); Define(Plus, "+"); Define(MinusEqual, "-="); Define(PlusEqual, "+="); Define(Decrement, "++"); Define(Increment, "--"); Define(Slash, "/"); Define(SlashEqual, "/="); Define(Star, "*"); Define(StarEqual, "*="); Define(Modulo, "%"); Define(ModuloEqual, "%="); Define(BitwiseAnd, "&"); Define(BitwiseOr, "|"); Define(BitwiseXor, "^"); Define(BitwiseNot, "~"); Define(BitwiseLeft, "<<"); Define(BitwiseRight, ">>"); Define(Bang, "!"); Define(BangEqual, "!="); Define(Equal, "="); Define(EqualEqual, "=="); Define(Greater, ">"); Define(GreaterEqual, ">="); Define(Less, "<"); Define(LessEqual, "<="); Define(Question, "?"); Define(DoubleQuestion, "??"); Define(Identifier, "([_a-zA-Z][_a-zA-Z0-9]+?)"); Define(String, "(:?('.+')|\".+\")"); Define(Integer, "(\\d+)"); Define(Decimal, ""); Define(Hexadecimal, "0x([a-fA-F0-9]+)"); Define(And, "&&"); Define(Else, "else"); Define(False, "false"); Define(For, "for"); Define(If, "if"); Define(Or, "||"); Define(This, "this"); Define(True, "true"); Define(Var, "var"); Define(While, "while"); Define(Do, "do"); Define(Return, "return"); Define(Ref, "ref"); Define(Function, "function"); Define(Class, "class"); Define(Super, "base"); Define(TypeOf, "typeof"); Define(Print, "print"); Define(Import, "import"); Define(Export, "export"); } } public class ClassicDialect : DefaultDialect { public ClassicDialect() { Define(Null, "_"); Define(ArrayAdd, "<+"); Define(ArrayRemove, "->"); Define(Equal, "<~"); Define(This, ".~"); Define(Var, "*~"); Define(Return, "<:"); Define(Ref, "*&"); Define(Function, "fq"); Define(Super, "^~"); Define(TypeOf, "?:"); Define(Print, "::"); Define(Import, ""); } }