1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
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, 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!?"
|