flow-lang 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.
@@ -0,0 +1,443 @@
1
+ import { TokenType } from "../types/index.js";
2
+ import { createError } from "../errors/index.js";
3
+ // ============================================================
4
+ // Keyword tables
5
+ // ============================================================
6
+ // Multi-word keywords, sorted longest-first for greedy matching
7
+ const COMPOUND_KEYWORDS = [
8
+ "does not exist",
9
+ "is not empty",
10
+ "otherwise if",
11
+ "divided by",
12
+ "rounded to",
13
+ "on failure",
14
+ "on timeout",
15
+ "if still failing",
16
+ "is at least",
17
+ "is at most",
18
+ "is not",
19
+ "is above",
20
+ "is below",
21
+ "is empty",
22
+ "for each",
23
+ "save the result as",
24
+ "save the confidence as",
25
+ ];
26
+ const SINGLE_KEYWORDS = new Set([
27
+ "workflow",
28
+ "config",
29
+ "services",
30
+ "trigger",
31
+ "step",
32
+ "if",
33
+ "otherwise",
34
+ "for",
35
+ "each",
36
+ "in",
37
+ "set",
38
+ "to",
39
+ "ask",
40
+ "save",
41
+ "the",
42
+ "result",
43
+ "as",
44
+ "confidence",
45
+ "using",
46
+ "with",
47
+ "at",
48
+ "on",
49
+ "is",
50
+ "contains",
51
+ "exists",
52
+ "and",
53
+ "or",
54
+ "not",
55
+ "complete",
56
+ "reject",
57
+ "log",
58
+ "skip",
59
+ "retry",
60
+ "times",
61
+ "waiting",
62
+ "every",
63
+ "when",
64
+ "manual",
65
+ "plus",
66
+ "minus",
67
+ "env",
68
+ ]);
69
+ // ============================================================
70
+ // Lexer error class
71
+ // ============================================================
72
+ export class LexerError extends Error {
73
+ flowError;
74
+ constructor(flowError) {
75
+ super(flowError.message);
76
+ this.name = "LexerError";
77
+ this.flowError = flowError;
78
+ }
79
+ }
80
+ // ============================================================
81
+ // Tokenizer
82
+ // ============================================================
83
+ export function tokenize(source, fileName = "<input>") {
84
+ const tokens = [];
85
+ const indentStack = [0];
86
+ let pos = 0;
87
+ let line = 1;
88
+ let column = 1;
89
+ // Whether we're at the start of a line (need to check indentation)
90
+ let atLineStart = true;
91
+ function peek() {
92
+ return source[pos] ?? "\0";
93
+ }
94
+ function peekAt(offset) {
95
+ return source[pos + offset] ?? "\0";
96
+ }
97
+ function advance() {
98
+ const ch = source[pos] ?? "\0";
99
+ pos++;
100
+ if (ch === "\n") {
101
+ line++;
102
+ column = 1;
103
+ }
104
+ else {
105
+ column++;
106
+ }
107
+ return ch;
108
+ }
109
+ function makeToken(type, value, startLine, startCol) {
110
+ return { type, value, line: startLine, column: startCol };
111
+ }
112
+ function error(message, suggestion, hint) {
113
+ return new LexerError(createError(fileName, line, column, message, source, { suggestion, hint }));
114
+ }
115
+ // Check if the rest of the line (from pos) matches a string (case-insensitive for keywords)
116
+ function matchAhead(text) {
117
+ for (let i = 0; i < text.length; i++) {
118
+ const srcChar = source[pos + i];
119
+ if (srcChar === undefined)
120
+ return false;
121
+ if (srcChar.toLowerCase() !== text[i].toLowerCase())
122
+ return false;
123
+ }
124
+ // The character after the match must be non-alphanumeric (word boundary)
125
+ const afterChar = source[pos + text.length];
126
+ if (afterChar !== undefined && /[a-zA-Z0-9_]/.test(afterChar))
127
+ return false;
128
+ return true;
129
+ }
130
+ // --------------------------------------------------------
131
+ // Indentation handling
132
+ // --------------------------------------------------------
133
+ function handleIndentation() {
134
+ let spaces = 0;
135
+ const indentStartLine = line;
136
+ const indentStartCol = column;
137
+ while (pos < source.length && peek() === " ") {
138
+ advance();
139
+ spaces++;
140
+ }
141
+ // Check for tabs
142
+ if (peek() === "\t") {
143
+ throw error("Tabs are not allowed in Flow. Please use spaces (4 per indent level).", "Replace all tabs with 4 spaces.", "Most editors can convert tabs to spaces automatically.\nLook for \"Convert Indentation to Spaces\" in your editor's command palette.");
144
+ }
145
+ // Skip blank lines and comment-only lines
146
+ if (peek() === "\n" || peek() === "\r" || peek() === "\0" || peek() === "#") {
147
+ return;
148
+ }
149
+ const currentIndent = indentStack[indentStack.length - 1] ?? 0;
150
+ if (spaces > currentIndent) {
151
+ // Increased indentation
152
+ if ((spaces - currentIndent) !== 4) {
153
+ throw error(`Unexpected indentation. I expected ${currentIndent + 4} spaces but found ${spaces}.`, "Flow uses exactly 4 spaces for each indent level.", "Make sure each nested block is indented exactly 4 more spaces than its parent.");
154
+ }
155
+ indentStack.push(spaces);
156
+ tokens.push(makeToken(TokenType.INDENT, "INDENT", indentStartLine, indentStartCol));
157
+ }
158
+ else if (spaces < currentIndent) {
159
+ // Decreased indentation — may need multiple DEDENTs
160
+ while (indentStack.length > 1 && (indentStack[indentStack.length - 1] ?? 0) > spaces) {
161
+ indentStack.pop();
162
+ tokens.push(makeToken(TokenType.DEDENT, "DEDENT", indentStartLine, indentStartCol));
163
+ }
164
+ if ((indentStack[indentStack.length - 1] ?? 0) !== spaces) {
165
+ throw error(`Indentation doesn't match any outer block. Found ${spaces} spaces.`, "Make sure your indentation lines up with a previous block.", "Each indent level in Flow is exactly 4 spaces.");
166
+ }
167
+ }
168
+ // If spaces === currentIndent, no INDENT/DEDENT needed
169
+ }
170
+ // --------------------------------------------------------
171
+ // String scanning (with interpolation support)
172
+ // --------------------------------------------------------
173
+ function scanString() {
174
+ const startLine = line;
175
+ const startCol = column;
176
+ advance(); // consume opening "
177
+ let textBuffer = "";
178
+ let hasInterpolation = false;
179
+ while (pos < source.length && peek() !== '"') {
180
+ if (peek() === "\n" || peek() === "\r") {
181
+ throw error("This string is missing its closing quote.", 'Add a " at the end of the string.', 'Strings in Flow must be on a single line: "like this"');
182
+ }
183
+ if (peek() === "{" && peekAt(1) !== "{") {
184
+ // Start of interpolation
185
+ hasInterpolation = true;
186
+ // Emit accumulated text as STRING_PART
187
+ if (textBuffer.length > 0 || !hasInterpolation) {
188
+ tokens.push(makeToken(TokenType.STRING_PART, textBuffer, startLine, startCol));
189
+ }
190
+ else {
191
+ tokens.push(makeToken(TokenType.STRING_PART, textBuffer, startLine, startCol));
192
+ }
193
+ textBuffer = "";
194
+ tokens.push(makeToken(TokenType.INTERP_START, "{", line, column));
195
+ advance(); // consume {
196
+ // Tokenize the expression inside the interpolation
197
+ scanInterpolationExpression();
198
+ if (peek() !== "}") {
199
+ throw error("Missing closing } in string interpolation.", "Add a } to close the interpolation expression.", 'Example: "Hello, {name}"');
200
+ }
201
+ tokens.push(makeToken(TokenType.INTERP_END, "}", line, column));
202
+ advance(); // consume }
203
+ continue;
204
+ }
205
+ if (peek() === "{" && peekAt(1) === "{") {
206
+ // Escaped brace: {{ → literal {
207
+ textBuffer += "{";
208
+ advance();
209
+ advance();
210
+ continue;
211
+ }
212
+ if (peek() === "}" && peekAt(1) === "}") {
213
+ // Escaped brace: }} → literal }
214
+ textBuffer += "}";
215
+ advance();
216
+ advance();
217
+ continue;
218
+ }
219
+ if (peek() === "\\") {
220
+ advance(); // consume backslash
221
+ const escaped = advance();
222
+ switch (escaped) {
223
+ case "n":
224
+ textBuffer += "\n";
225
+ break;
226
+ case "t":
227
+ textBuffer += "\t";
228
+ break;
229
+ case '"':
230
+ textBuffer += '"';
231
+ break;
232
+ case "\\":
233
+ textBuffer += "\\";
234
+ break;
235
+ default: textBuffer += "\\" + escaped;
236
+ }
237
+ continue;
238
+ }
239
+ textBuffer += advance();
240
+ }
241
+ if (pos >= source.length) {
242
+ throw error("This string is missing its closing quote.", 'Add a " at the end of the string.', 'Strings in Flow must be on a single line: "like this"');
243
+ }
244
+ advance(); // consume closing "
245
+ if (hasInterpolation) {
246
+ // Emit final STRING_PART
247
+ tokens.push(makeToken(TokenType.STRING_PART, textBuffer, line, column));
248
+ }
249
+ else {
250
+ // Plain string, no interpolation
251
+ tokens.push(makeToken(TokenType.STRING, textBuffer, startLine, startCol));
252
+ }
253
+ }
254
+ function scanInterpolationExpression() {
255
+ // Inside {}, we scan identifiers and dots
256
+ skipSpaces();
257
+ if (peek() === "}") {
258
+ throw error("Empty interpolation expression.", "Put a variable name inside the braces.", 'Example: "Hello, {name}"');
259
+ }
260
+ const startLine = line;
261
+ const startCol = column;
262
+ let name = "";
263
+ while (pos < source.length && /[a-zA-Z0-9_\-]/.test(peek())) {
264
+ name += advance();
265
+ }
266
+ if (name.length === 0) {
267
+ throw error("Empty interpolation expression.", "Put a variable name inside the braces.", 'Example: "Hello, {name}"');
268
+ }
269
+ tokens.push(makeToken(TokenType.IDENTIFIER, name, startLine, startCol));
270
+ // Handle dot access chains: {order.items.length}
271
+ while (peek() === ".") {
272
+ tokens.push(makeToken(TokenType.DOT, ".", line, column));
273
+ advance(); // consume .
274
+ const propLine = line;
275
+ const propCol = column;
276
+ let prop = "";
277
+ while (pos < source.length && /[a-zA-Z0-9_\-]/.test(peek())) {
278
+ prop += advance();
279
+ }
280
+ if (prop.length === 0) {
281
+ throw error("Expected a property name after the dot.", "Add a property name.", 'Example: {order.total}');
282
+ }
283
+ tokens.push(makeToken(TokenType.IDENTIFIER, prop, propLine, propCol));
284
+ }
285
+ skipSpaces();
286
+ }
287
+ // --------------------------------------------------------
288
+ // Number scanning
289
+ // --------------------------------------------------------
290
+ function scanNumber() {
291
+ const startLine = line;
292
+ const startCol = column;
293
+ let num = "";
294
+ while (pos < source.length && /[0-9]/.test(peek())) {
295
+ num += advance();
296
+ }
297
+ if (peek() === "." && /[0-9]/.test(peekAt(1))) {
298
+ num += advance(); // consume .
299
+ while (pos < source.length && /[0-9]/.test(peek())) {
300
+ num += advance();
301
+ }
302
+ }
303
+ tokens.push(makeToken(TokenType.NUMBER, num, startLine, startCol));
304
+ }
305
+ // --------------------------------------------------------
306
+ // Word scanning (identifiers and keywords)
307
+ // --------------------------------------------------------
308
+ function scanWord() {
309
+ const startLine = line;
310
+ const startCol = column;
311
+ // Try to match compound keywords first (longest match)
312
+ for (const compound of COMPOUND_KEYWORDS) {
313
+ if (matchAhead(compound)) {
314
+ // Consume the compound keyword
315
+ for (let i = 0; i < compound.length; i++) {
316
+ advance();
317
+ }
318
+ tokens.push(makeToken(TokenType.KEYWORD_COMPOUND, compound, startLine, startCol));
319
+ return;
320
+ }
321
+ }
322
+ // Read the full word
323
+ let word = "";
324
+ while (pos < source.length && /[a-zA-Z0-9_\-]/.test(peek())) {
325
+ word += advance();
326
+ }
327
+ // Check for boolean literals
328
+ if (word === "true" || word === "false") {
329
+ tokens.push(makeToken(TokenType.BOOLEAN, word, startLine, startCol));
330
+ return;
331
+ }
332
+ // Check for single keywords
333
+ if (SINGLE_KEYWORDS.has(word)) {
334
+ tokens.push(makeToken(TokenType.KEYWORD, word, startLine, startCol));
335
+ return;
336
+ }
337
+ // Otherwise it's an identifier
338
+ tokens.push(makeToken(TokenType.IDENTIFIER, word, startLine, startCol));
339
+ }
340
+ // --------------------------------------------------------
341
+ // Helpers
342
+ // --------------------------------------------------------
343
+ function skipSpaces() {
344
+ while (pos < source.length && peek() === " ") {
345
+ advance();
346
+ }
347
+ }
348
+ function skipComment() {
349
+ while (pos < source.length && peek() !== "\n") {
350
+ advance();
351
+ }
352
+ }
353
+ // --------------------------------------------------------
354
+ // Main loop
355
+ // --------------------------------------------------------
356
+ while (pos < source.length) {
357
+ // Handle start of line (indentation)
358
+ if (atLineStart) {
359
+ handleIndentation();
360
+ atLineStart = false;
361
+ // After indentation, if we hit end of line or comment, skip
362
+ if (peek() === "\n" || peek() === "\r") {
363
+ if (peek() === "\r")
364
+ advance();
365
+ if (peek() === "\n")
366
+ advance();
367
+ atLineStart = true;
368
+ continue;
369
+ }
370
+ if (peek() === "#") {
371
+ skipComment();
372
+ continue;
373
+ }
374
+ if (peek() === "\0") {
375
+ break;
376
+ }
377
+ }
378
+ const ch = peek();
379
+ // Whitespace (within a line)
380
+ if (ch === " ") {
381
+ skipSpaces();
382
+ continue;
383
+ }
384
+ // Newlines
385
+ if (ch === "\n" || ch === "\r") {
386
+ const newlineLine = line;
387
+ const newlineCol = column;
388
+ if (ch === "\r")
389
+ advance();
390
+ if (peek() === "\n")
391
+ advance();
392
+ // Only emit NEWLINE if the last token isn't already NEWLINE
393
+ const lastToken = tokens[tokens.length - 1];
394
+ if (lastToken && lastToken.type !== TokenType.NEWLINE && lastToken.type !== TokenType.INDENT) {
395
+ tokens.push(makeToken(TokenType.NEWLINE, "\\n", newlineLine, newlineCol));
396
+ }
397
+ atLineStart = true;
398
+ continue;
399
+ }
400
+ // Comments
401
+ if (ch === "#") {
402
+ skipComment();
403
+ continue;
404
+ }
405
+ // Strings
406
+ if (ch === '"') {
407
+ scanString();
408
+ continue;
409
+ }
410
+ // Numbers
411
+ if (/[0-9]/.test(ch)) {
412
+ scanNumber();
413
+ continue;
414
+ }
415
+ // Colon
416
+ if (ch === ":") {
417
+ tokens.push(makeToken(TokenType.COLON, ":", line, column));
418
+ advance();
419
+ continue;
420
+ }
421
+ // Dot (standalone, not in a number)
422
+ if (ch === ".") {
423
+ tokens.push(makeToken(TokenType.DOT, ".", line, column));
424
+ advance();
425
+ continue;
426
+ }
427
+ // Words (identifiers, keywords, booleans)
428
+ if (/[a-zA-Z_]/.test(ch)) {
429
+ scanWord();
430
+ continue;
431
+ }
432
+ // Unknown character
433
+ throw error(`Unexpected character "${ch}".`, "Remove this character or check for typos.", "Flow only uses letters, numbers, spaces, quotes, colons, dots, and # for comments.");
434
+ }
435
+ // Emit remaining DEDENTs at end of file
436
+ while (indentStack.length > 1) {
437
+ indentStack.pop();
438
+ tokens.push(makeToken(TokenType.DEDENT, "DEDENT", line, column));
439
+ }
440
+ tokens.push(makeToken(TokenType.EOF, "", line, column));
441
+ return tokens;
442
+ }
443
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lexer/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Token, FlowError, Program } from "../types/index.js";
2
+ export declare class ParserError extends Error {
3
+ readonly flowError: FlowError;
4
+ constructor(flowError: FlowError);
5
+ }
6
+ export interface ParseResult {
7
+ program: Program;
8
+ errors: FlowError[];
9
+ }
10
+ export declare function parse(tokens: Token[], source: string, fileName?: string): ParseResult;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,EAAa,SAAS,EAC3B,OAAO,EAYV,MAAM,mBAAmB,CAAC;AAO3B,qBAAa,WAAY,SAAQ,KAAK;IAClC,SAAgB,SAAS,EAAE,SAAS,CAAC;gBAEzB,SAAS,EAAE,SAAS;CAKnC;AAMD,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,EAAE,CAAC;CACvB;AAwBD,wBAAgB,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,GAAG,WAAW,CA0kChG"}