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/parser.js
ADDED
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// GGLang — Parser
|
|
4
|
+
// Recursive-descent parser: transforms a token stream into an AST
|
|
5
|
+
// ============================================================
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.Parser = void 0;
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
// ============================================================
|
|
10
|
+
// Parser Class
|
|
11
|
+
// ============================================================
|
|
12
|
+
class Parser {
|
|
13
|
+
constructor() {
|
|
14
|
+
/** The flat list of tokens produced by the lexer */
|
|
15
|
+
this.tokens = [];
|
|
16
|
+
/** Current position in the token array */
|
|
17
|
+
this.pos = 0;
|
|
18
|
+
}
|
|
19
|
+
// ----------------------------------------------------------
|
|
20
|
+
// Public API
|
|
21
|
+
// ----------------------------------------------------------
|
|
22
|
+
/**
|
|
23
|
+
* Parse a token array into a Program AST node.
|
|
24
|
+
* Expects the token stream to represent: spawn { <statements> }
|
|
25
|
+
*/
|
|
26
|
+
parse(tokens) {
|
|
27
|
+
this.tokens = tokens;
|
|
28
|
+
this.pos = 0;
|
|
29
|
+
// The entire program must be wrapped in spawn { ... }
|
|
30
|
+
this.expect(types_1.TokenType.SPAWN, "Expected 'spawn' to start the program");
|
|
31
|
+
this.expect(types_1.TokenType.LBRACE, "Expected '{' after 'spawn'");
|
|
32
|
+
const body = [];
|
|
33
|
+
// Parse statements until we hit the closing brace
|
|
34
|
+
while (!this.check(types_1.TokenType.RBRACE) && !this.isAtEnd()) {
|
|
35
|
+
body.push(this.parseStatement());
|
|
36
|
+
}
|
|
37
|
+
this.expect(types_1.TokenType.RBRACE, "Expected '}' to close the 'spawn' block");
|
|
38
|
+
// There should be nothing left except EOF
|
|
39
|
+
this.expect(types_1.TokenType.EOF, "Unexpected tokens after end of program");
|
|
40
|
+
return { type: "Program", body };
|
|
41
|
+
}
|
|
42
|
+
// ----------------------------------------------------------
|
|
43
|
+
// Token helpers
|
|
44
|
+
// ----------------------------------------------------------
|
|
45
|
+
/** Look at the current token without consuming it */
|
|
46
|
+
peek() {
|
|
47
|
+
return this.tokens[this.pos];
|
|
48
|
+
}
|
|
49
|
+
/** Consume and return the current token, advancing the cursor */
|
|
50
|
+
advance() {
|
|
51
|
+
const token = this.tokens[this.pos];
|
|
52
|
+
this.pos++;
|
|
53
|
+
return token;
|
|
54
|
+
}
|
|
55
|
+
/** Return true if the current token matches the given type */
|
|
56
|
+
check(type) {
|
|
57
|
+
return this.peek().type === type;
|
|
58
|
+
}
|
|
59
|
+
/** Return true if we have reached EOF */
|
|
60
|
+
isAtEnd() {
|
|
61
|
+
return this.peek().type === types_1.TokenType.EOF;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* If the current token matches any of the given types, consume it and
|
|
65
|
+
* return true. Otherwise leave the cursor alone and return false.
|
|
66
|
+
*/
|
|
67
|
+
match(...types) {
|
|
68
|
+
for (const type of types) {
|
|
69
|
+
if (this.check(type)) {
|
|
70
|
+
this.advance();
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Consume the current token if it matches `type`; otherwise throw a
|
|
78
|
+
* GGParserError with the supplied message.
|
|
79
|
+
*/
|
|
80
|
+
expect(type, errorMsg) {
|
|
81
|
+
if (this.check(type)) {
|
|
82
|
+
return this.advance();
|
|
83
|
+
}
|
|
84
|
+
const current = this.peek();
|
|
85
|
+
throw new types_1.GGParserError(errorMsg, current.line);
|
|
86
|
+
}
|
|
87
|
+
/** Convenience: return the line number of the current token */
|
|
88
|
+
currentLine() {
|
|
89
|
+
return this.peek().line;
|
|
90
|
+
}
|
|
91
|
+
// ----------------------------------------------------------
|
|
92
|
+
// Statement parsing
|
|
93
|
+
// ----------------------------------------------------------
|
|
94
|
+
/** Dispatch to the correct statement parser based on the current token */
|
|
95
|
+
parseStatement() {
|
|
96
|
+
switch (this.peek().type) {
|
|
97
|
+
case types_1.TokenType.EQUIP:
|
|
98
|
+
return this.parseVariableDeclaration(false);
|
|
99
|
+
case types_1.TokenType.ARTIFACT:
|
|
100
|
+
return this.parseVariableDeclaration(true);
|
|
101
|
+
case types_1.TokenType.BROADCAST:
|
|
102
|
+
return this.parsePrintStatement();
|
|
103
|
+
case types_1.TokenType.QUEST:
|
|
104
|
+
return this.parseIfStatement();
|
|
105
|
+
case types_1.TokenType.GRIND:
|
|
106
|
+
return this.parseWhileStatement();
|
|
107
|
+
case types_1.TokenType.RAGE_QUIT:
|
|
108
|
+
return this.parseBreakStatement();
|
|
109
|
+
case types_1.TokenType.RESPAWN:
|
|
110
|
+
return this.parseContinueStatement();
|
|
111
|
+
case types_1.TokenType.SKILL:
|
|
112
|
+
return this.parseFunctionDeclaration();
|
|
113
|
+
case types_1.TokenType.LOOT:
|
|
114
|
+
return this.parseReturnStatement();
|
|
115
|
+
case types_1.TokenType.GLITCH:
|
|
116
|
+
return this.parseThrowStatement();
|
|
117
|
+
case types_1.TokenType.BOSS_FIGHT:
|
|
118
|
+
return this.parseTryCatchStatement();
|
|
119
|
+
case types_1.TokenType.IDENTIFIER:
|
|
120
|
+
return this.parseIdentifierStatement();
|
|
121
|
+
default:
|
|
122
|
+
return this.parseExpressionStatement();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// ---- Variable / constant declaration ----
|
|
126
|
+
// equip <name> = <expr>;
|
|
127
|
+
// artifact <name> = <expr>;
|
|
128
|
+
parseVariableDeclaration(constant) {
|
|
129
|
+
const keyword = this.advance(); // consume EQUIP or ARTIFACT
|
|
130
|
+
const line = keyword.line;
|
|
131
|
+
const nameToken = this.expect(types_1.TokenType.IDENTIFIER, `Expected variable name after '${keyword.value}'`);
|
|
132
|
+
this.expect(types_1.TokenType.EQUALS, "Expected '=' in variable declaration");
|
|
133
|
+
const value = this.parseExpression();
|
|
134
|
+
this.expect(types_1.TokenType.SEMICOLON, "Expected ';' after variable declaration");
|
|
135
|
+
return {
|
|
136
|
+
type: "VariableDeclaration",
|
|
137
|
+
name: nameToken.value,
|
|
138
|
+
value,
|
|
139
|
+
constant,
|
|
140
|
+
line,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
// ---- Identifier-led statements ----
|
|
144
|
+
// Could be assignment, compound assignment, or expression statement.
|
|
145
|
+
// We peek ahead to decide.
|
|
146
|
+
parseIdentifierStatement() {
|
|
147
|
+
const name = this.peek().value;
|
|
148
|
+
const line = this.peek().line;
|
|
149
|
+
// Check the token *after* the identifier to decide
|
|
150
|
+
const nextType = this.tokens[this.pos + 1]?.type;
|
|
151
|
+
// Plain assignment: name = expr ;
|
|
152
|
+
if (nextType === types_1.TokenType.EQUALS) {
|
|
153
|
+
this.advance(); // consume identifier
|
|
154
|
+
this.advance(); // consume =
|
|
155
|
+
const value = this.parseExpression();
|
|
156
|
+
this.expect(types_1.TokenType.SEMICOLON, "Expected ';' after assignment");
|
|
157
|
+
return {
|
|
158
|
+
type: "AssignmentStatement",
|
|
159
|
+
name,
|
|
160
|
+
value,
|
|
161
|
+
line,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
// Compound assignment: name += expr ; (and -=, *=, /=)
|
|
165
|
+
if (nextType === types_1.TokenType.PLUS_EQUALS ||
|
|
166
|
+
nextType === types_1.TokenType.MINUS_EQUALS ||
|
|
167
|
+
nextType === types_1.TokenType.STAR_EQUALS ||
|
|
168
|
+
nextType === types_1.TokenType.SLASH_EQUALS) {
|
|
169
|
+
this.advance(); // consume identifier
|
|
170
|
+
const opToken = this.advance(); // consume compound operator
|
|
171
|
+
const value = this.parseExpression();
|
|
172
|
+
this.expect(types_1.TokenType.SEMICOLON, "Expected ';' after compound assignment");
|
|
173
|
+
return {
|
|
174
|
+
type: "CompoundAssignmentStatement",
|
|
175
|
+
name,
|
|
176
|
+
operator: opToken.value,
|
|
177
|
+
value,
|
|
178
|
+
line,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// Otherwise fall through to expression statement (e.g. function call)
|
|
182
|
+
return this.parseExpressionStatement();
|
|
183
|
+
}
|
|
184
|
+
// ---- Print statement ----
|
|
185
|
+
// broadcast(<expr>);
|
|
186
|
+
parsePrintStatement() {
|
|
187
|
+
const keyword = this.advance(); // consume BROADCAST
|
|
188
|
+
const line = keyword.line;
|
|
189
|
+
this.expect(types_1.TokenType.LPAREN, "Expected '(' after 'broadcast'");
|
|
190
|
+
const value = this.parseExpression();
|
|
191
|
+
this.expect(types_1.TokenType.RPAREN, "Expected ')' after broadcast argument");
|
|
192
|
+
this.expect(types_1.TokenType.SEMICOLON, "Expected ';' after broadcast statement");
|
|
193
|
+
return { type: "PrintStatement", value, line };
|
|
194
|
+
}
|
|
195
|
+
// ---- If / else-if / else ----
|
|
196
|
+
// quest (<expr>) { stmts } [side_quest (<expr>) { stmts }]* [retreat { stmts }]
|
|
197
|
+
parseIfStatement() {
|
|
198
|
+
const keyword = this.advance(); // consume QUEST
|
|
199
|
+
const line = keyword.line;
|
|
200
|
+
// Condition
|
|
201
|
+
this.expect(types_1.TokenType.LPAREN, "Expected '(' after 'quest'");
|
|
202
|
+
const condition = this.parseExpression();
|
|
203
|
+
this.expect(types_1.TokenType.RPAREN, "Expected ')' after quest condition");
|
|
204
|
+
// Body
|
|
205
|
+
const body = this.parseBlock();
|
|
206
|
+
// Optional side_quest (else-if) clauses
|
|
207
|
+
const elseIfClauses = [];
|
|
208
|
+
while (this.check(types_1.TokenType.SIDE_QUEST)) {
|
|
209
|
+
this.advance(); // consume SIDE_QUEST
|
|
210
|
+
this.expect(types_1.TokenType.LPAREN, "Expected '(' after 'side_quest'");
|
|
211
|
+
const elseIfCondition = this.parseExpression();
|
|
212
|
+
this.expect(types_1.TokenType.RPAREN, "Expected ')' after side_quest condition");
|
|
213
|
+
const elseIfBody = this.parseBlock();
|
|
214
|
+
elseIfClauses.push({ condition: elseIfCondition, body: elseIfBody });
|
|
215
|
+
}
|
|
216
|
+
// Optional retreat (else) block
|
|
217
|
+
let elseBody = null;
|
|
218
|
+
if (this.check(types_1.TokenType.RETREAT)) {
|
|
219
|
+
this.advance(); // consume RETREAT
|
|
220
|
+
elseBody = this.parseBlock();
|
|
221
|
+
}
|
|
222
|
+
return { type: "IfStatement", condition, body, elseIfClauses, elseBody, line };
|
|
223
|
+
}
|
|
224
|
+
// ---- While loop ----
|
|
225
|
+
// grind (<expr>) { stmts }
|
|
226
|
+
parseWhileStatement() {
|
|
227
|
+
const keyword = this.advance(); // consume GRIND
|
|
228
|
+
const line = keyword.line;
|
|
229
|
+
this.expect(types_1.TokenType.LPAREN, "Expected '(' after 'grind'");
|
|
230
|
+
const condition = this.parseExpression();
|
|
231
|
+
this.expect(types_1.TokenType.RPAREN, "Expected ')' after grind condition");
|
|
232
|
+
const body = this.parseBlock();
|
|
233
|
+
return { type: "WhileStatement", condition, body, line };
|
|
234
|
+
}
|
|
235
|
+
// ---- Break ----
|
|
236
|
+
// rage_quit;
|
|
237
|
+
parseBreakStatement() {
|
|
238
|
+
const keyword = this.advance(); // consume RAGE_QUIT
|
|
239
|
+
this.expect(types_1.TokenType.SEMICOLON, "Expected ';' after 'rage_quit'");
|
|
240
|
+
return { type: "BreakStatement", line: keyword.line };
|
|
241
|
+
}
|
|
242
|
+
// ---- Continue ----
|
|
243
|
+
// respawn;
|
|
244
|
+
parseContinueStatement() {
|
|
245
|
+
const keyword = this.advance(); // consume RESPAWN
|
|
246
|
+
this.expect(types_1.TokenType.SEMICOLON, "Expected ';' after 'respawn'");
|
|
247
|
+
return { type: "ContinueStatement", line: keyword.line };
|
|
248
|
+
}
|
|
249
|
+
// ---- Function declaration ----
|
|
250
|
+
// skill <name>(<params>) { stmts }
|
|
251
|
+
parseFunctionDeclaration() {
|
|
252
|
+
const keyword = this.advance(); // consume SKILL
|
|
253
|
+
const line = keyword.line;
|
|
254
|
+
const nameToken = this.expect(types_1.TokenType.IDENTIFIER, "Expected function name after 'skill'");
|
|
255
|
+
// Parameter list
|
|
256
|
+
this.expect(types_1.TokenType.LPAREN, "Expected '(' after function name");
|
|
257
|
+
const params = [];
|
|
258
|
+
if (!this.check(types_1.TokenType.RPAREN)) {
|
|
259
|
+
// First parameter
|
|
260
|
+
params.push(this.expect(types_1.TokenType.IDENTIFIER, "Expected parameter name").value);
|
|
261
|
+
// Remaining parameters separated by commas
|
|
262
|
+
while (this.match(types_1.TokenType.COMMA)) {
|
|
263
|
+
params.push(this.expect(types_1.TokenType.IDENTIFIER, "Expected parameter name after ','")
|
|
264
|
+
.value);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
this.expect(types_1.TokenType.RPAREN, "Expected ')' after parameter list");
|
|
268
|
+
// Function body
|
|
269
|
+
const body = this.parseBlock();
|
|
270
|
+
return {
|
|
271
|
+
type: "FunctionDeclaration",
|
|
272
|
+
name: nameToken.value,
|
|
273
|
+
params,
|
|
274
|
+
body,
|
|
275
|
+
line,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
// ---- Return ----
|
|
279
|
+
// loot <expr>; or loot;
|
|
280
|
+
parseReturnStatement() {
|
|
281
|
+
const keyword = this.advance(); // consume LOOT
|
|
282
|
+
const line = keyword.line;
|
|
283
|
+
// If a semicolon follows immediately, it's a bare return
|
|
284
|
+
let value = null;
|
|
285
|
+
if (!this.check(types_1.TokenType.SEMICOLON)) {
|
|
286
|
+
value = this.parseExpression();
|
|
287
|
+
}
|
|
288
|
+
this.expect(types_1.TokenType.SEMICOLON, "Expected ';' after loot statement");
|
|
289
|
+
return { type: "ReturnStatement", value, line };
|
|
290
|
+
}
|
|
291
|
+
// ---- Throw ----
|
|
292
|
+
// glitch <expr>;
|
|
293
|
+
parseThrowStatement() {
|
|
294
|
+
const keyword = this.advance(); // consume GLITCH
|
|
295
|
+
const line = keyword.line;
|
|
296
|
+
const value = this.parseExpression();
|
|
297
|
+
this.expect(types_1.TokenType.SEMICOLON, "Expected ';' after glitch statement");
|
|
298
|
+
return { type: "ThrowStatement", value, line };
|
|
299
|
+
}
|
|
300
|
+
// ---- Try / catch ----
|
|
301
|
+
// boss_fight { stmts } revive (<name>) { stmts }
|
|
302
|
+
parseTryCatchStatement() {
|
|
303
|
+
const keyword = this.advance(); // consume BOSS_FIGHT
|
|
304
|
+
const line = keyword.line;
|
|
305
|
+
const tryBody = this.parseBlock();
|
|
306
|
+
this.expect(types_1.TokenType.REVIVE, "Expected 'revive' after boss_fight block");
|
|
307
|
+
this.expect(types_1.TokenType.LPAREN, "Expected '(' after 'revive'");
|
|
308
|
+
const catchParamToken = this.expect(types_1.TokenType.IDENTIFIER, "Expected error parameter name in revive");
|
|
309
|
+
this.expect(types_1.TokenType.RPAREN, "Expected ')' after revive parameter");
|
|
310
|
+
const catchBody = this.parseBlock();
|
|
311
|
+
return {
|
|
312
|
+
type: "TryCatchStatement",
|
|
313
|
+
tryBody,
|
|
314
|
+
catchParam: catchParamToken.value,
|
|
315
|
+
catchBody,
|
|
316
|
+
line,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
// ---- Expression statement ----
|
|
320
|
+
// <expr>; (typically a function call like attack();)
|
|
321
|
+
parseExpressionStatement() {
|
|
322
|
+
const line = this.currentLine();
|
|
323
|
+
const expression = this.parseExpression();
|
|
324
|
+
this.expect(types_1.TokenType.SEMICOLON, "Expected ';' after expression statement");
|
|
325
|
+
return { type: "ExpressionStatement", expression, line };
|
|
326
|
+
}
|
|
327
|
+
// ----------------------------------------------------------
|
|
328
|
+
// Block parsing helper
|
|
329
|
+
// ----------------------------------------------------------
|
|
330
|
+
/** Parse a brace-delimited block: { statement* } */
|
|
331
|
+
parseBlock() {
|
|
332
|
+
this.expect(types_1.TokenType.LBRACE, "Expected '{' to open block");
|
|
333
|
+
const statements = [];
|
|
334
|
+
while (!this.check(types_1.TokenType.RBRACE) && !this.isAtEnd()) {
|
|
335
|
+
statements.push(this.parseStatement());
|
|
336
|
+
}
|
|
337
|
+
this.expect(types_1.TokenType.RBRACE, "Expected '}' to close block");
|
|
338
|
+
return statements;
|
|
339
|
+
}
|
|
340
|
+
// ----------------------------------------------------------
|
|
341
|
+
// Expression parsing — recursive descent with precedence
|
|
342
|
+
//
|
|
343
|
+
// Precedence (lowest → highest):
|
|
344
|
+
// 1. Logical OR ||
|
|
345
|
+
// 2. Logical AND &&
|
|
346
|
+
// 3. Equality == !=
|
|
347
|
+
// 4. Comparison > < >= <=
|
|
348
|
+
// 5. Additive + -
|
|
349
|
+
// 6. Multiplicative * / %
|
|
350
|
+
// 7. Unary ! - (prefix)
|
|
351
|
+
// 8. Primary literals, identifiers, calls, grouped
|
|
352
|
+
// ----------------------------------------------------------
|
|
353
|
+
/** Entry point for expression parsing */
|
|
354
|
+
parseExpression() {
|
|
355
|
+
return this.parseLogicalOr();
|
|
356
|
+
}
|
|
357
|
+
// ---- Level 1: Logical OR ( || ) ----
|
|
358
|
+
parseLogicalOr() {
|
|
359
|
+
let left = this.parseLogicalAnd();
|
|
360
|
+
while (this.check(types_1.TokenType.OR)) {
|
|
361
|
+
const op = this.advance(); // consume ||
|
|
362
|
+
const right = this.parseLogicalAnd();
|
|
363
|
+
left = {
|
|
364
|
+
type: "LogicalExpression",
|
|
365
|
+
operator: op.value,
|
|
366
|
+
left,
|
|
367
|
+
right,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
return left;
|
|
371
|
+
}
|
|
372
|
+
// ---- Level 2: Logical AND ( && ) ----
|
|
373
|
+
parseLogicalAnd() {
|
|
374
|
+
let left = this.parseEquality();
|
|
375
|
+
while (this.check(types_1.TokenType.AND)) {
|
|
376
|
+
const op = this.advance(); // consume &&
|
|
377
|
+
const right = this.parseEquality();
|
|
378
|
+
left = {
|
|
379
|
+
type: "LogicalExpression",
|
|
380
|
+
operator: op.value,
|
|
381
|
+
left,
|
|
382
|
+
right,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
return left;
|
|
386
|
+
}
|
|
387
|
+
// ---- Level 3: Equality ( == != ) ----
|
|
388
|
+
parseEquality() {
|
|
389
|
+
let left = this.parseComparison();
|
|
390
|
+
while (this.check(types_1.TokenType.DOUBLE_EQUALS) ||
|
|
391
|
+
this.check(types_1.TokenType.NOT_EQUALS)) {
|
|
392
|
+
const op = this.advance();
|
|
393
|
+
const right = this.parseComparison();
|
|
394
|
+
left = {
|
|
395
|
+
type: "BinaryExpression",
|
|
396
|
+
operator: op.value,
|
|
397
|
+
left,
|
|
398
|
+
right,
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
return left;
|
|
402
|
+
}
|
|
403
|
+
// ---- Level 4: Comparison ( > < >= <= ) ----
|
|
404
|
+
parseComparison() {
|
|
405
|
+
let left = this.parseAdditive();
|
|
406
|
+
while (this.check(types_1.TokenType.GREATER) ||
|
|
407
|
+
this.check(types_1.TokenType.LESS) ||
|
|
408
|
+
this.check(types_1.TokenType.GREATER_EQUALS) ||
|
|
409
|
+
this.check(types_1.TokenType.LESS_EQUALS)) {
|
|
410
|
+
const op = this.advance();
|
|
411
|
+
const right = this.parseAdditive();
|
|
412
|
+
left = {
|
|
413
|
+
type: "BinaryExpression",
|
|
414
|
+
operator: op.value,
|
|
415
|
+
left,
|
|
416
|
+
right,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
return left;
|
|
420
|
+
}
|
|
421
|
+
// ---- Level 5: Additive ( + - ) ----
|
|
422
|
+
parseAdditive() {
|
|
423
|
+
let left = this.parseMultiplicative();
|
|
424
|
+
while (this.check(types_1.TokenType.PLUS) || this.check(types_1.TokenType.MINUS)) {
|
|
425
|
+
const op = this.advance();
|
|
426
|
+
const right = this.parseMultiplicative();
|
|
427
|
+
left = {
|
|
428
|
+
type: "BinaryExpression",
|
|
429
|
+
operator: op.value,
|
|
430
|
+
left,
|
|
431
|
+
right,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
return left;
|
|
435
|
+
}
|
|
436
|
+
// ---- Level 6: Multiplicative ( * / % ) ----
|
|
437
|
+
parseMultiplicative() {
|
|
438
|
+
let left = this.parseUnary();
|
|
439
|
+
while (this.check(types_1.TokenType.STAR) ||
|
|
440
|
+
this.check(types_1.TokenType.SLASH) ||
|
|
441
|
+
this.check(types_1.TokenType.PERCENT)) {
|
|
442
|
+
const op = this.advance();
|
|
443
|
+
const right = this.parseUnary();
|
|
444
|
+
left = {
|
|
445
|
+
type: "BinaryExpression",
|
|
446
|
+
operator: op.value,
|
|
447
|
+
left,
|
|
448
|
+
right,
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
return left;
|
|
452
|
+
}
|
|
453
|
+
// ---- Level 7: Unary ( ! - ) ----
|
|
454
|
+
parseUnary() {
|
|
455
|
+
if (this.check(types_1.TokenType.NOT) || this.check(types_1.TokenType.MINUS)) {
|
|
456
|
+
const op = this.advance();
|
|
457
|
+
const operand = this.parseUnary(); // right-recursive for chained unaries
|
|
458
|
+
return {
|
|
459
|
+
type: "UnaryExpression",
|
|
460
|
+
operator: op.value,
|
|
461
|
+
operand,
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
return this.parsePrimary();
|
|
465
|
+
}
|
|
466
|
+
// ---- Level 8: Primary ----
|
|
467
|
+
// number, string, victory, defeat, phantom, identifier / call, grouped (expr)
|
|
468
|
+
parsePrimary() {
|
|
469
|
+
const token = this.peek();
|
|
470
|
+
// Number literal
|
|
471
|
+
if (token.type === types_1.TokenType.NUMBER) {
|
|
472
|
+
this.advance();
|
|
473
|
+
return { type: "NumberLiteral", value: Number(token.value) };
|
|
474
|
+
}
|
|
475
|
+
// String literal
|
|
476
|
+
if (token.type === types_1.TokenType.STRING) {
|
|
477
|
+
this.advance();
|
|
478
|
+
return { type: "StringLiteral", value: token.value };
|
|
479
|
+
}
|
|
480
|
+
// Boolean literal: victory (true)
|
|
481
|
+
if (token.type === types_1.TokenType.VICTORY) {
|
|
482
|
+
this.advance();
|
|
483
|
+
return { type: "BooleanLiteral", value: true };
|
|
484
|
+
}
|
|
485
|
+
// Boolean literal: defeat (false)
|
|
486
|
+
if (token.type === types_1.TokenType.DEFEAT) {
|
|
487
|
+
this.advance();
|
|
488
|
+
return { type: "BooleanLiteral", value: false };
|
|
489
|
+
}
|
|
490
|
+
// Null literal: phantom
|
|
491
|
+
if (token.type === types_1.TokenType.PHANTOM) {
|
|
492
|
+
this.advance();
|
|
493
|
+
return { type: "NullLiteral" };
|
|
494
|
+
}
|
|
495
|
+
// Identifier — may be a simple reference or a function call
|
|
496
|
+
if (token.type === types_1.TokenType.IDENTIFIER) {
|
|
497
|
+
this.advance();
|
|
498
|
+
// If the next token is '(', this is a function call
|
|
499
|
+
if (this.check(types_1.TokenType.LPAREN)) {
|
|
500
|
+
return this.parseCallExpression(token);
|
|
501
|
+
}
|
|
502
|
+
// Plain identifier reference
|
|
503
|
+
return { type: "Identifier", name: token.value };
|
|
504
|
+
}
|
|
505
|
+
// Grouped / parenthesised expression
|
|
506
|
+
if (token.type === types_1.TokenType.LPAREN) {
|
|
507
|
+
this.advance(); // consume (
|
|
508
|
+
const expr = this.parseExpression();
|
|
509
|
+
this.expect(types_1.TokenType.RPAREN, "Expected ')' after grouped expression");
|
|
510
|
+
return expr;
|
|
511
|
+
}
|
|
512
|
+
// Nothing matched — syntax error
|
|
513
|
+
throw new types_1.GGParserError(`Unexpected token '${token.value}' (${token.type})`, token.line);
|
|
514
|
+
}
|
|
515
|
+
// ----------------------------------------------------------
|
|
516
|
+
// Function call parsing helper
|
|
517
|
+
// ----------------------------------------------------------
|
|
518
|
+
/**
|
|
519
|
+
* Called after an identifier token has been consumed and we've confirmed
|
|
520
|
+
* the next token is '('. Parses the argument list and closing ')'.
|
|
521
|
+
*/
|
|
522
|
+
parseCallExpression(calleeToken) {
|
|
523
|
+
this.advance(); // consume (
|
|
524
|
+
const args = [];
|
|
525
|
+
if (!this.check(types_1.TokenType.RPAREN)) {
|
|
526
|
+
// First argument
|
|
527
|
+
args.push(this.parseExpression());
|
|
528
|
+
// Additional arguments separated by commas
|
|
529
|
+
while (this.match(types_1.TokenType.COMMA)) {
|
|
530
|
+
args.push(this.parseExpression());
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
this.expect(types_1.TokenType.RPAREN, "Expected ')' after function arguments");
|
|
534
|
+
return {
|
|
535
|
+
type: "CallExpression",
|
|
536
|
+
callee: calleeToken.value,
|
|
537
|
+
arguments: args,
|
|
538
|
+
line: calleeToken.line,
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
exports.Parser = Parser;
|
|
543
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|