-
Notifications
You must be signed in to change notification settings - Fork 0
/
tokens.lua
76 lines (68 loc) · 2.32 KB
/
tokens.lua
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
Class = require("oo")
TokenType = Class()
TokenType.__tostring = function(v)
return string.format("TokenType(%s)", v.text)
end
--[[TokenType = {}
function TokenType:getClassName()
return "TokenType"
end
function TokenType:equals(other)
if other.getClassName() == "TokenType" then
return self.getValue() == other.getValue()
else
error("Comparing TokenType with a value from another class:" + other.getClassName())
end
end]]
ILLEGAL = TokenType { value = 0, text = "ILLEGAL" }
EOF = TokenType { value = 1, text = "EOF" }
ASSIGN = TokenType { value = 2, text = "=" }
EQ = TokenType { value = 3, text = "==" }
NOT_EQ = TokenType { value = 4, text = "!=" }
IDENT = TokenType { value = 5, text = "IDENT" }
INT = TokenType { value = 6, text = "INT" }
PLUS = TokenType { value = 7, text = "+" }
COMMA = TokenType { value = 8, text = "," }
SEMICOLON = TokenType { value = 9, text = ";" }
COLON = TokenType { value = 10, text = ":" }
MINUS = TokenType { value = 11, text = "-" }
BANG = TokenType { value = 12, text = "!" }
SLASH = TokenType { value = 13, text = "/" }
ASTERISK = TokenType { value = 14, text = "*" }
LT = TokenType { value = 15, text = "<" }
GT = TokenType { value = 16, text = ">" }
LPAREN = TokenType { value = 17, text = "(" }
RPAREN = TokenType { value = 18, text = ")" }
LBRACE = TokenType { value = 19, text = "{" }
RBRACE = TokenType { value = 20, text = "}" }
LBRACKET = TokenType { value = 21, text = "[" }
RBRACKET = TokenType { value = 22, text = "]" }
FUNCTION = TokenType { value = 23, text = "FUNCTION" }
LET = TokenType { value = 24, text = "LET" }
TRUE = TokenType { value = 25, text = "TRUE" }
FALSE = TokenType { value = 26, text = "FALSE" }
IF = TokenType { value = 27, text = "IF" }
ELSE = TokenType { value = 28, text = "ELSE" }
RETURN = TokenType { value = 29, text = "RETURN" }
STRING = TokenType { value = 30, text = "STRING" }
local keywords = {
["fn"] = FUNCTION,
["let"] = LET,
["true"] = TRUE,
["false"] = FALSE,
["if"] = IF,
["else"] = ELSE,
["return"] = RETURN
}
function LookupIdent(name)
local reserved = keywords[name]
if reserved == nil then
return IDENT
else
return reserved
end
end
Token = Class()
Token.__tostring = function(v)
return string.format("Token(tokenType:%s, literal:'%s')", tostring(v.tokenType), v.literal)
end