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.
- package/LICENSE +21 -0
- package/README.md +33 -0
- package/dist/cli/ltc.d.ts +2 -0
- package/dist/cli/ltc.js +134 -0
- package/dist/cli/utils.d.ts +2 -0
- package/dist/cli/utils.js +26 -0
- package/dist/cli/watch.d.ts +1 -0
- package/dist/cli/watch.js +42 -0
- package/dist/compiler/codegen/LuaEmitter.d.ts +59 -0
- package/dist/compiler/codegen/LuaEmitter.js +748 -0
- package/dist/compiler/lexer/Lexer.d.ts +31 -0
- package/dist/compiler/lexer/Lexer.js +322 -0
- package/dist/compiler/lexer/Token.d.ts +109 -0
- package/dist/compiler/lexer/Token.js +169 -0
- package/dist/compiler/parser/AST.d.ts +314 -0
- package/dist/compiler/parser/AST.js +60 -0
- package/dist/compiler/parser/Parser.d.ts +68 -0
- package/dist/compiler/parser/Parser.js +873 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +12 -0
- package/package.json +33 -0
|
@@ -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
|
+
};
|