@kawaijs/parser 0.1.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/parser.js ADDED
@@ -0,0 +1,459 @@
1
+ import { createLocation } from '@kawaijs/ast';
2
+ import { KawaError } from './diagnostic.js';
3
+ import { Lexer } from './lexer.js';
4
+ export class Parser {
5
+ tokens;
6
+ file;
7
+ cursor = 0;
8
+ constructor(tokens, file = '<anonymous>') {
9
+ this.tokens = tokens;
10
+ this.file = file;
11
+ }
12
+ static fromSource(source, file = '<anonymous>') {
13
+ const lexer = new Lexer(source, file);
14
+ const tokens = lexer.tokenize();
15
+ return new Parser(tokens, file);
16
+ }
17
+ parse() {
18
+ const startLoc = this.currentLocation();
19
+ const statements = [];
20
+ this.skipNewlines();
21
+ while (!this.isAtEnd()) {
22
+ const stmt = this.parseStatement();
23
+ if (stmt) {
24
+ statements.push(stmt);
25
+ }
26
+ this.skipNewlines();
27
+ }
28
+ const endLoc = this.currentLocation();
29
+ return {
30
+ type: 'Program',
31
+ statements,
32
+ loc: createLocation(this.file, startLoc.start, endLoc.end)
33
+ };
34
+ }
35
+ parseStatement() {
36
+ this.skipNewlines();
37
+ if (this.isAtEnd())
38
+ return null;
39
+ const token = this.peek();
40
+ switch (token.type) {
41
+ case 'CHARACTER':
42
+ return this.parseCharacterDecl();
43
+ case 'LABEL':
44
+ return this.parseLabelDecl();
45
+ case 'SCENE':
46
+ return this.parseSceneStmt();
47
+ case 'SHOW':
48
+ return this.parseShowStmt();
49
+ case 'HIDE':
50
+ return this.parseHideStmt();
51
+ case 'MENU':
52
+ return this.parseMenuStmt();
53
+ case 'JUMP':
54
+ return this.parseJumpStmt();
55
+ case 'RETURN':
56
+ return this.parseReturnStmt();
57
+ case 'SET':
58
+ return this.parseSetStmt();
59
+ case 'IF':
60
+ return this.parseIfStmt();
61
+ case 'PLAY':
62
+ return this.parsePlayStmt();
63
+ case 'STOP':
64
+ return this.parseStopStmt();
65
+ case 'STRING':
66
+ // Narration without speaker identifier
67
+ return this.parseDialogueStmt();
68
+ case 'IDENTIFIER': {
69
+ // Speaker dialogue e.g. yumia "Hello!"
70
+ if (this.peek(1).type === 'STRING') {
71
+ return this.parseDialogueStmt();
72
+ }
73
+ throw new KawaError({
74
+ code: 'E0100',
75
+ message: `Unexpected identifier '${token.value}'. Did you mean to use a command like 'show', 'scene', 'jump' or a dialogue statement?`,
76
+ severity: 'error',
77
+ loc: token.loc
78
+ });
79
+ }
80
+ default:
81
+ throw new KawaError({
82
+ code: 'E0101',
83
+ message: `Unexpected token '${token.value}' (${token.type})`,
84
+ severity: 'error',
85
+ loc: token.loc
86
+ });
87
+ }
88
+ }
89
+ parseCharacterDecl() {
90
+ const startTok = this.consume('CHARACTER', 'Expected "character" keyword');
91
+ const idTok = this.consume('IDENTIFIER', 'Expected character identifier (e.g. yumia)');
92
+ const nameTok = this.consume('STRING', 'Expected character display name in quotes (e.g. "Yumia")');
93
+ let color;
94
+ if (this.check('STRING') || this.check('IDENTIFIER')) {
95
+ color = this.advance().value;
96
+ }
97
+ this.consumeOptionalNewline();
98
+ return {
99
+ type: 'CharacterDecl',
100
+ id: idTok.value,
101
+ displayName: nameTok.value,
102
+ color,
103
+ loc: createLocation(this.file, startTok.loc.start, nameTok.loc.end)
104
+ };
105
+ }
106
+ parseLabelDecl() {
107
+ const startTok = this.consume('LABEL', 'Expected "label" keyword');
108
+ const nameTok = this.consume('IDENTIFIER', 'Expected label name');
109
+ this.consume('COLON', 'Expected ":" after label name');
110
+ this.consumeOptionalNewline();
111
+ const body = this.parseBlock();
112
+ return {
113
+ type: 'LabelDecl',
114
+ name: nameTok.value,
115
+ body,
116
+ loc: createLocation(this.file, startTok.loc.start, this.previousLocation().end)
117
+ };
118
+ }
119
+ parseSceneStmt() {
120
+ const startTok = this.consume('SCENE', 'Expected "scene" keyword');
121
+ // Background can be multiple identifiers e.g. "bg classroom" or "classroom"
122
+ const bgParts = [];
123
+ while (this.check('IDENTIFIER') && this.peek().value !== 'with') {
124
+ bgParts.push(this.advance().value);
125
+ }
126
+ if (bgParts.length === 0) {
127
+ throw new KawaError({
128
+ code: 'E0102',
129
+ message: 'Expected background name after "scene"',
130
+ severity: 'error',
131
+ loc: this.currentLocation()
132
+ });
133
+ }
134
+ let transition;
135
+ if (this.match('WITH')) {
136
+ transition = this.consume('IDENTIFIER', 'Expected transition name after "with"').value;
137
+ }
138
+ this.consumeOptionalNewline();
139
+ return {
140
+ type: 'SceneStmt',
141
+ background: bgParts.join(' '),
142
+ transition,
143
+ loc: createLocation(this.file, startTok.loc.start, this.previousLocation().end)
144
+ };
145
+ }
146
+ parseShowStmt() {
147
+ const startTok = this.consume('SHOW', 'Expected "show" keyword');
148
+ const charTok = this.consume('IDENTIFIER', 'Expected character name after "show"');
149
+ let expression;
150
+ if (this.check('IDENTIFIER') && this.peek().value !== 'at' && this.peek().value !== 'with') {
151
+ expression = this.advance().value;
152
+ }
153
+ let position;
154
+ if (this.match('AT')) {
155
+ position = this.consume('IDENTIFIER', 'Expected position identifier after "at" (e.g. left, center, right)').value;
156
+ }
157
+ let transition;
158
+ if (this.match('WITH')) {
159
+ transition = this.consume('IDENTIFIER', 'Expected transition name after "with"').value;
160
+ }
161
+ this.consumeOptionalNewline();
162
+ return {
163
+ type: 'ShowStmt',
164
+ character: charTok.value,
165
+ expression,
166
+ position,
167
+ transition,
168
+ loc: createLocation(this.file, startTok.loc.start, this.previousLocation().end)
169
+ };
170
+ }
171
+ parseHideStmt() {
172
+ const startTok = this.consume('HIDE', 'Expected "hide" keyword');
173
+ const charTok = this.consume('IDENTIFIER', 'Expected character name after "hide"');
174
+ let transition;
175
+ if (this.match('WITH')) {
176
+ transition = this.consume('IDENTIFIER', 'Expected transition name after "with"').value;
177
+ }
178
+ this.consumeOptionalNewline();
179
+ return {
180
+ type: 'HideStmt',
181
+ character: charTok.value,
182
+ transition,
183
+ loc: createLocation(this.file, startTok.loc.start, this.previousLocation().end)
184
+ };
185
+ }
186
+ parseDialogueStmt() {
187
+ let speaker;
188
+ let startLoc = this.currentLocation();
189
+ if (this.check('IDENTIFIER')) {
190
+ const spkTok = this.advance();
191
+ speaker = spkTok.value;
192
+ startLoc = spkTok.loc;
193
+ }
194
+ const textTok = this.consume('STRING', 'Expected dialogue string');
195
+ this.consumeOptionalNewline();
196
+ return {
197
+ type: 'DialogueStmt',
198
+ speaker,
199
+ text: textTok.value,
200
+ loc: createLocation(this.file, startLoc.start, textTok.loc.end)
201
+ };
202
+ }
203
+ parseMenuStmt() {
204
+ const startTok = this.consume('MENU', 'Expected "menu" keyword');
205
+ this.consume('COLON', 'Expected ":" after menu');
206
+ this.consumeOptionalNewline();
207
+ this.consume('INDENT', 'Expected indented block under "menu:"');
208
+ const choices = [];
209
+ while (!this.check('DEDENT') && !this.isAtEnd()) {
210
+ this.skipNewlines();
211
+ if (this.check('DEDENT') || this.isAtEnd())
212
+ break;
213
+ const choiceTextTok = this.consume('STRING', 'Expected choice option string (e.g. "Say hello":)');
214
+ this.consume('COLON', 'Expected ":" after choice string');
215
+ this.consumeOptionalNewline();
216
+ const choiceBody = this.parseBlock();
217
+ choices.push({
218
+ type: 'ChoiceItem',
219
+ text: choiceTextTok.value,
220
+ body: choiceBody,
221
+ loc: createLocation(this.file, choiceTextTok.loc.start, this.previousLocation().end)
222
+ });
223
+ this.skipNewlines();
224
+ }
225
+ this.consume('DEDENT', 'Expected dedent closing menu block');
226
+ return {
227
+ type: 'MenuStmt',
228
+ choices,
229
+ loc: createLocation(this.file, startTok.loc.start, this.previousLocation().end)
230
+ };
231
+ }
232
+ parseJumpStmt() {
233
+ const startTok = this.consume('JUMP', 'Expected "jump" keyword');
234
+ const labelTok = this.consume('IDENTIFIER', 'Expected target label name after "jump"');
235
+ this.consumeOptionalNewline();
236
+ return {
237
+ type: 'JumpStmt',
238
+ targetLabel: labelTok.value,
239
+ loc: createLocation(this.file, startTok.loc.start, labelTok.loc.end)
240
+ };
241
+ }
242
+ parseReturnStmt() {
243
+ const startTok = this.consume('RETURN', 'Expected "return" keyword');
244
+ this.consumeOptionalNewline();
245
+ return {
246
+ type: 'ReturnStmt',
247
+ loc: startTok.loc
248
+ };
249
+ }
250
+ parseSetStmt() {
251
+ const startTok = this.consume('SET', 'Expected "set" keyword');
252
+ const varTok = this.consume('IDENTIFIER', 'Expected variable name after "set"');
253
+ this.consume('EQUALS', 'Expected "=" in set statement');
254
+ let value;
255
+ if (this.check('STRING')) {
256
+ value = this.advance().value;
257
+ }
258
+ else if (this.check('NUMBER')) {
259
+ value = Number(this.advance().value);
260
+ }
261
+ else if (this.check('BOOLEAN')) {
262
+ value = this.advance().value === 'true';
263
+ }
264
+ else if (this.check('IDENTIFIER')) {
265
+ value = this.advance().value;
266
+ }
267
+ else {
268
+ throw new KawaError({
269
+ code: 'E0103',
270
+ message: 'Expected string, number, or boolean value in set assignment',
271
+ severity: 'error',
272
+ loc: this.currentLocation()
273
+ });
274
+ }
275
+ this.consumeOptionalNewline();
276
+ return {
277
+ type: 'SetStmt',
278
+ variable: varTok.value,
279
+ value,
280
+ loc: createLocation(this.file, startTok.loc.start, this.previousLocation().end)
281
+ };
282
+ }
283
+ parseIfStmt() {
284
+ const startTok = this.consume('IF', 'Expected "if" keyword');
285
+ const condition = this.readUntilColon();
286
+ this.consume('COLON', 'Expected ":" after if condition');
287
+ this.consumeOptionalNewline();
288
+ const thenBranch = this.parseBlock();
289
+ const elifBranches = [];
290
+ let elseBranch;
291
+ while (this.check('ELIF')) {
292
+ const elifTok = this.advance();
293
+ const elifCond = this.readUntilColon();
294
+ this.consume('COLON', 'Expected ":" after elif condition');
295
+ this.consumeOptionalNewline();
296
+ const elifBody = this.parseBlock();
297
+ elifBranches.push({
298
+ type: 'ElifBranch',
299
+ condition: elifCond,
300
+ body: elifBody,
301
+ loc: createLocation(this.file, elifTok.loc.start, this.previousLocation().end)
302
+ });
303
+ }
304
+ if (this.check('ELSE')) {
305
+ const elseTok = this.advance();
306
+ this.consume('COLON', 'Expected ":" after else');
307
+ this.consumeOptionalNewline();
308
+ const elseBody = this.parseBlock();
309
+ elseBranch = {
310
+ type: 'ElseBranch',
311
+ body: elseBody,
312
+ loc: createLocation(this.file, elseTok.loc.start, this.previousLocation().end)
313
+ };
314
+ }
315
+ return {
316
+ type: 'IfStmt',
317
+ condition,
318
+ thenBranch,
319
+ elifBranches,
320
+ elseBranch,
321
+ loc: createLocation(this.file, startTok.loc.start, this.previousLocation().end)
322
+ };
323
+ }
324
+ parsePlayStmt() {
325
+ const startTok = this.consume('PLAY', 'Expected "play" keyword');
326
+ const channelTok = this.advance();
327
+ if (channelTok.type !== 'MUSIC' && channelTok.type !== 'SOUND' && channelTok.type !== 'VOICE') {
328
+ throw new KawaError({
329
+ code: 'E0104',
330
+ message: 'Expected channel (music, sound, or voice) after "play"',
331
+ severity: 'error',
332
+ loc: channelTok.loc
333
+ });
334
+ }
335
+ const trackTok = this.consume('IDENTIFIER', 'Expected audio track name');
336
+ let fade;
337
+ let loop = channelTok.type === 'MUSIC';
338
+ while (this.check('FADEIN') || this.check('LOOP')) {
339
+ if (this.match('FADEIN')) {
340
+ fade = Number(this.consume('NUMBER', 'Expected number of seconds for fadein').value);
341
+ }
342
+ else if (this.match('LOOP')) {
343
+ loop = true;
344
+ }
345
+ }
346
+ this.consumeOptionalNewline();
347
+ return {
348
+ type: 'PlayStmt',
349
+ channel: channelTok.value.toLowerCase(),
350
+ track: trackTok.value,
351
+ fade,
352
+ loop,
353
+ loc: createLocation(this.file, startTok.loc.start, this.previousLocation().end)
354
+ };
355
+ }
356
+ parseStopStmt() {
357
+ const startTok = this.consume('STOP', 'Expected "stop" keyword');
358
+ const channelTok = this.advance();
359
+ if (channelTok.type !== 'MUSIC' && channelTok.type !== 'SOUND' && channelTok.type !== 'VOICE') {
360
+ throw new KawaError({
361
+ code: 'E0105',
362
+ message: 'Expected channel (music, sound, or voice) after "stop"',
363
+ severity: 'error',
364
+ loc: channelTok.loc
365
+ });
366
+ }
367
+ let fade;
368
+ if (this.match('FADEOUT')) {
369
+ fade = Number(this.consume('NUMBER', 'Expected number of seconds for fadeout').value);
370
+ }
371
+ this.consumeOptionalNewline();
372
+ return {
373
+ type: 'StopStmt',
374
+ channel: channelTok.value.toLowerCase(),
375
+ fade,
376
+ loc: createLocation(this.file, startTok.loc.start, this.previousLocation().end)
377
+ };
378
+ }
379
+ parseBlock() {
380
+ this.consume('INDENT', 'Expected indented block');
381
+ const statements = [];
382
+ while (!this.check('DEDENT') && !this.isAtEnd()) {
383
+ this.skipNewlines();
384
+ if (this.check('DEDENT') || this.isAtEnd())
385
+ break;
386
+ const stmt = this.parseStatement();
387
+ if (stmt) {
388
+ statements.push(stmt);
389
+ }
390
+ this.skipNewlines();
391
+ }
392
+ this.consume('DEDENT', 'Expected dedent to close block');
393
+ return statements;
394
+ }
395
+ readUntilColon() {
396
+ const parts = [];
397
+ while (!this.check('COLON') && !this.check('NEWLINE') && !this.isAtEnd()) {
398
+ parts.push(this.advance().value);
399
+ }
400
+ return parts.join(' ');
401
+ }
402
+ skipNewlines() {
403
+ while (this.check('NEWLINE')) {
404
+ this.advance();
405
+ }
406
+ }
407
+ consumeOptionalNewline() {
408
+ if (this.check('NEWLINE')) {
409
+ this.advance();
410
+ }
411
+ }
412
+ match(type) {
413
+ if (this.check(type)) {
414
+ this.advance();
415
+ return true;
416
+ }
417
+ return false;
418
+ }
419
+ check(type) {
420
+ if (this.isAtEnd())
421
+ return false;
422
+ return this.peek().type === type;
423
+ }
424
+ consume(type, errorMessage) {
425
+ if (this.check(type)) {
426
+ return this.advance();
427
+ }
428
+ const current = this.peek();
429
+ throw new KawaError({
430
+ code: 'E0106',
431
+ message: `${errorMessage}, but found '${current.value}' (${current.type})`,
432
+ severity: 'error',
433
+ loc: current.loc
434
+ });
435
+ }
436
+ advance() {
437
+ if (!this.isAtEnd()) {
438
+ this.cursor += 1;
439
+ }
440
+ return this.previous();
441
+ }
442
+ isAtEnd() {
443
+ return this.peek().type === 'EOF';
444
+ }
445
+ peek(offset = 0) {
446
+ const idx = this.cursor + offset;
447
+ return idx < this.tokens.length ? this.tokens[idx] : this.tokens[this.tokens.length - 1];
448
+ }
449
+ previous() {
450
+ return this.tokens[this.cursor - 1];
451
+ }
452
+ currentLocation() {
453
+ return this.peek().loc;
454
+ }
455
+ previousLocation() {
456
+ return this.previous().loc;
457
+ }
458
+ }
459
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { SourceLocation } from '@kawaijs/ast';
2
+ export type TokenType = 'CHARACTER' | 'LABEL' | 'SCENE' | 'SHOW' | 'HIDE' | 'AT' | 'WITH' | 'MENU' | 'JUMP' | 'RETURN' | 'SET' | 'IF' | 'ELIF' | 'ELSE' | 'PLAY' | 'STOP' | 'MUSIC' | 'SOUND' | 'VOICE' | 'FADEIN' | 'FADEOUT' | 'LOOP' | 'IDENTIFIER' | 'STRING' | 'NUMBER' | 'BOOLEAN' | 'COLON' | 'EQUALS' | 'COMMA' | 'NEWLINE' | 'INDENT' | 'DEDENT' | 'EOF';
3
+ export interface Token {
4
+ readonly type: TokenType;
5
+ readonly value: string;
6
+ readonly loc: SourceLocation;
7
+ }
8
+ export declare const KEYWORDS: Record<string, TokenType>;
9
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,MAAM,SAAS,GAEjB,WAAW,GACX,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,IAAI,GACJ,MAAM,GACN,MAAM,GACN,MAAM,GACN,QAAQ,GACR,KAAK,GACL,IAAI,GACJ,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,QAAQ,GACR,SAAS,GACT,MAAM,GAEN,YAAY,GACZ,QAAQ,GACR,QAAQ,GACR,SAAS,GAET,OAAO,GACP,QAAQ,GACR,OAAO,GAEP,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,KAAK,CAAC;AAEV,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;CAC9B;AAED,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAyB9C,CAAC"}
package/dist/token.js ADDED
@@ -0,0 +1,27 @@
1
+ export const KEYWORDS = {
2
+ character: 'CHARACTER',
3
+ label: 'LABEL',
4
+ scene: 'SCENE',
5
+ show: 'SHOW',
6
+ hide: 'HIDE',
7
+ at: 'AT',
8
+ with: 'WITH',
9
+ menu: 'MENU',
10
+ jump: 'JUMP',
11
+ return: 'RETURN',
12
+ set: 'SET',
13
+ if: 'IF',
14
+ elif: 'ELIF',
15
+ else: 'ELSE',
16
+ play: 'PLAY',
17
+ stop: 'STOP',
18
+ music: 'MUSIC',
19
+ sound: 'SOUND',
20
+ voice: 'VOICE',
21
+ fadein: 'FADEIN',
22
+ fadeout: 'FADEOUT',
23
+ loop: 'LOOP',
24
+ true: 'BOOLEAN',
25
+ false: 'BOOLEAN'
26
+ };
27
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"AA+CA,MAAM,CAAC,MAAM,QAAQ,GAA8B;IACjD,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,IAAI;IACR,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;IACV,EAAE,EAAE,IAAI;IACR,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;CACjB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@kawaijs/parser",
3
+ "version": "0.1.0",
4
+ "description": "Lexer, Parser, Compiler, and Diagnostics for Kawa Script",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "type": "module",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/biagio-scaglia/KawaiJS.git",
17
+ "directory": "packages/parser"
18
+ },
19
+ "bugs": {
20
+ "url": "https://github.com/biagio-scaglia/KawaiJS/issues"
21
+ },
22
+ "homepage": "https://github.com/biagio-scaglia/KawaiJS#readme",
23
+ "scripts": {
24
+ "build": "tsc",
25
+ "typecheck": "tsc --noEmit"
26
+ },
27
+ "dependencies": {
28
+ "@kawaijs/ast": "^0.1.0"
29
+ },
30
+ "keywords": [
31
+ "kawaijs",
32
+ "parser",
33
+ "compiler",
34
+ "visual-novel",
35
+ "renpy"
36
+ ],
37
+ "author": "Biagio Scaglia",
38
+ "license": "MIT"
39
+ }