-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtoken.rb
67 lines (51 loc) · 1.04 KB
/
token.rb
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
require 'byebug'
class Token
attr_reader :type, :literal
TOKEN_TYPE = {
"": "EOF",
"ILLEGAL": "ILLEGAL",
# Identifiers + literals
"IDENT": "IDENT",
"INT": "INT",
# Operators
"=": "ASSIGN",
"+": "PLUS",
# Delimiters
",": "COMMA",
";": "SEMICOLON",
"(": "LPAREN",
")": "RPAREN",
"{": "LBRACE",
"}": "RBRACE",
}.freeze
KEYWORDS = {
"let": "LET",
"fn": "FUNCTION",
}.freeze
def initialize(literal = nil)
parse(literal) unless literal.nil?
end
def type=(t)
@type = t
end
def literal=(l)
@literal = l
end
def literal_to_type(t)
return @type = TOKEN_TYPE[t.to_sym] if TOKEN_TYPE.has_key?(t.to_sym)
return @type = KEYWORDS[t.to_sym] if KEYWORDS.has_key?(t.to_sym)
@type = t
end
def parse(literal)
self.type = literal_to_type(literal)
self.literal = literal
end
end
# let five = 5;
# let ten = 10;
#
# let add = fn(x, y) {
# x + y;
# }
#
# let result = add(five, ten);