qamp/Qrakhen.Qamp.Core/Tokenization/Dialect.cs

110 lines
2.8 KiB
C#

namespace Qrakhen.Qamp.Core.Tokenization;
using Qrakhen.Qamp.Core.Collections;
using static TokenType;
public class Dialect
{
// suuuper slow but meh, who cares
private Register<string, TokenType> _register = new();
public void Define(TokenType type, string sequence)
=> _register[sequence] = type;
public TokenType Get(string sequence)
=> _register[sequence];
}
public class DefaultDialect : Dialect
{
public DefaultDialect()
{
Define(Null, "null");
Define(GroupOpen, "(");
Define(GroupClose, ")");
Define(ContextOpen, "{");
Define(ContextClose, "}");
Define(ArrayOpen, "[");
Define(ArrayClose, "]");
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(Base, "base");
Define(TypeOf, "typeof");
Define(Print, "print");
Define(Import, "import");
Define(Export, "export");
}
}
public class ClassicDialect : DefaultDialect
{
public ClassicDialect()
{
Define(Null, "_");
Define(PlusEqual, "<+");
Define(MinusEqual, "<-");
Define(Equal, "<~");
Define(Ref, "&");
Define(This, ".~");
Define(Var, "*~");
Define(Return, "<:");
Define(Ref, "*&");
Define(Function, "fq");
Define(Base, "^~");
Define(TypeOf, "?:");
Define(Print, "::");
Define(Import, "<!");
Define(Export, "!>");
}
}