The generic lexer uses a predefined set of GenericToken types to achieve high performance. You map your custom enum tokens to these generic types using the [Lexeme] attribute.
Static Lexemes
These allow a 1-to-1 mapping and only require the GenericToken as a parameter:
GenericToken.Identifier: Matches alpha characters (A-Z, a-z).GenericToken.String: Matches strings delimited by double quotes.GenericToken.Int: Matches a series of digits.GenericToken.Double: Matches a float (using . as decimal separator).
Example: [Lexeme(GenericToken.String)]
Configurable Lexemes
These require two parameters: the GenericToken and the specific value (string) to match:
GenericToken.keyWord: An identifier with special meaning.GenericToken.SugarToken: A general-purpose lexeme (must start with an alpha character).
Example: [Lexeme(GenericToken.KeyWord, "if")] or [Lexeme(GenericToken.SugarToken, ">")]
{
#region keywords 0 -> 19
[Lexeme(GenericToken.KeyWord,"if")]
IF = 1,
[Lexeme(GenericToken.KeyWord, "then")]
THEN = 2,
[Lexeme(GenericToken.KeyWord, "else")]
ELSE = 3,
[Lexeme(GenericToken.KeyWord, "while")]
WHILE = 4,
[Lexeme(GenericToken.KeyWord, "do")]
DO = 5,
[Lexeme(GenericToken.KeyWord, "skip")]
SKIP = 6,
[Lexeme(GenericToken.KeyWord, "true")]
TRUE = 7,
[Lexeme(GenericToken.KeyWord, "false")]
FALSE = 8,
[Lexeme(GenericToken.KeyWord, "not")]
NOT = 9,
[Lexeme(GenericToken.KeyWord, "and")]
AND = 10,
[Lexeme(GenericToken.KeyWord, "or")]
OR = 11,
[Lexeme(GenericToken.KeyWord, "(print)")]
PRINT = 12,
#endregion
#region literals 20 -> 29
[Lexeme(GenericToken.Identifier)]
IDENTIFIER = 20,
[Lexeme(GenericToken.String)]
STRING = 21,
[Lexeme(GenericToken.Int)]
INT = 22,
#endregion
#region operators 30 -> 49
[Lexeme(GenericToken.SugarToken,">")]
GREATER = 30,
[Lexeme(GenericToken.SugarToken, "<")]
LESSER = 31,
[Lexeme(GenericToken.SugarToken, "==")]
EQUALS = 32,
[Lexeme(GenericToken.SugarToken, "!=")]
DIFFERENT = 33,
[Lexeme(GenericToken.SugarToken, ".")]
CONCAT = 34,
[Lexeme(GenericToken.SugarToken, ":=")]
ASSIGN = 35,
[Lexeme(GenericToken.SugarToken, "+")]
PLUS = 36,
[Lexeme(GenericToken.SugarToken, "-")]
MINUS = 37,
[Lexeme(GenericToken.SugarToken, "*")]
TIMES = 38,
[Lexeme(GenericToken.SugarToken, "/")]
DIVIDE = 39,
#endregion
#region sugar 50 ->
[Lexeme(GenericToken.SugarToken, "(")]
LPAREN = 50,
[Lexeme(GenericToken.SugarToken, ")")]
RPAREN = 51,
[Lexeme(GenericToken.SugarToken, ";")]
SEMICOLON = 52,
EOF = 0
#endregion
}