class State: OPERATOR, NAME, *_ = range(100) class TokenType: ( LEFT_PARENTHESIS, RIGHT_PARENTHESIS, LEFT_BRACE, RIGHT_BRACE, NUMBER, OPERATOR, SYMBOL, KEYWORD, UNARY, SEMICOLON, COMMA, EQUALS, *_ ) = range(100) class NodeType: ( NUMBER, OPERATOR, SYMBOL, FUNCALL, ARGUMENTS, UNARY, ASSIGNMENT, *_ ) = range(100) class Keyword: LET, STRUCT, FN, RETURN, IF, ELSE, FOR, WHILE, CONTINUE, BREAK, *_ = range(100) keywords = { "let": Keyword.LET, "struct": Keyword.STRUCT, "fn": Keyword.FN, "return": Keyword.RETURN, "if": Keyword.IF, "else": Keyword.ELSE, "for": Keyword.FOR, "while": Keyword.WHILE, "continue": Keyword.CONTINUE, "break": Keyword.BREAK, } keywords_repr = {keywords[i]: i for i in keywords} types = [ "i8", "i16", "i32", "i64", "f32", "f64", ] PRECEDENCE = { "+": 10, "-": 10, "*": 20, "^": 30, NodeType.UNARY: 40, } OPERATOR_CHARS = "*+-/%&~^|#$.:<=>@" NUMBER_CHARS = "0123456789" SYMBOL_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!?"