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/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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"}
@@ -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"}