gglang 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 +158 -0
- package/dist/environment.d.ts +45 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +95 -0
- package/dist/environment.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +199 -0
- package/dist/index.js.map +1 -0
- package/dist/interpreter.d.ts +121 -0
- package/dist/interpreter.d.ts.map +1 -0
- package/dist/interpreter.js +564 -0
- package/dist/interpreter.js.map +1 -0
- package/dist/lexer.d.ts +76 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +371 -0
- package/dist/lexer.js.map +1 -0
- package/dist/parser.d.ts +64 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +543 -0
- package/dist/parser.js.map +1 -0
- package/dist/types.d.ts +205 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +92 -0
- package/dist/types.js.map +1 -0
- package/docs/DOCUMENTATION.md +904 -0
- package/package.json +37 -0
package/dist/lexer.js
ADDED
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// GGLang — Lexer (Tokenizer)
|
|
4
|
+
// Scans raw source code and produces an array of Tokens.
|
|
5
|
+
// ============================================================
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.Lexer = void 0;
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
// ---- Keyword lookup table ----
|
|
10
|
+
// Maps GGLang keyword strings to their corresponding TokenType.
|
|
11
|
+
const KEYWORDS = {
|
|
12
|
+
spawn: types_1.TokenType.SPAWN,
|
|
13
|
+
equip: types_1.TokenType.EQUIP,
|
|
14
|
+
artifact: types_1.TokenType.ARTIFACT,
|
|
15
|
+
broadcast: types_1.TokenType.BROADCAST,
|
|
16
|
+
quest: types_1.TokenType.QUEST,
|
|
17
|
+
side_quest: types_1.TokenType.SIDE_QUEST,
|
|
18
|
+
retreat: types_1.TokenType.RETREAT,
|
|
19
|
+
grind: types_1.TokenType.GRIND,
|
|
20
|
+
rage_quit: types_1.TokenType.RAGE_QUIT,
|
|
21
|
+
respawn: types_1.TokenType.RESPAWN,
|
|
22
|
+
skill: types_1.TokenType.SKILL,
|
|
23
|
+
loot: types_1.TokenType.LOOT,
|
|
24
|
+
victory: types_1.TokenType.VICTORY,
|
|
25
|
+
defeat: types_1.TokenType.DEFEAT,
|
|
26
|
+
phantom: types_1.TokenType.PHANTOM,
|
|
27
|
+
glitch: types_1.TokenType.GLITCH,
|
|
28
|
+
boss_fight: types_1.TokenType.BOSS_FIGHT,
|
|
29
|
+
revive: types_1.TokenType.REVIVE,
|
|
30
|
+
};
|
|
31
|
+
// ============================================================
|
|
32
|
+
// Lexer class
|
|
33
|
+
// ============================================================
|
|
34
|
+
class Lexer {
|
|
35
|
+
constructor() {
|
|
36
|
+
this.source = "";
|
|
37
|
+
this.tokens = [];
|
|
38
|
+
this.cursor = 0;
|
|
39
|
+
this.line = 1;
|
|
40
|
+
this.column = 1;
|
|
41
|
+
}
|
|
42
|
+
// ----------------------------------------------------------
|
|
43
|
+
// Public API
|
|
44
|
+
// ----------------------------------------------------------
|
|
45
|
+
/**
|
|
46
|
+
* Tokenize the given source code string and return an array
|
|
47
|
+
* of Token objects. The array always ends with an EOF token.
|
|
48
|
+
*/
|
|
49
|
+
tokenize(source) {
|
|
50
|
+
// Reset state for a fresh scan
|
|
51
|
+
this.source = source;
|
|
52
|
+
this.tokens = [];
|
|
53
|
+
this.cursor = 0;
|
|
54
|
+
this.line = 1;
|
|
55
|
+
this.column = 1;
|
|
56
|
+
// Main scanning loop — consume characters until EOF
|
|
57
|
+
while (!this.isAtEnd()) {
|
|
58
|
+
this.scanToken();
|
|
59
|
+
}
|
|
60
|
+
// Always close the token stream with EOF
|
|
61
|
+
this.tokens.push({
|
|
62
|
+
type: types_1.TokenType.EOF,
|
|
63
|
+
value: "",
|
|
64
|
+
line: this.line,
|
|
65
|
+
column: this.column,
|
|
66
|
+
});
|
|
67
|
+
return this.tokens;
|
|
68
|
+
}
|
|
69
|
+
// ----------------------------------------------------------
|
|
70
|
+
// Core scanning
|
|
71
|
+
// ----------------------------------------------------------
|
|
72
|
+
/**
|
|
73
|
+
* Identify and consume the next token starting at the current cursor.
|
|
74
|
+
*/
|
|
75
|
+
scanToken() {
|
|
76
|
+
const ch = this.peek();
|
|
77
|
+
// ---- Whitespace ----
|
|
78
|
+
if (this.isWhitespace(ch)) {
|
|
79
|
+
this.advance(); // skip it; advance() updates line/column
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// ---- Comments ----
|
|
83
|
+
if (ch === "/" && this.peekNext() === "/") {
|
|
84
|
+
this.skipLineComment();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (ch === "/" && this.peekNext() === "*") {
|
|
88
|
+
this.skipBlockComment();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// ---- Strings ----
|
|
92
|
+
if (ch === '"' || ch === "'") {
|
|
93
|
+
this.readString(ch);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// ---- Numbers ----
|
|
97
|
+
if (this.isDigit(ch)) {
|
|
98
|
+
this.readNumber();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// ---- Identifiers & keywords ----
|
|
102
|
+
if (this.isAlpha(ch)) {
|
|
103
|
+
this.readIdentifier();
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// ---- Two-character operators (checked before single-char) ----
|
|
107
|
+
const twoChar = ch + this.peekNext();
|
|
108
|
+
const twoCharType = this.matchTwoCharOp(twoChar);
|
|
109
|
+
if (twoCharType !== null) {
|
|
110
|
+
const startCol = this.column;
|
|
111
|
+
this.advance(); // consume first char
|
|
112
|
+
this.advance(); // consume second char
|
|
113
|
+
this.addToken(twoCharType, twoChar, this.line, startCol);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// ---- Single-character operators / punctuation ----
|
|
117
|
+
const singleType = this.matchSingleCharOp(ch);
|
|
118
|
+
if (singleType !== null) {
|
|
119
|
+
const startCol = this.column;
|
|
120
|
+
this.advance();
|
|
121
|
+
this.addToken(singleType, ch, this.line, startCol);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// ---- Unexpected character ----
|
|
125
|
+
throw new types_1.GGLexerError(`Unexpected character '${ch}'`, this.line, this.column);
|
|
126
|
+
}
|
|
127
|
+
// ----------------------------------------------------------
|
|
128
|
+
// Character helpers
|
|
129
|
+
// ----------------------------------------------------------
|
|
130
|
+
/** Returns true when the cursor has reached (or passed) the end of source. */
|
|
131
|
+
isAtEnd() {
|
|
132
|
+
return this.cursor >= this.source.length;
|
|
133
|
+
}
|
|
134
|
+
/** Return the character at the cursor WITHOUT advancing. */
|
|
135
|
+
peek() {
|
|
136
|
+
return this.source[this.cursor];
|
|
137
|
+
}
|
|
138
|
+
/** Return the character one past the cursor, or empty string if at end. */
|
|
139
|
+
peekNext() {
|
|
140
|
+
if (this.cursor + 1 >= this.source.length)
|
|
141
|
+
return "";
|
|
142
|
+
return this.source[this.cursor + 1];
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Consume the current character and advance cursor, line, and column.
|
|
146
|
+
* Returns the consumed character.
|
|
147
|
+
*/
|
|
148
|
+
advance() {
|
|
149
|
+
const ch = this.source[this.cursor];
|
|
150
|
+
this.cursor++;
|
|
151
|
+
if (ch === "\n") {
|
|
152
|
+
this.line++;
|
|
153
|
+
this.column = 1;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
this.column++;
|
|
157
|
+
}
|
|
158
|
+
return ch;
|
|
159
|
+
}
|
|
160
|
+
// ----------------------------------------------------------
|
|
161
|
+
// Classification helpers
|
|
162
|
+
// ----------------------------------------------------------
|
|
163
|
+
isWhitespace(ch) {
|
|
164
|
+
return ch === " " || ch === "\t" || ch === "\r" || ch === "\n";
|
|
165
|
+
}
|
|
166
|
+
isDigit(ch) {
|
|
167
|
+
return ch >= "0" && ch <= "9";
|
|
168
|
+
}
|
|
169
|
+
/** Letters and underscore — valid start of an identifier. */
|
|
170
|
+
isAlpha(ch) {
|
|
171
|
+
return ((ch >= "a" && ch <= "z") ||
|
|
172
|
+
(ch >= "A" && ch <= "Z") ||
|
|
173
|
+
ch === "_");
|
|
174
|
+
}
|
|
175
|
+
/** Letters, digits, and underscore — valid continuation of an identifier. */
|
|
176
|
+
isAlphaNumeric(ch) {
|
|
177
|
+
return this.isAlpha(ch) || this.isDigit(ch);
|
|
178
|
+
}
|
|
179
|
+
// ----------------------------------------------------------
|
|
180
|
+
// Token emitter
|
|
181
|
+
// ----------------------------------------------------------
|
|
182
|
+
addToken(type, value, line, column) {
|
|
183
|
+
this.tokens.push({ type, value, line, column });
|
|
184
|
+
}
|
|
185
|
+
// ----------------------------------------------------------
|
|
186
|
+
// Operator matching
|
|
187
|
+
// ----------------------------------------------------------
|
|
188
|
+
/**
|
|
189
|
+
* Try to match a two-character operator string.
|
|
190
|
+
* Returns the TokenType if it matches, or null otherwise.
|
|
191
|
+
*/
|
|
192
|
+
matchTwoCharOp(op) {
|
|
193
|
+
switch (op) {
|
|
194
|
+
case "==": return types_1.TokenType.DOUBLE_EQUALS;
|
|
195
|
+
case "!=": return types_1.TokenType.NOT_EQUALS;
|
|
196
|
+
case ">=": return types_1.TokenType.GREATER_EQUALS;
|
|
197
|
+
case "<=": return types_1.TokenType.LESS_EQUALS;
|
|
198
|
+
case "+=": return types_1.TokenType.PLUS_EQUALS;
|
|
199
|
+
case "-=": return types_1.TokenType.MINUS_EQUALS;
|
|
200
|
+
case "*=": return types_1.TokenType.STAR_EQUALS;
|
|
201
|
+
case "/=": return types_1.TokenType.SLASH_EQUALS;
|
|
202
|
+
case "&&": return types_1.TokenType.AND;
|
|
203
|
+
case "||": return types_1.TokenType.OR;
|
|
204
|
+
default: return null;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Match a single-character operator or punctuation symbol.
|
|
209
|
+
* Returns the TokenType if it matches, or null otherwise.
|
|
210
|
+
*/
|
|
211
|
+
matchSingleCharOp(ch) {
|
|
212
|
+
switch (ch) {
|
|
213
|
+
case "+": return types_1.TokenType.PLUS;
|
|
214
|
+
case "-": return types_1.TokenType.MINUS;
|
|
215
|
+
case "*": return types_1.TokenType.STAR;
|
|
216
|
+
case "/": return types_1.TokenType.SLASH;
|
|
217
|
+
case "%": return types_1.TokenType.PERCENT;
|
|
218
|
+
case "=": return types_1.TokenType.EQUALS;
|
|
219
|
+
case ">": return types_1.TokenType.GREATER;
|
|
220
|
+
case "<": return types_1.TokenType.LESS;
|
|
221
|
+
case "!": return types_1.TokenType.NOT;
|
|
222
|
+
case ";": return types_1.TokenType.SEMICOLON;
|
|
223
|
+
case ",": return types_1.TokenType.COMMA;
|
|
224
|
+
case "(": return types_1.TokenType.LPAREN;
|
|
225
|
+
case ")": return types_1.TokenType.RPAREN;
|
|
226
|
+
case "{": return types_1.TokenType.LBRACE;
|
|
227
|
+
case "}": return types_1.TokenType.RBRACE;
|
|
228
|
+
default: return null;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// ----------------------------------------------------------
|
|
232
|
+
// Complex token readers
|
|
233
|
+
// ----------------------------------------------------------
|
|
234
|
+
/**
|
|
235
|
+
* Read a number literal (integer or floating-point).
|
|
236
|
+
* Examples: 42, 3.14
|
|
237
|
+
*/
|
|
238
|
+
readNumber() {
|
|
239
|
+
const startCol = this.column;
|
|
240
|
+
const startLine = this.line;
|
|
241
|
+
let value = "";
|
|
242
|
+
// Consume integer part
|
|
243
|
+
while (!this.isAtEnd() && this.isDigit(this.peek())) {
|
|
244
|
+
value += this.advance();
|
|
245
|
+
}
|
|
246
|
+
// Check for a decimal point followed by more digits
|
|
247
|
+
if (!this.isAtEnd() && this.peek() === "." && this.isDigit(this.peekNext())) {
|
|
248
|
+
value += this.advance(); // consume '.'
|
|
249
|
+
while (!this.isAtEnd() && this.isDigit(this.peek())) {
|
|
250
|
+
value += this.advance();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
this.addToken(types_1.TokenType.NUMBER, value, startLine, startCol);
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Read a string literal enclosed by the given quote character.
|
|
257
|
+
* Supports escape sequences: \n, \t, \\, \", \'
|
|
258
|
+
* Throws GGLexerError on unterminated strings.
|
|
259
|
+
*/
|
|
260
|
+
readString(quote) {
|
|
261
|
+
const startCol = this.column;
|
|
262
|
+
const startLine = this.line;
|
|
263
|
+
this.advance(); // consume opening quote
|
|
264
|
+
let value = "";
|
|
265
|
+
while (!this.isAtEnd()) {
|
|
266
|
+
const ch = this.peek();
|
|
267
|
+
// End of string
|
|
268
|
+
if (ch === quote) {
|
|
269
|
+
this.advance(); // consume closing quote
|
|
270
|
+
this.addToken(types_1.TokenType.STRING, value, startLine, startCol);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
// Newlines are not allowed inside strings (unterminated)
|
|
274
|
+
if (ch === "\n") {
|
|
275
|
+
throw new types_1.GGLexerError("Unterminated string literal", startLine, startCol);
|
|
276
|
+
}
|
|
277
|
+
// Escape sequences
|
|
278
|
+
if (ch === "\\") {
|
|
279
|
+
this.advance(); // consume backslash
|
|
280
|
+
if (this.isAtEnd()) {
|
|
281
|
+
throw new types_1.GGLexerError("Unterminated string literal", startLine, startCol);
|
|
282
|
+
}
|
|
283
|
+
const escaped = this.advance();
|
|
284
|
+
switch (escaped) {
|
|
285
|
+
case "n":
|
|
286
|
+
value += "\n";
|
|
287
|
+
break;
|
|
288
|
+
case "t":
|
|
289
|
+
value += "\t";
|
|
290
|
+
break;
|
|
291
|
+
case "\\":
|
|
292
|
+
value += "\\";
|
|
293
|
+
break;
|
|
294
|
+
case '"':
|
|
295
|
+
value += '"';
|
|
296
|
+
break;
|
|
297
|
+
case "'":
|
|
298
|
+
value += "'";
|
|
299
|
+
break;
|
|
300
|
+
default:
|
|
301
|
+
// Unknown escape — keep it verbatim
|
|
302
|
+
value += "\\" + escaped;
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
// Regular character
|
|
308
|
+
value += this.advance();
|
|
309
|
+
}
|
|
310
|
+
// If we fall through, the string was never closed
|
|
311
|
+
throw new types_1.GGLexerError("Unterminated string literal", startLine, startCol);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Read an identifier or keyword.
|
|
315
|
+
* Identifiers start with a letter or underscore, then continue
|
|
316
|
+
* with letters, digits, or underscores.
|
|
317
|
+
*/
|
|
318
|
+
readIdentifier() {
|
|
319
|
+
const startCol = this.column;
|
|
320
|
+
const startLine = this.line;
|
|
321
|
+
let value = "";
|
|
322
|
+
while (!this.isAtEnd() && this.isAlphaNumeric(this.peek())) {
|
|
323
|
+
value += this.advance();
|
|
324
|
+
}
|
|
325
|
+
// Check if the identifier is actually a keyword
|
|
326
|
+
const keywordType = KEYWORDS[value];
|
|
327
|
+
if (keywordType !== undefined) {
|
|
328
|
+
this.addToken(keywordType, value, startLine, startCol);
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
this.addToken(types_1.TokenType.IDENTIFIER, value, startLine, startCol);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// ----------------------------------------------------------
|
|
335
|
+
// Comment skipping
|
|
336
|
+
// ----------------------------------------------------------
|
|
337
|
+
/** Skip a single-line comment (// ... until end of line). */
|
|
338
|
+
skipLineComment() {
|
|
339
|
+
// Consume the two '/' characters
|
|
340
|
+
this.advance();
|
|
341
|
+
this.advance();
|
|
342
|
+
// Consume everything until newline or EOF
|
|
343
|
+
while (!this.isAtEnd() && this.peek() !== "\n") {
|
|
344
|
+
this.advance();
|
|
345
|
+
}
|
|
346
|
+
// The newline itself will be consumed by the main loop as whitespace
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Skip a block comment (/* ... * /).
|
|
350
|
+
* Throws GGLexerError if the comment is never closed.
|
|
351
|
+
*/
|
|
352
|
+
skipBlockComment() {
|
|
353
|
+
const startLine = this.line;
|
|
354
|
+
const startCol = this.column;
|
|
355
|
+
// Consume '/' and '*'
|
|
356
|
+
this.advance();
|
|
357
|
+
this.advance();
|
|
358
|
+
while (!this.isAtEnd()) {
|
|
359
|
+
if (this.peek() === "*" && this.peekNext() === "/") {
|
|
360
|
+
this.advance(); // consume '*'
|
|
361
|
+
this.advance(); // consume '/'
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
this.advance();
|
|
365
|
+
}
|
|
366
|
+
// Reached EOF without closing the block comment
|
|
367
|
+
throw new types_1.GGLexerError("Unterminated block comment", startLine, startCol);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
exports.Lexer = Lexer;
|
|
371
|
+
//# sourceMappingURL=lexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexer.js","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"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"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Token, Program } from "./types";
|
|
2
|
+
export declare class Parser {
|
|
3
|
+
/** The flat list of tokens produced by the lexer */
|
|
4
|
+
private tokens;
|
|
5
|
+
/** Current position in the token array */
|
|
6
|
+
private pos;
|
|
7
|
+
/**
|
|
8
|
+
* Parse a token array into a Program AST node.
|
|
9
|
+
* Expects the token stream to represent: spawn { <statements> }
|
|
10
|
+
*/
|
|
11
|
+
parse(tokens: Token[]): Program;
|
|
12
|
+
/** Look at the current token without consuming it */
|
|
13
|
+
private peek;
|
|
14
|
+
/** Consume and return the current token, advancing the cursor */
|
|
15
|
+
private advance;
|
|
16
|
+
/** Return true if the current token matches the given type */
|
|
17
|
+
private check;
|
|
18
|
+
/** Return true if we have reached EOF */
|
|
19
|
+
private isAtEnd;
|
|
20
|
+
/**
|
|
21
|
+
* If the current token matches any of the given types, consume it and
|
|
22
|
+
* return true. Otherwise leave the cursor alone and return false.
|
|
23
|
+
*/
|
|
24
|
+
private match;
|
|
25
|
+
/**
|
|
26
|
+
* Consume the current token if it matches `type`; otherwise throw a
|
|
27
|
+
* GGParserError with the supplied message.
|
|
28
|
+
*/
|
|
29
|
+
private expect;
|
|
30
|
+
/** Convenience: return the line number of the current token */
|
|
31
|
+
private currentLine;
|
|
32
|
+
/** Dispatch to the correct statement parser based on the current token */
|
|
33
|
+
private parseStatement;
|
|
34
|
+
private parseVariableDeclaration;
|
|
35
|
+
private parseIdentifierStatement;
|
|
36
|
+
private parsePrintStatement;
|
|
37
|
+
private parseIfStatement;
|
|
38
|
+
private parseWhileStatement;
|
|
39
|
+
private parseBreakStatement;
|
|
40
|
+
private parseContinueStatement;
|
|
41
|
+
private parseFunctionDeclaration;
|
|
42
|
+
private parseReturnStatement;
|
|
43
|
+
private parseThrowStatement;
|
|
44
|
+
private parseTryCatchStatement;
|
|
45
|
+
private parseExpressionStatement;
|
|
46
|
+
/** Parse a brace-delimited block: { statement* } */
|
|
47
|
+
private parseBlock;
|
|
48
|
+
/** Entry point for expression parsing */
|
|
49
|
+
private parseExpression;
|
|
50
|
+
private parseLogicalOr;
|
|
51
|
+
private parseLogicalAnd;
|
|
52
|
+
private parseEquality;
|
|
53
|
+
private parseComparison;
|
|
54
|
+
private parseAdditive;
|
|
55
|
+
private parseMultiplicative;
|
|
56
|
+
private parseUnary;
|
|
57
|
+
private parsePrimary;
|
|
58
|
+
/**
|
|
59
|
+
* Called after an identifier token has been consumed and we've confirmed
|
|
60
|
+
* the next token is '('. Parses the argument list and closing ')'.
|
|
61
|
+
*/
|
|
62
|
+
private parseCallExpression;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,EACL,OAAO,EA2BR,MAAM,SAAS,CAAC;AAMjB,qBAAa,MAAM;IACjB,oDAAoD;IACpD,OAAO,CAAC,MAAM,CAAe;IAC7B,0CAA0C;IAC1C,OAAO,CAAC,GAAG,CAAa;IAMxB;;;OAGG;IACH,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO;IA2B/B,qDAAqD;IACrD,OAAO,CAAC,IAAI;IAIZ,iEAAiE;IACjE,OAAO,CAAC,OAAO;IAMf,8DAA8D;IAC9D,OAAO,CAAC,KAAK;IAIb,yCAAyC;IACzC,OAAO,CAAC,OAAO;IAIf;;;OAGG;IACH,OAAO,CAAC,KAAK;IAUb;;;OAGG;IACH,OAAO,CAAC,MAAM;IAQd,+DAA+D;IAC/D,OAAO,CAAC,WAAW;IAQnB,0EAA0E;IAC1E,OAAO,CAAC,cAAc;IAmCtB,OAAO,CAAC,wBAAwB;IAyBhC,OAAO,CAAC,wBAAwB;IAmDhC,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,gBAAgB;IAoCxB,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,wBAAwB;IA0ChC,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,sBAAsB;IA4B9B,OAAO,CAAC,wBAAwB;IAchC,oDAAoD;IACpD,OAAO,CAAC,UAAU;IAwBlB,yCAAyC;IACzC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,mBAAmB;IAuB3B,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,YAAY;IAiEpB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CAsB5B"}
|