lt-script 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,31 @@
1
+ import { Token } from './Token.js';
2
+ /**
3
+ * LT Language Lexer
4
+ * Converts source code into tokens
5
+ */
6
+ export declare class Lexer {
7
+ private source;
8
+ private tokens;
9
+ private pos;
10
+ private line;
11
+ private column;
12
+ constructor(source: string);
13
+ tokenize(): Token[];
14
+ private scanToken;
15
+ private readOperator;
16
+ private readLongString;
17
+ private readString;
18
+ private readNumber;
19
+ private readIdentifier;
20
+ private skipWhitespace;
21
+ private skipComment;
22
+ private addToken;
23
+ private current;
24
+ private peek;
25
+ private peekNext;
26
+ private advance;
27
+ private isEOF;
28
+ private isDigit;
29
+ private isAlpha;
30
+ private isAlphaNumeric;
31
+ }
@@ -0,0 +1,322 @@
1
+ import { TokenType, KEYWORDS } from './Token.js';
2
+ /**
3
+ * LT Language Lexer
4
+ * Converts source code into tokens
5
+ */
6
+ export class Lexer {
7
+ source;
8
+ tokens = [];
9
+ pos = 0;
10
+ line = 1;
11
+ column = 1;
12
+ constructor(source) {
13
+ this.source = source;
14
+ }
15
+ tokenize() {
16
+ while (!this.isEOF()) {
17
+ this.scanToken();
18
+ }
19
+ this.addToken(TokenType.EOF, '');
20
+ return this.tokens;
21
+ }
22
+ scanToken() {
23
+ this.skipWhitespace();
24
+ if (this.isEOF())
25
+ return;
26
+ const ch = this.current();
27
+ // Comments
28
+ if ((ch === '-' && this.peek() === '-') || (ch === '/' && this.peek() === '/')) {
29
+ this.skipComment();
30
+ return;
31
+ }
32
+ // String interpolation / Quotes
33
+ if (ch === '"' || ch === "'") {
34
+ this.readString(ch);
35
+ return;
36
+ }
37
+ // Lua Long Strings [[ ... ]]
38
+ if (ch === '[' && this.peek() === '[') {
39
+ this.readLongString();
40
+ return;
41
+ }
42
+ // Numbers
43
+ if (this.isDigit(ch)) {
44
+ this.readNumber();
45
+ return;
46
+ }
47
+ // Identifiers & Keywords
48
+ if (this.isAlpha(ch)) {
49
+ this.readIdentifier();
50
+ return;
51
+ }
52
+ // Operators & Delimiters
53
+ this.readOperator();
54
+ }
55
+ readOperator() {
56
+ const ch = this.current();
57
+ const next = this.peek();
58
+ // Three-char operators
59
+ if (ch === '.' && next === '.' && this.peekNext() === '=') {
60
+ this.advance();
61
+ this.advance();
62
+ this.advance();
63
+ this.addToken(TokenType.CONCAT_EQ, '..=');
64
+ return;
65
+ }
66
+ // Spread Operator ...
67
+ const threeChar = ch + next + this.peekNext();
68
+ if (threeChar === '...') {
69
+ this.advance();
70
+ this.advance();
71
+ this.advance();
72
+ this.addToken(TokenType.SPREAD, '...');
73
+ return;
74
+ }
75
+ // Two-char operators
76
+ const twoChar = ch + next;
77
+ const twoCharMap = {
78
+ '=>': TokenType.ARROW,
79
+ '?.': TokenType.OPT_DOT,
80
+ '?[': TokenType.OPT_BRACKET,
81
+ '??': TokenType.NULL_COALESCE,
82
+ '==': TokenType.EQ,
83
+ '~=': TokenType.NEQ,
84
+ '!=': TokenType.NEQ,
85
+ '<=': TokenType.LTE,
86
+ '>=': TokenType.GTE,
87
+ '..': TokenType.CONCAT,
88
+ '+=': TokenType.PLUS_EQ,
89
+ '++': TokenType.PLUS_PLUS,
90
+ '-=': TokenType.MINUS_EQ,
91
+ '*=': TokenType.STAR_EQ,
92
+ '/=': TokenType.SLASH_EQ,
93
+ '%=': TokenType.PERCENT_EQ,
94
+ };
95
+ if (twoCharMap[twoChar]) {
96
+ this.advance();
97
+ this.advance();
98
+ this.addToken(twoCharMap[twoChar], twoChar);
99
+ return;
100
+ }
101
+ // Single-char operators
102
+ const singleCharMap = {
103
+ '+': TokenType.PLUS,
104
+ '-': TokenType.MINUS,
105
+ '*': TokenType.STAR,
106
+ '/': TokenType.SLASH,
107
+ '%': TokenType.PERCENT,
108
+ '^': TokenType.CARET,
109
+ '#': TokenType.HASH,
110
+ '=': TokenType.EQUALS,
111
+ '<': TokenType.LT,
112
+ '>': TokenType.GT,
113
+ '(': TokenType.LPAREN,
114
+ ')': TokenType.RPAREN,
115
+ '{': TokenType.LBRACE,
116
+ '}': TokenType.RBRACE,
117
+ '[': TokenType.LBRACKET,
118
+ ']': TokenType.RBRACKET,
119
+ ',': TokenType.COMMA,
120
+ '.': TokenType.DOT,
121
+ ':': TokenType.COLON,
122
+ ';': TokenType.SEMICOLON,
123
+ '?': TokenType.QUESTION,
124
+ };
125
+ if (singleCharMap[ch]) {
126
+ this.advance();
127
+ this.addToken(singleCharMap[ch], ch);
128
+ return;
129
+ }
130
+ // Backticks ` (Used in SQL)
131
+ if (ch === '`') {
132
+ this.advance();
133
+ this.addToken(TokenType.IDENTIFIER, '`'); // Treat backtick as identifier for now or new token
134
+ return;
135
+ }
136
+ // Ampersand & and Pipe | (Commonly requested for bitwise or just skipped)
137
+ if (ch === '&' || ch === '|') {
138
+ this.advance();
139
+ this.addToken(TokenType.IDENTIFIER, ch);
140
+ return;
141
+ }
142
+ // Unknown character
143
+ throw new Error(`Unexpected character '${ch}' at ${this.line}:${this.column}`);
144
+ }
145
+ readLongString() {
146
+ const startLine = this.line;
147
+ const startCol = this.column;
148
+ this.advance();
149
+ this.advance(); // [[
150
+ let value = '';
151
+ while (!this.isEOF()) {
152
+ if (this.current() === ']' && this.peek() === ']') {
153
+ this.advance();
154
+ this.advance();
155
+ this.addToken(TokenType.LONG_STRING, value);
156
+ return;
157
+ }
158
+ if (this.current() === '\n') {
159
+ value += '\n';
160
+ this.line++;
161
+ this.column = 1;
162
+ this.pos++;
163
+ }
164
+ else {
165
+ value += this.current();
166
+ this.advance();
167
+ }
168
+ }
169
+ throw new Error(`Unterminated long string starting at ${startLine}:${startCol}`);
170
+ }
171
+ readString(quote) {
172
+ const startCol = this.column;
173
+ this.advance(); // opening quote
174
+ let value = '';
175
+ while (!this.isEOF() && this.current() !== quote) {
176
+ if (this.current() === '\\') {
177
+ this.advance();
178
+ const escaped = this.current();
179
+ switch (escaped) {
180
+ case 'n':
181
+ value += '\n';
182
+ break;
183
+ case 't':
184
+ value += '\t';
185
+ break;
186
+ case 'r':
187
+ value += '\r';
188
+ break;
189
+ case '\\':
190
+ value += '\\';
191
+ break;
192
+ default: value += escaped;
193
+ }
194
+ }
195
+ else {
196
+ value += this.current();
197
+ }
198
+ this.advance();
199
+ }
200
+ if (this.isEOF()) {
201
+ throw new Error(`Unterminated string at ${this.line}:${startCol}`);
202
+ }
203
+ this.advance(); // closing quote
204
+ this.addToken(TokenType.STRING, value, quote);
205
+ }
206
+ readNumber() {
207
+ let value = '';
208
+ while (!this.isEOF() && (this.isDigit(this.current()) || this.current() === '.')) {
209
+ if (this.current() === '.' && this.peek() === '.')
210
+ break; // range operator
211
+ value += this.current();
212
+ this.advance();
213
+ }
214
+ this.addToken(TokenType.NUMBER, value);
215
+ }
216
+ readIdentifier() {
217
+ let value = '';
218
+ while (!this.isEOF() && this.isAlphaNumeric(this.current())) {
219
+ value += this.current();
220
+ this.advance();
221
+ }
222
+ const type = KEYWORDS[value] ?? TokenType.IDENTIFIER;
223
+ this.addToken(type, value);
224
+ }
225
+ skipWhitespace() {
226
+ while (!this.isEOF()) {
227
+ const ch = this.current();
228
+ if (ch === ' ' || ch === '\t' || ch === '\r') {
229
+ this.advance();
230
+ }
231
+ else if (ch === '\n') {
232
+ this.line++;
233
+ this.column = 1;
234
+ this.pos++;
235
+ }
236
+ else {
237
+ break;
238
+ }
239
+ }
240
+ }
241
+ skipComment() {
242
+ const ch = this.current();
243
+ const next = this.peek();
244
+ // Multiline comment /* ... */
245
+ if (ch === '/' && next === '*') {
246
+ this.advance();
247
+ this.advance();
248
+ while (!this.isEOF()) {
249
+ if (this.current() === '*' && this.peek() === '/') {
250
+ this.advance();
251
+ this.advance();
252
+ return;
253
+ }
254
+ if (this.current() === '\n') {
255
+ this.line++;
256
+ this.column = 1;
257
+ this.pos++;
258
+ }
259
+ else {
260
+ this.advance();
261
+ }
262
+ }
263
+ return;
264
+ }
265
+ // Lua Multiline comment --[[ ... ]]
266
+ if (ch === '-' && next === '-' && this.peekNext() === '[' && this.source[this.pos + 3] === '[') {
267
+ this.advance();
268
+ this.advance();
269
+ this.advance();
270
+ this.advance(); // --[[
271
+ while (!this.isEOF()) {
272
+ if (this.current() === ']' && this.peek() === ']') {
273
+ this.advance();
274
+ this.advance();
275
+ return;
276
+ }
277
+ if (this.current() === '\n') {
278
+ this.line++;
279
+ this.column = 1;
280
+ this.pos++;
281
+ }
282
+ else {
283
+ this.advance();
284
+ }
285
+ }
286
+ return;
287
+ }
288
+ // Skip until end of line
289
+ while (!this.isEOF() && this.current() !== '\n') {
290
+ this.advance();
291
+ }
292
+ }
293
+ addToken(type, value, quote) {
294
+ this.tokens.push({ type, value, line: this.line, column: this.column, quote });
295
+ }
296
+ current() {
297
+ return this.source[this.pos] ?? '\0';
298
+ }
299
+ peek() {
300
+ return this.source[this.pos + 1] ?? '\0';
301
+ }
302
+ peekNext() {
303
+ return this.source[this.pos + 2] ?? '\0';
304
+ }
305
+ advance() {
306
+ this.pos++;
307
+ this.column++;
308
+ }
309
+ isEOF() {
310
+ return this.pos >= this.source.length;
311
+ }
312
+ isDigit(ch) {
313
+ return ch >= '0' && ch <= '9';
314
+ }
315
+ isAlpha(ch) {
316
+ const c = ch.toLowerCase();
317
+ return (c >= 'a' && c <= 'z') || ch === '_';
318
+ }
319
+ isAlphaNumeric(ch) {
320
+ return this.isAlpha(ch) || this.isDigit(ch);
321
+ }
322
+ }
@@ -0,0 +1,109 @@
1
+ /**
2
+ * LT Language Token Types
3
+ * All tokens recognized by the LT compiler
4
+ */
5
+ export declare enum TokenType {
6
+ NUMBER = "NUMBER",
7
+ STRING = "STRING",
8
+ LONG_STRING = "LONG_STRING",
9
+ BOOLEAN = "BOOLEAN",
10
+ NIL = "NIL",
11
+ IDENTIFIER = "IDENTIFIER",
12
+ VAR = "VAR",// global
13
+ LET = "LET",// local
14
+ LOCAL = "LOCAL",// local (Lua compatibility)
15
+ CONST = "CONST",// local <const>
16
+ IF = "IF",
17
+ THEN = "THEN",
18
+ ELSE = "ELSE",
19
+ ELSEIF = "ELSEIF",
20
+ END = "END",
21
+ FOR = "FOR",
22
+ IN = "IN",
23
+ BY = "BY",
24
+ WHILE = "WHILE",
25
+ DO = "DO",
26
+ RETURN = "RETURN",
27
+ BREAK = "BREAK",
28
+ CONTINUE = "CONTINUE",
29
+ SWITCH = "SWITCH",
30
+ CASE = "CASE",
31
+ DEFAULT = "DEFAULT",
32
+ FUNCTION = "FUNCTION",
33
+ FUNC = "FUNC",// func alias
34
+ ARROW = "ARROW",// =>
35
+ SPREAD = "SPREAD",// ...
36
+ GUARD = "GUARD",
37
+ SAFE = "SAFE",
38
+ THREAD = "THREAD",
39
+ LOOP = "LOOP",
40
+ WAIT = "WAIT",
41
+ TIMEOUT = "TIMEOUT",
42
+ INTERVAL = "INTERVAL",
43
+ TRY = "TRY",
44
+ CATCH = "CATCH",
45
+ EMIT = "EMIT",
46
+ EMIT_CLIENT = "EMIT_CLIENT",
47
+ EMIT_SERVER = "EMIT_SERVER",
48
+ EVENT = "EVENT",
49
+ NETEVENT = "NETEVENT",
50
+ EXPORT = "EXPORT",
51
+ COMMAND = "COMMAND",
52
+ AND = "AND",
53
+ OR = "OR",
54
+ NOT = "NOT",
55
+ PLUS = "PLUS",// +
56
+ MINUS = "MINUS",// -
57
+ PLUS_PLUS = "PLUS_PLUS",// ++
58
+ MINUS_MINUS = "MINUS_MINUS",// --
59
+ STAR = "STAR",// *
60
+ SLASH = "SLASH",// /
61
+ PERCENT = "PERCENT",// %
62
+ CARET = "CARET",// ^
63
+ HASH = "HASH",// #
64
+ EQUALS = "EQUALS",// =
65
+ PLUS_EQ = "PLUS_EQ",// +=
66
+ MINUS_EQ = "MINUS_EQ",// -=
67
+ STAR_EQ = "STAR_EQ",// *=
68
+ SLASH_EQ = "SLASH_EQ",// /=
69
+ PERCENT_EQ = "PERCENT_EQ",// %=
70
+ CONCAT_EQ = "CONCAT_EQ",// ..=
71
+ EQ = "EQ",// ==
72
+ NEQ = "NEQ",// ~= or !=
73
+ LT = "LT",// <
74
+ GT = "GT",// >
75
+ LTE = "LTE",// <=
76
+ GTE = "GTE",// >=
77
+ QUESTION = "QUESTION",// ? (Ternary)
78
+ OPT_DOT = "OPT_DOT",// ?.
79
+ OPT_BRACKET = "OPT_BRACKET",// ?[
80
+ NULL_COALESCE = "NULL_COALESCE",// ??
81
+ LPAREN = "LPAREN",// (
82
+ RPAREN = "RPAREN",// )
83
+ LBRACE = "LBRACE",// {
84
+ RBRACE = "RBRACE",// }
85
+ LBRACKET = "LBRACKET",// [
86
+ RBRACKET = "RBRACKET",// ]
87
+ LT_ANGLE = "LT_ANGLE",// < (vector)
88
+ GT_ANGLE = "GT_ANGLE",// > (vector)
89
+ COMMA = "COMMA",// ,
90
+ DOT = "DOT",// .
91
+ COLON = "COLON",// :
92
+ SEMICOLON = "SEMICOLON",// ;
93
+ CONCAT = "CONCAT",// ..
94
+ RANGE = "RANGE",// ..
95
+ EOF = "EOF",
96
+ NEWLINE = "NEWLINE",
97
+ COMMENT = "COMMENT"
98
+ }
99
+ export interface Token {
100
+ type: TokenType;
101
+ value: string;
102
+ line: number;
103
+ column: number;
104
+ quote?: string;
105
+ }
106
+ /**
107
+ * Reserved keywords map
108
+ */
109
+ export declare const KEYWORDS: Record<string, TokenType>;
@@ -0,0 +1,169 @@
1
+ /**
2
+ * LT Language Token Types
3
+ * All tokens recognized by the LT compiler
4
+ */
5
+ export var TokenType;
6
+ (function (TokenType) {
7
+ // Literals
8
+ TokenType["NUMBER"] = "NUMBER";
9
+ TokenType["STRING"] = "STRING";
10
+ TokenType["LONG_STRING"] = "LONG_STRING";
11
+ TokenType["BOOLEAN"] = "BOOLEAN";
12
+ TokenType["NIL"] = "NIL";
13
+ TokenType["IDENTIFIER"] = "IDENTIFIER";
14
+ // Variable Keywords
15
+ TokenType["VAR"] = "VAR";
16
+ TokenType["LET"] = "LET";
17
+ TokenType["LOCAL"] = "LOCAL";
18
+ TokenType["CONST"] = "CONST";
19
+ // Control Flow
20
+ TokenType["IF"] = "IF";
21
+ TokenType["THEN"] = "THEN";
22
+ TokenType["ELSE"] = "ELSE";
23
+ TokenType["ELSEIF"] = "ELSEIF";
24
+ TokenType["END"] = "END";
25
+ TokenType["FOR"] = "FOR";
26
+ TokenType["IN"] = "IN";
27
+ TokenType["BY"] = "BY";
28
+ TokenType["WHILE"] = "WHILE";
29
+ TokenType["DO"] = "DO";
30
+ TokenType["RETURN"] = "RETURN";
31
+ TokenType["BREAK"] = "BREAK";
32
+ TokenType["CONTINUE"] = "CONTINUE";
33
+ TokenType["SWITCH"] = "SWITCH";
34
+ TokenType["CASE"] = "CASE";
35
+ TokenType["DEFAULT"] = "DEFAULT";
36
+ // Functions
37
+ TokenType["FUNCTION"] = "FUNCTION";
38
+ TokenType["FUNC"] = "FUNC";
39
+ TokenType["ARROW"] = "ARROW";
40
+ TokenType["SPREAD"] = "SPREAD";
41
+ // LT Sugar Keywords
42
+ TokenType["GUARD"] = "GUARD";
43
+ TokenType["SAFE"] = "SAFE";
44
+ TokenType["THREAD"] = "THREAD";
45
+ TokenType["LOOP"] = "LOOP";
46
+ TokenType["WAIT"] = "WAIT";
47
+ TokenType["TIMEOUT"] = "TIMEOUT";
48
+ TokenType["INTERVAL"] = "INTERVAL";
49
+ TokenType["TRY"] = "TRY";
50
+ TokenType["CATCH"] = "CATCH";
51
+ // FiveM Events
52
+ TokenType["EMIT"] = "EMIT";
53
+ TokenType["EMIT_CLIENT"] = "EMIT_CLIENT";
54
+ TokenType["EMIT_SERVER"] = "EMIT_SERVER";
55
+ TokenType["EVENT"] = "EVENT";
56
+ TokenType["NETEVENT"] = "NETEVENT";
57
+ TokenType["EXPORT"] = "EXPORT";
58
+ TokenType["COMMAND"] = "COMMAND";
59
+ // Logical
60
+ TokenType["AND"] = "AND";
61
+ TokenType["OR"] = "OR";
62
+ TokenType["NOT"] = "NOT";
63
+ // Operators
64
+ TokenType["PLUS"] = "PLUS";
65
+ TokenType["MINUS"] = "MINUS";
66
+ TokenType["PLUS_PLUS"] = "PLUS_PLUS";
67
+ TokenType["MINUS_MINUS"] = "MINUS_MINUS";
68
+ TokenType["STAR"] = "STAR";
69
+ TokenType["SLASH"] = "SLASH";
70
+ TokenType["PERCENT"] = "PERCENT";
71
+ TokenType["CARET"] = "CARET";
72
+ TokenType["HASH"] = "HASH";
73
+ // Assignment
74
+ TokenType["EQUALS"] = "EQUALS";
75
+ TokenType["PLUS_EQ"] = "PLUS_EQ";
76
+ TokenType["MINUS_EQ"] = "MINUS_EQ";
77
+ TokenType["STAR_EQ"] = "STAR_EQ";
78
+ TokenType["SLASH_EQ"] = "SLASH_EQ";
79
+ TokenType["PERCENT_EQ"] = "PERCENT_EQ";
80
+ TokenType["CONCAT_EQ"] = "CONCAT_EQ";
81
+ // Comparison
82
+ TokenType["EQ"] = "EQ";
83
+ TokenType["NEQ"] = "NEQ";
84
+ TokenType["LT"] = "LT";
85
+ TokenType["GT"] = "GT";
86
+ TokenType["LTE"] = "LTE";
87
+ TokenType["GTE"] = "GTE";
88
+ // Optional Chaining, Null Coalesce, Ternary
89
+ TokenType["QUESTION"] = "QUESTION";
90
+ TokenType["OPT_DOT"] = "OPT_DOT";
91
+ TokenType["OPT_BRACKET"] = "OPT_BRACKET";
92
+ TokenType["NULL_COALESCE"] = "NULL_COALESCE";
93
+ // Delimiters
94
+ TokenType["LPAREN"] = "LPAREN";
95
+ TokenType["RPAREN"] = "RPAREN";
96
+ TokenType["LBRACE"] = "LBRACE";
97
+ TokenType["RBRACE"] = "RBRACE";
98
+ TokenType["LBRACKET"] = "LBRACKET";
99
+ TokenType["RBRACKET"] = "RBRACKET";
100
+ TokenType["LT_ANGLE"] = "LT_ANGLE";
101
+ TokenType["GT_ANGLE"] = "GT_ANGLE";
102
+ // Punctuation
103
+ TokenType["COMMA"] = "COMMA";
104
+ TokenType["DOT"] = "DOT";
105
+ TokenType["COLON"] = "COLON";
106
+ TokenType["SEMICOLON"] = "SEMICOLON";
107
+ TokenType["CONCAT"] = "CONCAT";
108
+ TokenType["RANGE"] = "RANGE";
109
+ // Special
110
+ TokenType["EOF"] = "EOF";
111
+ TokenType["NEWLINE"] = "NEWLINE";
112
+ TokenType["COMMENT"] = "COMMENT";
113
+ })(TokenType || (TokenType = {}));
114
+ /**
115
+ * Reserved keywords map
116
+ */
117
+ export const KEYWORDS = {
118
+ // Variables
119
+ var: TokenType.VAR,
120
+ let: TokenType.LET,
121
+ local: TokenType.LOCAL,
122
+ const: TokenType.CONST,
123
+ // Control Flow
124
+ if: TokenType.IF,
125
+ then: TokenType.THEN,
126
+ else: TokenType.ELSE,
127
+ elseif: TokenType.ELSEIF,
128
+ end: TokenType.END,
129
+ for: TokenType.FOR,
130
+ in: TokenType.IN,
131
+ by: TokenType.BY,
132
+ while: TokenType.WHILE,
133
+ do: TokenType.DO,
134
+ return: TokenType.RETURN,
135
+ break: TokenType.BREAK,
136
+ continue: TokenType.CONTINUE,
137
+ switch: TokenType.SWITCH,
138
+ case: TokenType.CASE,
139
+ default: TokenType.DEFAULT,
140
+ // Functions
141
+ function: TokenType.FUNCTION,
142
+ func: TokenType.FUNC,
143
+ // LT Sugar
144
+ guard: TokenType.GUARD,
145
+ safe: TokenType.SAFE,
146
+ thread: TokenType.THREAD,
147
+ loop: TokenType.LOOP,
148
+ wait: TokenType.WAIT,
149
+ timeout: TokenType.TIMEOUT,
150
+ interval: TokenType.INTERVAL,
151
+ try: TokenType.TRY,
152
+ catch: TokenType.CATCH,
153
+ // FiveM Events
154
+ emit: TokenType.EMIT,
155
+ emitClient: TokenType.EMIT_CLIENT,
156
+ emitServer: TokenType.EMIT_SERVER,
157
+ event: TokenType.EVENT,
158
+ netevent: TokenType.NETEVENT,
159
+ export: TokenType.EXPORT,
160
+ command: TokenType.COMMAND,
161
+ // Logical
162
+ and: TokenType.AND,
163
+ or: TokenType.OR,
164
+ not: TokenType.NOT,
165
+ // Literals
166
+ true: TokenType.BOOLEAN,
167
+ false: TokenType.BOOLEAN,
168
+ nil: TokenType.NIL,
169
+ };