@naiv/swan-dsl 0.0.1

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.
@@ -0,0 +1,466 @@
1
+ "use strict";
2
+ // ─────────────────────────────────────────────────────────────────────────────
3
+ // SWAN DSL — Hand-crafted Recursive Descent Parser
4
+ // ─────────────────────────────────────────────────────────────────────────────
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Parser = void 0;
7
+ exports.parse = parse;
8
+ const lexer_1 = require("./lexer");
9
+ const types_1 = require("./types");
10
+ // ---------------------------------------------------------------------------
11
+ // Token stream helpers
12
+ // ---------------------------------------------------------------------------
13
+ /** Tokens we actively care about (skip WS, NL, COMMENT). */
14
+ const SKIP_TYPES = new Set(["WS", "NL", "COMMENT"]);
15
+ class Parser {
16
+ tokens = [];
17
+ pos = 0;
18
+ constructor(input) {
19
+ lexer_1.lexer.reset(input);
20
+ for (const tok of lexer_1.lexer) {
21
+ if (!SKIP_TYPES.has(tok.type ?? "")) {
22
+ this.tokens.push(tok);
23
+ }
24
+ }
25
+ }
26
+ // ─── Token stream primitives ──────────────────────────────────────────────
27
+ peek() {
28
+ return this.tokens[this.pos];
29
+ }
30
+ advance() {
31
+ const tok = this.tokens[this.pos];
32
+ if (!tok)
33
+ throw new types_1.ParseError("Unexpected end of input", { line: 0, col: 0 });
34
+ this.pos++;
35
+ return tok;
36
+ }
37
+ isAtEnd() {
38
+ return this.pos >= this.tokens.length;
39
+ }
40
+ tokenPos(tok) {
41
+ return { line: tok.line, col: tok.col };
42
+ }
43
+ currentPos() {
44
+ const tok = this.peek();
45
+ return tok ? this.tokenPos(tok) : { line: 0, col: 0 };
46
+ }
47
+ /**
48
+ * Expect a token of the given type (or value) and advance.
49
+ * Throws ParseError if the next token doesn't match.
50
+ */
51
+ expect(typeOrValue) {
52
+ const tok = this.peek();
53
+ if (!tok) {
54
+ throw new types_1.ParseError(`Expected "${typeOrValue}" but reached end of input`, { line: 0, col: 0 });
55
+ }
56
+ if (tok.type !== typeOrValue && tok.value !== typeOrValue) {
57
+ throw new types_1.ParseError(`Expected "${typeOrValue}" but got "${tok.value}" (${tok.type})`, this.tokenPos(tok));
58
+ }
59
+ return this.advance();
60
+ }
61
+ /**
62
+ * Consume a token only if it matches the given type/value.
63
+ */
64
+ match(typeOrValue) {
65
+ const tok = this.peek();
66
+ if (tok && (tok.type === typeOrValue || tok.value === typeOrValue)) {
67
+ return this.advance();
68
+ }
69
+ return null;
70
+ }
71
+ check(typeOrValue) {
72
+ const tok = this.peek();
73
+ return tok !== undefined &&
74
+ (tok.type === typeOrValue || tok.value === typeOrValue);
75
+ }
76
+ // ─── Entry point ──────────────────────────────────────────────────────────
77
+ parseProgram() {
78
+ const app = this.parseAppDecl();
79
+ const pages = [];
80
+ const components = [];
81
+ while (!this.isAtEnd()) {
82
+ const tok = this.peek();
83
+ if (tok.type === "page") {
84
+ pages.push(this.parsePageDecl());
85
+ }
86
+ else if (tok.type === "component") {
87
+ components.push(this.parseComponentDecl());
88
+ }
89
+ else {
90
+ throw new types_1.ParseError(`Unexpected token "${tok.value}" — expected "page" or "component"`, this.tokenPos(tok));
91
+ }
92
+ }
93
+ return { kind: "Program", app, pages, components };
94
+ }
95
+ // ─── App declaration ──────────────────────────────────────────────────────
96
+ parseAppDecl() {
97
+ const appTok = this.expect("app");
98
+ const nameTok = this.expectIdent();
99
+ this.expect("LBRACE");
100
+ this.expect("entry");
101
+ const entryTok = this.expectIdent();
102
+ this.expect("RBRACE");
103
+ return {
104
+ kind: "AppDecl",
105
+ name: nameTok.value,
106
+ entry: entryTok.value,
107
+ pos: this.tokenPos(appTok),
108
+ };
109
+ }
110
+ // ─── Page declaration ────────────────────────────────────────────────────
111
+ parsePageDecl() {
112
+ const pageTok = this.expect("page");
113
+ const nameTok = this.expectIdent();
114
+ const body = this.parseBlock();
115
+ return {
116
+ kind: "PageDecl",
117
+ name: nameTok.value,
118
+ body,
119
+ pos: this.tokenPos(pageTok),
120
+ };
121
+ }
122
+ // ─── Component declaration ───────────────────────────────────────────────
123
+ parseComponentDecl() {
124
+ const compTok = this.expect("component");
125
+ const nameTok = this.expectIdent();
126
+ const body = this.parseBlock();
127
+ return {
128
+ kind: "ComponentDecl",
129
+ name: nameTok.value,
130
+ body,
131
+ pos: this.tokenPos(compTok),
132
+ };
133
+ }
134
+ // ─── Block ────────────────────────────────────────────────────────────────
135
+ parseBlock() {
136
+ this.expect("LBRACE");
137
+ const stmts = [];
138
+ while (!this.check("RBRACE") && !this.isAtEnd()) {
139
+ stmts.push(this.parseStatement());
140
+ }
141
+ this.expect("RBRACE");
142
+ return stmts;
143
+ }
144
+ // ─── Statements ──────────────────────────────────────────────────────────
145
+ parseStatement() {
146
+ const tok = this.peek();
147
+ if (!tok) {
148
+ throw new types_1.ParseError("Unexpected end of input inside block", {
149
+ line: 0,
150
+ col: 0,
151
+ });
152
+ }
153
+ switch (tok.type) {
154
+ case "header": return this.parseHeaderStmt();
155
+ case "text": return this.parseTextStmt();
156
+ case "button": return this.parseButtonStmt();
157
+ case "link": return this.parseLinkStmt();
158
+ case "field": return this.parseFieldStmt();
159
+ case "input": return this.parseInputStmt();
160
+ case "use": return this.parseUseStmt();
161
+ case "submit": return this.parseSubmitStmt();
162
+ case "click": return this.parseClickStmt();
163
+ case "on": return this.parseHandlerStmt();
164
+ case "if": return this.parseConditionalStmt();
165
+ default:
166
+ throw new types_1.ParseError(`Unexpected token "${tok.value}" — not a valid statement keyword`, this.tokenPos(tok));
167
+ }
168
+ }
169
+ // -- UI statements ---------------------------------------------------------
170
+ parseHeaderStmt() {
171
+ const kw = this.expect("header");
172
+ const str = this.expectString();
173
+ return { kind: "HeaderStmt", text: str.value, pos: this.tokenPos(kw) };
174
+ }
175
+ parseTextStmt() {
176
+ const kw = this.expect("text");
177
+ const str = this.expectString();
178
+ return { kind: "TextStmt", text: str.value, pos: this.tokenPos(kw) };
179
+ }
180
+ parseButtonStmt() {
181
+ const kw = this.expect("button");
182
+ const str = this.expectString();
183
+ const nav = this.parseNavTarget();
184
+ return { kind: "ButtonStmt", label: str.value, nav, pos: this.tokenPos(kw) };
185
+ }
186
+ parseLinkStmt() {
187
+ const kw = this.expect("link");
188
+ const str = this.expectString();
189
+ const nav = this.parseNavTarget();
190
+ return { kind: "LinkStmt", label: str.value, nav, pos: this.tokenPos(kw) };
191
+ }
192
+ parseFieldStmt() {
193
+ const kw = this.expect("field");
194
+ const id = this.expectIdent();
195
+ return { kind: "FieldStmt", name: id.value, pos: this.tokenPos(kw) };
196
+ }
197
+ parseInputStmt() {
198
+ const kw = this.expect("input");
199
+ const id = this.expectIdent();
200
+ return { kind: "InputStmt", name: id.value, pos: this.tokenPos(kw) };
201
+ }
202
+ // -- Component use ---------------------------------------------------------
203
+ parseUseStmt() {
204
+ const kw = this.expect("use");
205
+ const id = this.expectIdent();
206
+ return { kind: "UseStmt", component: id.value, pos: this.tokenPos(kw) };
207
+ }
208
+ // -- Action statements -----------------------------------------------------
209
+ parseSubmitStmt() {
210
+ const kw = this.expect("submit");
211
+ const str = this.expectString();
212
+ this.expect("ARROW");
213
+ const id = this.expectIdent();
214
+ return {
215
+ kind: "SubmitStmt",
216
+ label: str.value,
217
+ action: id.value,
218
+ pos: this.tokenPos(kw),
219
+ };
220
+ }
221
+ parseClickStmt() {
222
+ const kw = this.expect("click");
223
+ const str = this.expectString();
224
+ this.expect("ARROW");
225
+ const id = this.expectIdent();
226
+ return {
227
+ kind: "ClickStmt",
228
+ label: str.value,
229
+ action: id.value,
230
+ pos: this.tokenPos(kw),
231
+ };
232
+ }
233
+ // -- Handler statement -----------------------------------------------------
234
+ parseHandlerStmt() {
235
+ const kw = this.expect("on");
236
+ const actionTok = this.expectIdent();
237
+ this.expect("LBRACE");
238
+ const outcomes = [];
239
+ while (!this.check("RBRACE") && !this.isAtEnd()) {
240
+ outcomes.push(this.parseOutcomeClause());
241
+ }
242
+ this.expect("RBRACE");
243
+ return {
244
+ kind: "HandlerStmt",
245
+ action: actionTok.value,
246
+ outcomes,
247
+ pos: this.tokenPos(kw),
248
+ };
249
+ }
250
+ parseOutcomeClause() {
251
+ const outcomeTok = this.expectIdent();
252
+ const arrowTok = this.expect("ARROW");
253
+ const targetTok = this.expectIdent();
254
+ return {
255
+ outcome: outcomeTok.value,
256
+ target: targetTok.value,
257
+ pos: this.tokenPos(outcomeTok),
258
+ };
259
+ }
260
+ // -- Conditional statement -------------------------------------------------
261
+ parseConditionalStmt() {
262
+ const kw = this.expect("if");
263
+ const condition = this.parseExpression();
264
+ const body = this.parseBlock();
265
+ return { kind: "ConditionalStmt", condition, body, pos: this.tokenPos(kw) };
266
+ }
267
+ // ─── Navigation target ────────────────────────────────────────────────────
268
+ parseNavTarget() {
269
+ const arrowTok = this.expect("ARROW");
270
+ const targetTok = this.expectIdent();
271
+ return { target: targetTok.value, pos: this.tokenPos(arrowTok) };
272
+ }
273
+ // ─── Expressions (operator precedence, left-to-right) ────────────────────
274
+ //
275
+ // Precedence (lowest → highest):
276
+ // 1. || (binary OR)
277
+ // 2. && (binary AND)
278
+ // 3. == != < > <= >= (comparison)
279
+ // 4. primary / unary !
280
+ parseExpression() {
281
+ return this.parseOr();
282
+ }
283
+ parseOr() {
284
+ let left = this.parseAnd();
285
+ while (this.check("OR")) {
286
+ const opTok = this.advance();
287
+ const right = this.parseAnd();
288
+ const expr = {
289
+ kind: "BinaryExpr",
290
+ operator: "||",
291
+ left,
292
+ right,
293
+ pos: this.tokenPos(opTok),
294
+ };
295
+ left = expr;
296
+ }
297
+ return left;
298
+ }
299
+ parseAnd() {
300
+ let left = this.parseComparison();
301
+ while (this.check("AND")) {
302
+ const opTok = this.advance();
303
+ const right = this.parseComparison();
304
+ const expr = {
305
+ kind: "BinaryExpr",
306
+ operator: "&&",
307
+ left,
308
+ right,
309
+ pos: this.tokenPos(opTok),
310
+ };
311
+ left = expr;
312
+ }
313
+ return left;
314
+ }
315
+ COMPARISON_OPS = new Map([
316
+ ["EQ", "=="],
317
+ ["NEQ", "!="],
318
+ ["LT", "<"],
319
+ ["GT", ">"],
320
+ ["LTE", "<="],
321
+ ["GTE", ">="],
322
+ ]);
323
+ parseComparison() {
324
+ let left = this.parseUnary();
325
+ const tok = this.peek();
326
+ if (tok && this.COMPARISON_OPS.has(tok.type ?? "")) {
327
+ const opTok = this.advance();
328
+ const operator = this.COMPARISON_OPS.get(opTok.type ?? "");
329
+ const right = this.parseUnary();
330
+ const expr = {
331
+ kind: "BinaryExpr",
332
+ operator,
333
+ left,
334
+ right,
335
+ pos: this.tokenPos(opTok),
336
+ };
337
+ return expr;
338
+ }
339
+ return left;
340
+ }
341
+ parseUnary() {
342
+ if (this.check("BANG")) {
343
+ const bangTok = this.advance();
344
+ const operand = this.parsePrimary();
345
+ const expr = {
346
+ kind: "UnaryExpr",
347
+ operator: "!",
348
+ operand,
349
+ pos: this.tokenPos(bangTok),
350
+ };
351
+ return expr;
352
+ }
353
+ return this.parsePrimary();
354
+ }
355
+ parsePrimary() {
356
+ const tok = this.peek();
357
+ if (!tok) {
358
+ throw new types_1.ParseError("Expected an expression but reached end of input", {
359
+ line: 0,
360
+ col: 0,
361
+ });
362
+ }
363
+ // Boolean literal
364
+ if (tok.type === "true" || tok.type === "false") {
365
+ this.advance();
366
+ const lit = {
367
+ kind: "BooleanLiteral",
368
+ value: tok.type === "true",
369
+ pos: this.tokenPos(tok),
370
+ };
371
+ return lit;
372
+ }
373
+ // String literal
374
+ if (tok.type === "STRING") {
375
+ this.advance();
376
+ const lit = {
377
+ kind: "StringLiteral",
378
+ value: tok.value,
379
+ pos: this.tokenPos(tok),
380
+ };
381
+ return lit;
382
+ }
383
+ // Number literal
384
+ if (tok.type === "NUMBER") {
385
+ this.advance();
386
+ const lit = {
387
+ kind: "NumberLiteral",
388
+ value: parseFloat(tok.value),
389
+ pos: this.tokenPos(tok),
390
+ };
391
+ return lit;
392
+ }
393
+ // Identifier or member expression (user.role)
394
+ if (tok.type === "IDENT") {
395
+ this.advance();
396
+ const base = {
397
+ kind: "IdentifierExpr",
398
+ name: tok.value,
399
+ pos: this.tokenPos(tok),
400
+ };
401
+ if (this.check("DOT")) {
402
+ this.advance(); // consume "."
403
+ const memberTok = this.expectIdent();
404
+ const member = {
405
+ kind: "MemberExpr",
406
+ object: base,
407
+ member: memberTok.value,
408
+ pos: this.tokenPos(tok),
409
+ };
410
+ return member;
411
+ }
412
+ return base;
413
+ }
414
+ throw new types_1.ParseError(`Unexpected token "${tok.value}" in expression`, this.tokenPos(tok));
415
+ }
416
+ // ─── Small helpers ───────────────────────────────────────────────────────
417
+ /**
418
+ * Expect an IDENT token (not a keyword).
419
+ * Moo assigns keyword token types to matched words, so we need to accept
420
+ * both generic IDENT tokens and keyword tokens when used as identifiers
421
+ * (e.g. outcome labels like "success", "error").
422
+ */
423
+ expectIdent() {
424
+ const tok = this.peek();
425
+ if (!tok) {
426
+ throw new types_1.ParseError("Expected identifier but reached end of input", {
427
+ line: 0,
428
+ col: 0,
429
+ });
430
+ }
431
+ // Idents are either IDENT type or a keyword being used as a plain word
432
+ // (e.g. outcome names like "success"/"error" inside on-blocks).
433
+ // We accept any non-punctuation, non-literal, non-operator token.
434
+ const tokType = tok.type ?? "";
435
+ const isIdentLike = tokType === "IDENT" ||
436
+ // keywords can appear as outcome clause labels (e.g. "success", "error")
437
+ // so accept them here
438
+ [
439
+ "app", "page", "component", "entry", "use", "header", "text",
440
+ "button", "link", "field", "input", "submit", "click", "on", "if",
441
+ "true", "false", // generally disallowed as ident elsewhere; allowed in outcomes
442
+ ].includes(tokType);
443
+ if (!isIdentLike) {
444
+ throw new types_1.ParseError(`Expected identifier but got "${tok.value}" (${tok.type})`, this.tokenPos(tok));
445
+ }
446
+ return this.advance();
447
+ }
448
+ expectString() {
449
+ const tok = this.peek();
450
+ if (!tok || tok.type !== "STRING") {
451
+ const pos = tok ? this.tokenPos(tok) : { line: 0, col: 0 };
452
+ const got = tok ? `"${tok.value}"` : "end of input";
453
+ throw new types_1.ParseError(`Expected string literal but got ${got}`, pos);
454
+ }
455
+ return this.advance();
456
+ }
457
+ }
458
+ exports.Parser = Parser;
459
+ // ---------------------------------------------------------------------------
460
+ // Convenience parse function (accepts a DSL source string)
461
+ // ---------------------------------------------------------------------------
462
+ function parse(source) {
463
+ const parser = new Parser(source);
464
+ return parser.parseProgram();
465
+ }
466
+ //# 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,7 @@
1
+ import { type Program } from "./types";
2
+ export interface SemanticCheckOptions {
3
+ /** Enable SR-4: all pages must be reachable from the entry page */
4
+ strictMode?: boolean;
5
+ }
6
+ export declare function checkSemantics(program: Program, options?: SemanticCheckOptions): void;
7
+ //# sourceMappingURL=semantic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../src/semantic.ts"],"names":[],"mappings":"AAKA,OAAO,EAOH,KAAK,OAAO,EAEf,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,oBAAoB;IACjC,mEAAmE;IACnE,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,cAAc,CAC1B,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,oBAAyB,GACnC,IAAI,CAGN"}