1 # coding: utf-8
2 # frozen_string_literal: true
3
4
5
6 module Umu
7
8 module Lexical
9
10 module Token
11
12 class ReservedWord < Abstraction::Symbol
13 def initialize(loc, val)
14 ASSERT.kind_of val, ::String
15
16 super(loc, val.upcase)
17 end
18
19
20 def to_s
21 self.sym.to_s
22 end
23
24
25 alias to_racc_token sym
26 end
27
28
29
30 class ReservedSymbol < Abstraction::Symbol
31 def to_s
32 format "'%s'", self.sym
33 end
34
35
36 def to_racc_token
37 self.sym.to_s
38 end
39 end
40
41
42
43 class Symbol < Abstraction::Symbol
44 def to_s
45 format "SYM(%s)", self.sym
46 end
47
48
49 def to_racc_token
50 :SYMBOL
51 end
52 end
53
54
55
56 class ModuleDirectory < Abstraction::Symbol
57 def to_s
58 format "DIR(%s::)", self.sym
59 end
60
61
62 def to_racc_token
63 :MODULE_DIR
64 end
65 end
66
67
68
69 class Identifier < Abstraction::Symbol
70 def to_s
71 format "ID(%s)", self.sym
72 end
73
74
75 def to_racc_token
76 :ID
77 end
78 end
79
80
81
82 class Label < Abstraction::Symbol
83 def to_s
84 format "LABEL(%s:)", self.sym
85 end
86
87
88 def to_racc_token
89 :LABEL
90 end
91 end
92
93
94
95 class LabelSelector < Abstraction::Symbol
96 def to_s
97 format "LSEL($%s)", self.sym
98 end
99
100
101 def to_racc_token
102 :LSEL
103 end
104 end
105
106
107
108 class NumberSelector < Abstraction::Abstract
109 def initialize(loc, val)
110 ASSERT.kind_of val, ::Integer
111
112 super
113 end
114
115
116 def to_s
117 format "NSEL($%s)", self.val.to_s
118 end
119
120
121 def to_racc_token
122 :NSEL
123 end
124 end
125
126
127
128 class Message < Abstraction::Symbol
129 def to_s
130 format "MSG(.%s)", self.sym
131 end
132
133
134 def to_racc_token
135 :MSG
136 end
137 end
138
139
140
141 class String < Abstraction::String
142 def initialize(loc, val)
143 ASSERT.kind_of val, ::String
144
145 super
146 end
147
148
149 def to_s
150 format "STRING(\"%s\")", Escape.unescape(self.val)
151 end
152
153
154 def to_racc_token
155 :STRING
156 end
157 end
158
159
160
161 class Int < Abstraction::Abstract
162 def initialize(loc, val)
163 ASSERT.kind_of val, ::Integer
164
165 super
166 end
167
168
169 def to_s
170 format "INT(%s)", self.val.to_s
171 end
172
173
174 def to_racc_token
175 :INT
176 end
177 end
178
179
180
181 class Float < Abstraction::Abstract
182 def initialize(loc, val)
183 ASSERT.kind_of val, ::Float
184
185 super
186 end
187
188
189 def to_s
190 format "FLOAT(%s)", self.val.to_s
191 end
192
193
194 def to_racc_token
195 :FLOAT
196 end
197 end
198
199
200
201 module_function
202
203 def make_reserved_word(loc, val)
204 ASSERT.kind_of loc, LOC::Entry
205 ASSERT.kind_of val, ::String
206
207 ReservedWord.new(loc, val.freeze).freeze
208 end
209
210
211 def make_reserved_symbol(loc, val)
212 ASSERT.kind_of loc, LOC::Entry
213 ASSERT.kind_of val, ::String
214
215 ReservedSymbol.new(loc, val.freeze).freeze
216 end
217
218
219 def make_symbol(loc, val)
220 ASSERT.kind_of loc, LOC::Entry
221 ASSERT.kind_of val, ::String
222
223 Symbol.new(loc, val.freeze).freeze
224 end
225
226
227 def make_module_directory(loc, val)
228 ASSERT.kind_of loc, LOC::Entry
229 ASSERT.kind_of val, ::String
230
231 ModuleDirectory.new(loc, val.freeze).freeze
232 end
233
234
235 def make_identifier(loc, val)
236 ASSERT.kind_of loc, LOC::Entry
237 ASSERT.kind_of val, ::String
238
239 Identifier.new(loc, val.freeze).freeze
240 end
241
242
243 def make_label(loc, val)
244 ASSERT.kind_of loc, LOC::Entry
245 ASSERT.kind_of val, ::String
246
247 Label.new(loc, val.freeze).freeze
248 end
249
250
251 def make_label_selector(loc, val)
252 ASSERT.kind_of loc, LOC::Entry
253 ASSERT.kind_of val, ::String
254
255 LabelSelector.new(loc, val.freeze).freeze
256 end
257
258
259 def make_number_selector(loc, val)
260 ASSERT.kind_of loc, LOC::Entry
261 ASSERT.kind_of val, ::Integer
262
263 NumberSelector.new(loc, val).freeze
264 end
265
266
267 def make_message(loc, val)
268 ASSERT.kind_of loc, LOC::Entry
269 ASSERT.kind_of val, ::String
270
271 Message.new(loc, val.freeze).freeze
272 end
273
274
275 def make_string(loc, val)
276 ASSERT.kind_of loc, LOC::Entry
277 ASSERT.kind_of val, ::String
278
279 String.new(loc, val.freeze).freeze
280 end
281
282
283 def make_integer(loc, val)
284 ASSERT.kind_of loc, LOC::Entry
285 ASSERT.kind_of val, ::Integer
286
287 Int.new(loc, val).freeze
288 end
289
290
291 def make_float(loc, val)
292 ASSERT.kind_of loc, LOC::Entry
293 ASSERT.kind_of val, ::Float
294
295 Float.new(loc, val).freeze
296 end
297
298 end # Umu::Lexical::Token
299
300 end # Umu::Lexical
301
302 end # Umu