|
43 | 43 | return false |
44 | 44 | end |
45 | 45 |
|
46 | | - local function tostring_tokens(tokens, pos) |
47 | | - if not tokens then return "" end |
48 | | - |
49 | | - local str = "" |
50 | | - local str_point = "" |
51 | | - |
52 | | - for i, tk in ipairs(tokens) do |
53 | | - str = str .. " " .. tk.value |
54 | | - str_point = str_point .. " " .. (i == pos and "^" or (" "):rep(#tk.value)) |
55 | | - end |
56 | | - |
57 | | - return str .. "\n" .. str_point |
58 | | - end |
59 | | - |
60 | | - local function is_stringinfy(self) |
61 | | - return self:GetToken(-1).value == "#" and self:GetToken(-2).value ~= "#" |
62 | | - end |
63 | | - |
64 | 46 | do -- for normal define, can be overriden |
65 | 47 | function META:Define(identifier, args, tokens) |
66 | 48 | local new_tokens = {} |
67 | 49 |
|
68 | 50 | for i, v in ipairs(tokens) do |
69 | | - new_tokens[i] = { |
70 | | - value = v.value, |
71 | | - type = v.type, |
72 | | - whitespace = { |
73 | | - {value = " ", type = "space"}, |
74 | | - }, |
| 51 | + local tk = self:NewToken(v.type, v.value) |
| 52 | + tk.whitespace = { |
| 53 | + {value = " ", type = "space"}, |
75 | 54 | } |
| 55 | + new_tokens[i] = tk |
76 | 56 | end |
77 | 57 |
|
78 | | - self.defines[identifier] = {args = args, tokens = new_tokens} |
| 58 | + self.defines[identifier] = {args = args, tokens = new_tokens, identifier = identifier} |
79 | 59 | end |
80 | 60 |
|
81 | 61 | function META:Undefine(identifier) |
|
88 | 68 | local new_tokens = {} |
89 | 69 |
|
90 | 70 | for i, v in ipairs(tokens) do |
91 | | - new_tokens[i] = { |
92 | | - value = v.value, |
93 | | - type = v.type, |
94 | | - whitespace = { |
95 | | - {value = " ", type = "space"}, |
96 | | - }, |
| 71 | + local tk = self:NewToken(v.type, v.value) |
| 72 | + tk.whitespace = { |
| 73 | + {value = " ", type = "space"}, |
97 | 74 | } |
| 75 | + new_tokens[i] = tk |
98 | 76 | end |
99 | 77 |
|
100 | 78 | self.define_stack[identifier] = self.define_stack[identifier] or {} |
101 | | - table.insert(self.define_stack[identifier], 1, {args = args, tokens = new_tokens}) |
| 79 | + table.insert(self.define_stack[identifier], 1, {args = args, tokens = new_tokens, identifier = identifier}) |
102 | 80 | end |
103 | 81 |
|
104 | 82 | function META:PushUndefine(identifier) |
|
111 | 89 | end |
112 | 90 | end |
113 | 91 |
|
114 | | - function META:GetDefinition(identifier) |
| 92 | + function META:GetDefinition(identifier, offset) |
| 93 | + if not identifier then |
| 94 | + local tk = self:GetToken(offset) |
| 95 | + |
| 96 | + if not tk then return false end |
| 97 | + |
| 98 | + if tk.type ~= "letter" then return false end |
| 99 | + |
| 100 | + identifier = tk.value |
| 101 | + end |
| 102 | + |
115 | 103 | if self.define_stack[identifier] then |
116 | 104 | return self.define_stack[identifier][1] |
117 | 105 | end |
|
205 | 193 | return args |
206 | 194 | end |
207 | 195 |
|
208 | | - function META:PrintState() |
209 | | - print("\n" .. tostring_tokens(self.tokens, self:GetPosition())) |
| 196 | + function META:PrintState(tokens, pos) |
| 197 | + pos = pos or self:GetPosition() |
| 198 | + |
| 199 | + if not tokens then return "" end |
| 200 | + |
| 201 | + local str = "" |
| 202 | + local str_point = "" |
| 203 | + |
| 204 | + for i, tk in ipairs(tokens) do |
| 205 | + str = str .. " " .. tk.value |
| 206 | + str_point = str_point .. " " .. (i == pos and "^" or (" "):rep(#tk.value)) |
| 207 | + end |
| 208 | + |
| 209 | + str = str .. "\n" .. str_point |
| 210 | + print("\n" .. str) |
210 | 211 | end |
211 | 212 |
|
212 | 213 | function META:ReadDefine() |
|
255 | 256 | end |
256 | 257 |
|
257 | 258 | function META:ExpandMacroCall() |
258 | | - local tk = self:GetToken() |
259 | | - |
260 | | - if not tk then return false end |
261 | | - |
262 | | - local def = self:GetDefinition(tk.value) |
| 259 | + local def = self:GetDefinition() |
263 | 260 |
|
264 | 261 | if not (def and self:IsTokenValue("(", 1)) then return false end |
265 | 262 |
|
|
274 | 271 |
|
275 | 272 | self.current_token_index = start |
276 | 273 |
|
277 | | - if tk.value == "__VA_OPT__" then |
| 274 | + if def.identifier == "__VA_OPT__" then |
278 | 275 | local va = self:GetDefinition("__VA_ARGS__") |
279 | 276 |
|
280 | 277 | if not va or #va.tokens == 0 or va.tokens[1].value == "" then |
|
368 | 365 | return false |
369 | 366 | end |
370 | 367 |
|
371 | | - local tk_left = self:GetToken() |
372 | | - local def_left = self:GetDefinition(tk_left.value) |
| 368 | + local def_left = self:GetDefinition() |
373 | 369 |
|
374 | 370 | if not def_left then return false end |
375 | 371 |
|
376 | | - local tk_right = self:GetToken(3) |
377 | | - local def_right = self:GetDefinition(tk_right.value) |
| 372 | + local def_right = self:GetDefinition(nil, 3) |
378 | 373 |
|
379 | 374 | if not def_right then return false end |
380 | 375 |
|
|
396 | 391 | function META:ExpandMacroString() |
397 | 392 | if not self:IsTokenValue("#") then return false end |
398 | 393 |
|
399 | | - local tk = self:GetToken(1) |
400 | | - |
401 | | - if not tk then return false end |
402 | | - |
403 | | - local def = self:GetDefinition(tk.value) |
| 394 | + local def = self:GetDefinition(nil, 1) |
404 | 395 |
|
405 | 396 | if not def then return false end |
406 | 397 |
|
|
411 | 402 | output = output .. tk.value |
412 | 403 | end |
413 | 404 |
|
414 | | - tk = self:NewToken("string", "\"" .. output .. "\"") |
| 405 | + local tk = self:NewToken("string", "\"" .. output .. "\"") |
415 | 406 | tk.whitespace = { |
416 | 407 | {value = " ", type = "space"}, |
417 | 408 | } |
|
422 | 413 | end |
423 | 414 |
|
424 | 415 | function META:ExpandMacro() |
425 | | - local tk = self:GetToken() |
426 | | - |
427 | | - if not tk then return false end |
428 | | - |
429 | | - local def = self:GetDefinition(tk.value) |
| 416 | + local def = self:GetDefinition() |
430 | 417 |
|
431 | 418 | if not def then return false end |
432 | 419 |
|
|
0 commit comments