@rcrsr/rill 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/LICENSE +21 -0
- package/README.md +187 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +69 -0
- package/dist/cli.js.map +1 -0
- package/dist/demo.d.ts +6 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +121 -0
- package/dist/demo.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer/errors.d.ts +9 -0
- package/dist/lexer/errors.d.ts.map +1 -0
- package/dist/lexer/errors.js +12 -0
- package/dist/lexer/errors.js.map +1 -0
- package/dist/lexer/helpers.d.ts +14 -0
- package/dist/lexer/helpers.d.ts.map +1 -0
- package/dist/lexer/helpers.js +30 -0
- package/dist/lexer/helpers.js.map +1 -0
- package/dist/lexer/index.d.ts +8 -0
- package/dist/lexer/index.d.ts.map +1 -0
- package/dist/lexer/index.js +8 -0
- package/dist/lexer/index.js.map +1 -0
- package/dist/lexer/operators.d.ts +11 -0
- package/dist/lexer/operators.d.ts.map +1 -0
- package/dist/lexer/operators.js +58 -0
- package/dist/lexer/operators.js.map +1 -0
- package/dist/lexer/readers.d.ts +12 -0
- package/dist/lexer/readers.d.ts.map +1 -0
- package/dist/lexer/readers.js +144 -0
- package/dist/lexer/readers.js.map +1 -0
- package/dist/lexer/state.d.ts +18 -0
- package/dist/lexer/state.d.ts.map +1 -0
- package/dist/lexer/state.js +37 -0
- package/dist/lexer/state.js.map +1 -0
- package/dist/lexer/tokenizer.d.ts +9 -0
- package/dist/lexer/tokenizer.d.ts.map +1 -0
- package/dist/lexer/tokenizer.js +100 -0
- package/dist/lexer/tokenizer.js.map +1 -0
- package/dist/lexer.d.ts +19 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +344 -0
- package/dist/lexer.js.map +1 -0
- package/dist/parser/arithmetic.d.ts +16 -0
- package/dist/parser/arithmetic.d.ts.map +1 -0
- package/dist/parser/arithmetic.js +128 -0
- package/dist/parser/arithmetic.js.map +1 -0
- package/dist/parser/boolean.d.ts +15 -0
- package/dist/parser/boolean.d.ts.map +1 -0
- package/dist/parser/boolean.js +20 -0
- package/dist/parser/boolean.js.map +1 -0
- package/dist/parser/control-flow.d.ts +56 -0
- package/dist/parser/control-flow.d.ts.map +1 -0
- package/dist/parser/control-flow.js +167 -0
- package/dist/parser/control-flow.js.map +1 -0
- package/dist/parser/expressions.d.ts +23 -0
- package/dist/parser/expressions.d.ts.map +1 -0
- package/dist/parser/expressions.js +950 -0
- package/dist/parser/expressions.js.map +1 -0
- package/dist/parser/extraction.d.ts +48 -0
- package/dist/parser/extraction.d.ts.map +1 -0
- package/dist/parser/extraction.js +279 -0
- package/dist/parser/extraction.js.map +1 -0
- package/dist/parser/functions.d.ts +20 -0
- package/dist/parser/functions.d.ts.map +1 -0
- package/dist/parser/functions.js +96 -0
- package/dist/parser/functions.js.map +1 -0
- package/dist/parser/helpers.d.ts +94 -0
- package/dist/parser/helpers.d.ts.map +1 -0
- package/dist/parser/helpers.js +225 -0
- package/dist/parser/helpers.js.map +1 -0
- package/dist/parser/index.d.ts +49 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +73 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/literals.d.ts +37 -0
- package/dist/parser/literals.d.ts.map +1 -0
- package/dist/parser/literals.js +373 -0
- package/dist/parser/literals.js.map +1 -0
- package/dist/parser/parser-collect.d.ts +16 -0
- package/dist/parser/parser-collect.d.ts.map +1 -0
- package/dist/parser/parser-collect.js +125 -0
- package/dist/parser/parser-collect.js.map +1 -0
- package/dist/parser/parser-control.d.ts +20 -0
- package/dist/parser/parser-control.d.ts.map +1 -0
- package/dist/parser/parser-control.js +120 -0
- package/dist/parser/parser-control.js.map +1 -0
- package/dist/parser/parser-expr.d.ts +37 -0
- package/dist/parser/parser-expr.d.ts.map +1 -0
- package/dist/parser/parser-expr.js +639 -0
- package/dist/parser/parser-expr.js.map +1 -0
- package/dist/parser/parser-extract.d.ts +17 -0
- package/dist/parser/parser-extract.d.ts.map +1 -0
- package/dist/parser/parser-extract.js +222 -0
- package/dist/parser/parser-extract.js.map +1 -0
- package/dist/parser/parser-functions.d.ts +21 -0
- package/dist/parser/parser-functions.d.ts.map +1 -0
- package/dist/parser/parser-functions.js +155 -0
- package/dist/parser/parser-functions.js.map +1 -0
- package/dist/parser/parser-literals.d.ts +22 -0
- package/dist/parser/parser-literals.d.ts.map +1 -0
- package/dist/parser/parser-literals.js +288 -0
- package/dist/parser/parser-literals.js.map +1 -0
- package/dist/parser/parser-script.d.ts +21 -0
- package/dist/parser/parser-script.d.ts.map +1 -0
- package/dist/parser/parser-script.js +174 -0
- package/dist/parser/parser-script.js.map +1 -0
- package/dist/parser/parser-variables.d.ts +20 -0
- package/dist/parser/parser-variables.d.ts.map +1 -0
- package/dist/parser/parser-variables.js +146 -0
- package/dist/parser/parser-variables.js.map +1 -0
- package/dist/parser/parser.d.ts +49 -0
- package/dist/parser/parser.d.ts.map +1 -0
- package/dist/parser/parser.js +54 -0
- package/dist/parser/parser.js.map +1 -0
- package/dist/parser/script.d.ts +14 -0
- package/dist/parser/script.d.ts.map +1 -0
- package/dist/parser/script.js +196 -0
- package/dist/parser/script.js.map +1 -0
- package/dist/parser/state.d.ts +40 -0
- package/dist/parser/state.d.ts.map +1 -0
- package/dist/parser/state.js +129 -0
- package/dist/parser/state.js.map +1 -0
- package/dist/parser/variables.d.ts +10 -0
- package/dist/parser/variables.d.ts.map +1 -0
- package/dist/parser/variables.js +215 -0
- package/dist/parser/variables.js.map +1 -0
- package/dist/runtime/ast-equals.d.ts +13 -0
- package/dist/runtime/ast-equals.d.ts.map +1 -0
- package/dist/runtime/ast-equals.js +447 -0
- package/dist/runtime/ast-equals.js.map +1 -0
- package/dist/runtime/builtins.d.ts +13 -0
- package/dist/runtime/builtins.d.ts.map +1 -0
- package/dist/runtime/builtins.js +180 -0
- package/dist/runtime/builtins.js.map +1 -0
- package/dist/runtime/callable.d.ts +88 -0
- package/dist/runtime/callable.d.ts.map +1 -0
- package/dist/runtime/callable.js +98 -0
- package/dist/runtime/callable.js.map +1 -0
- package/dist/runtime/context.d.ts +13 -0
- package/dist/runtime/context.d.ts.map +1 -0
- package/dist/runtime/context.js +73 -0
- package/dist/runtime/context.js.map +1 -0
- package/dist/runtime/core/callable.d.ts +171 -0
- package/dist/runtime/core/callable.d.ts.map +1 -0
- package/dist/runtime/core/callable.js +246 -0
- package/dist/runtime/core/callable.js.map +1 -0
- package/dist/runtime/core/context.d.ts +29 -0
- package/dist/runtime/core/context.d.ts.map +1 -0
- package/dist/runtime/core/context.js +154 -0
- package/dist/runtime/core/context.js.map +1 -0
- package/dist/runtime/core/equals.d.ts +9 -0
- package/dist/runtime/core/equals.d.ts.map +1 -0
- package/dist/runtime/core/equals.js +381 -0
- package/dist/runtime/core/equals.js.map +1 -0
- package/dist/runtime/core/eval/base.d.ts +65 -0
- package/dist/runtime/core/eval/base.d.ts.map +1 -0
- package/dist/runtime/core/eval/base.js +112 -0
- package/dist/runtime/core/eval/base.js.map +1 -0
- package/dist/runtime/core/eval/evaluator.d.ts +47 -0
- package/dist/runtime/core/eval/evaluator.d.ts.map +1 -0
- package/dist/runtime/core/eval/evaluator.js +73 -0
- package/dist/runtime/core/eval/evaluator.js.map +1 -0
- package/dist/runtime/core/eval/index.d.ts +57 -0
- package/dist/runtime/core/eval/index.d.ts.map +1 -0
- package/dist/runtime/core/eval/index.js +95 -0
- package/dist/runtime/core/eval/index.js.map +1 -0
- package/dist/runtime/core/eval/mixins/annotations.d.ts +19 -0
- package/dist/runtime/core/eval/mixins/annotations.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/annotations.js +146 -0
- package/dist/runtime/core/eval/mixins/annotations.js.map +1 -0
- package/dist/runtime/core/eval/mixins/closures.d.ts +49 -0
- package/dist/runtime/core/eval/mixins/closures.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/closures.js +479 -0
- package/dist/runtime/core/eval/mixins/closures.js.map +1 -0
- package/dist/runtime/core/eval/mixins/collections.d.ts +24 -0
- package/dist/runtime/core/eval/mixins/collections.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/collections.js +466 -0
- package/dist/runtime/core/eval/mixins/collections.js.map +1 -0
- package/dist/runtime/core/eval/mixins/control-flow.d.ts +27 -0
- package/dist/runtime/core/eval/mixins/control-flow.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/control-flow.js +369 -0
- package/dist/runtime/core/eval/mixins/control-flow.js.map +1 -0
- package/dist/runtime/core/eval/mixins/core.d.ts +24 -0
- package/dist/runtime/core/eval/mixins/core.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/core.js +335 -0
- package/dist/runtime/core/eval/mixins/core.js.map +1 -0
- package/dist/runtime/core/eval/mixins/expressions.d.ts +19 -0
- package/dist/runtime/core/eval/mixins/expressions.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/expressions.js +202 -0
- package/dist/runtime/core/eval/mixins/expressions.js.map +1 -0
- package/dist/runtime/core/eval/mixins/extraction.d.ts +10 -0
- package/dist/runtime/core/eval/mixins/extraction.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/extraction.js +250 -0
- package/dist/runtime/core/eval/mixins/extraction.js.map +1 -0
- package/dist/runtime/core/eval/mixins/literals.d.ts +23 -0
- package/dist/runtime/core/eval/mixins/literals.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/literals.js +180 -0
- package/dist/runtime/core/eval/mixins/literals.js.map +1 -0
- package/dist/runtime/core/eval/mixins/types.d.ts +20 -0
- package/dist/runtime/core/eval/mixins/types.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/types.js +109 -0
- package/dist/runtime/core/eval/mixins/types.js.map +1 -0
- package/dist/runtime/core/eval/mixins/variables.d.ts +34 -0
- package/dist/runtime/core/eval/mixins/variables.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/variables.js +247 -0
- package/dist/runtime/core/eval/mixins/variables.js.map +1 -0
- package/dist/runtime/core/eval/types.d.ts +41 -0
- package/dist/runtime/core/eval/types.d.ts.map +1 -0
- package/dist/runtime/core/eval/types.js +10 -0
- package/dist/runtime/core/eval/types.js.map +1 -0
- package/dist/runtime/core/evaluate.d.ts +42 -0
- package/dist/runtime/core/evaluate.d.ts.map +1 -0
- package/dist/runtime/core/evaluate.debug.js +1251 -0
- package/dist/runtime/core/evaluate.js +1913 -0
- package/dist/runtime/core/evaluate.js.map +1 -0
- package/dist/runtime/core/execute.d.ts +26 -0
- package/dist/runtime/core/execute.d.ts.map +1 -0
- package/dist/runtime/core/execute.js +177 -0
- package/dist/runtime/core/execute.js.map +1 -0
- package/dist/runtime/core/signals.d.ts +19 -0
- package/dist/runtime/core/signals.d.ts.map +1 -0
- package/dist/runtime/core/signals.js +26 -0
- package/dist/runtime/core/signals.js.map +1 -0
- package/dist/runtime/core/types.d.ts +177 -0
- package/dist/runtime/core/types.d.ts.map +1 -0
- package/dist/runtime/core/types.js +50 -0
- package/dist/runtime/core/types.js.map +1 -0
- package/dist/runtime/core/values.d.ts +66 -0
- package/dist/runtime/core/values.d.ts.map +1 -0
- package/dist/runtime/core/values.js +240 -0
- package/dist/runtime/core/values.js.map +1 -0
- package/dist/runtime/evaluate.d.ts +32 -0
- package/dist/runtime/evaluate.d.ts.map +1 -0
- package/dist/runtime/evaluate.js +1111 -0
- package/dist/runtime/evaluate.js.map +1 -0
- package/dist/runtime/execute.d.ts +26 -0
- package/dist/runtime/execute.d.ts.map +1 -0
- package/dist/runtime/execute.js +121 -0
- package/dist/runtime/execute.js.map +1 -0
- package/dist/runtime/ext/builtins.d.ts +16 -0
- package/dist/runtime/ext/builtins.d.ts.map +1 -0
- package/dist/runtime/ext/builtins.js +528 -0
- package/dist/runtime/ext/builtins.js.map +1 -0
- package/dist/runtime/ext/content-parser.d.ts +83 -0
- package/dist/runtime/ext/content-parser.d.ts.map +1 -0
- package/dist/runtime/ext/content-parser.js +536 -0
- package/dist/runtime/ext/content-parser.js.map +1 -0
- package/dist/runtime/index.d.ts +28 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +34 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/signals.d.ts +19 -0
- package/dist/runtime/signals.d.ts.map +1 -0
- package/dist/runtime/signals.js +26 -0
- package/dist/runtime/signals.js.map +1 -0
- package/dist/runtime/types.d.ts +169 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +50 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/values.d.ts +50 -0
- package/dist/runtime/values.d.ts.map +1 -0
- package/dist/runtime/values.js +209 -0
- package/dist/runtime/values.js.map +1 -0
- package/dist/runtime.d.ts +254 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +2014 -0
- package/dist/runtime.js.map +1 -0
- package/dist/types.d.ts +752 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +189 -0
- package/dist/types.js.map +1 -0
- package/docs/00_INDEX.md +65 -0
- package/docs/01_guide.md +390 -0
- package/docs/02_types.md +399 -0
- package/docs/03_variables.md +314 -0
- package/docs/04_operators.md +551 -0
- package/docs/05_control-flow.md +350 -0
- package/docs/06_closures.md +353 -0
- package/docs/07_collections.md +686 -0
- package/docs/08_iterators.md +330 -0
- package/docs/09_strings.md +205 -0
- package/docs/10_parsing.md +366 -0
- package/docs/11_reference.md +350 -0
- package/docs/12_examples.md +771 -0
- package/docs/13_modules.md +519 -0
- package/docs/14_host-integration.md +826 -0
- package/docs/15_grammar.ebnf +693 -0
- package/docs/16_conventions.md +696 -0
- package/docs/99_llm-reference.txt +300 -0
- package/docs/assets/logo.png +0 -0
- package/package.json +70 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Literal Parsing
|
|
3
|
+
* Strings, numbers, booleans, tuples, dicts, and closures
|
|
4
|
+
*/
|
|
5
|
+
import { ParseError, TOKEN_TYPES } from '../types.js';
|
|
6
|
+
import { tokenize } from '../lexer/index.js';
|
|
7
|
+
import { createParserState, check, advance, expect, current, skipNewlines, makeSpan, } from './state.js';
|
|
8
|
+
import { isDictStart, FUNC_PARAM_TYPES, parseTypeName } from './helpers.js';
|
|
9
|
+
// Forward declarations - will be set by expressions.ts to break circular dependency
|
|
10
|
+
let parseExpressionFn;
|
|
11
|
+
let parseBlockFn;
|
|
12
|
+
let parseGroupedFn;
|
|
13
|
+
let parsePostfixExprFn;
|
|
14
|
+
let parsePipeChainFn;
|
|
15
|
+
export function setParseExpression(fn) {
|
|
16
|
+
parseExpressionFn = fn;
|
|
17
|
+
}
|
|
18
|
+
export function setParseBlock(fn) {
|
|
19
|
+
parseBlockFn = fn;
|
|
20
|
+
}
|
|
21
|
+
export function setParseGrouped(fn) {
|
|
22
|
+
parseGroupedFn = fn;
|
|
23
|
+
}
|
|
24
|
+
export function setParsePostfixExpr(fn) {
|
|
25
|
+
parsePostfixExprFn = fn;
|
|
26
|
+
}
|
|
27
|
+
export function setLiteralsParsePipeChain(fn) {
|
|
28
|
+
parsePipeChainFn = fn;
|
|
29
|
+
}
|
|
30
|
+
// ============================================================
|
|
31
|
+
// LITERAL PARSING
|
|
32
|
+
// ============================================================
|
|
33
|
+
export function parseLiteral(state) {
|
|
34
|
+
if (check(state, TOKEN_TYPES.STRING)) {
|
|
35
|
+
return parseString(state);
|
|
36
|
+
}
|
|
37
|
+
if (check(state, TOKEN_TYPES.NUMBER)) {
|
|
38
|
+
const token = advance(state);
|
|
39
|
+
return {
|
|
40
|
+
type: 'NumberLiteral',
|
|
41
|
+
value: parseFloat(token.value),
|
|
42
|
+
span: token.span,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if (check(state, TOKEN_TYPES.TRUE)) {
|
|
46
|
+
const token = advance(state);
|
|
47
|
+
return { type: 'BoolLiteral', value: true, span: token.span };
|
|
48
|
+
}
|
|
49
|
+
if (check(state, TOKEN_TYPES.FALSE)) {
|
|
50
|
+
const token = advance(state);
|
|
51
|
+
return { type: 'BoolLiteral', value: false, span: token.span };
|
|
52
|
+
}
|
|
53
|
+
if (check(state, TOKEN_TYPES.LBRACKET)) {
|
|
54
|
+
return parseTupleOrDict(state);
|
|
55
|
+
}
|
|
56
|
+
// Note: LPAREN no longer starts closures
|
|
57
|
+
// Closures use |params| body syntax (handled by parseClosure)
|
|
58
|
+
// LPAREN now starts grouped expressions (handled by parseGrouped in expressions.ts)
|
|
59
|
+
const token = current(state);
|
|
60
|
+
let hint = '';
|
|
61
|
+
if (token.type === TOKEN_TYPES.ASSIGN) {
|
|
62
|
+
hint = ". Hint: Use '->' for assignment, not '='";
|
|
63
|
+
}
|
|
64
|
+
else if (token.type === TOKEN_TYPES.EOF) {
|
|
65
|
+
hint = '. Hint: Unexpected end of input';
|
|
66
|
+
}
|
|
67
|
+
throw new ParseError(`Expected literal, got: ${token.value}${hint}`, token.span.start);
|
|
68
|
+
}
|
|
69
|
+
// ============================================================
|
|
70
|
+
// STRING PARSING
|
|
71
|
+
// ============================================================
|
|
72
|
+
/**
|
|
73
|
+
* Parse a string literal, handling interpolation expressions.
|
|
74
|
+
* Interpolation uses {expr} syntax where expr is any valid expression.
|
|
75
|
+
* Escaped braces \{ and \} produce literal braces.
|
|
76
|
+
*/
|
|
77
|
+
export function parseString(state) {
|
|
78
|
+
const token = advance(state);
|
|
79
|
+
const raw = token.value;
|
|
80
|
+
// Parse interpolation expressions from the string content
|
|
81
|
+
const parts = parseStringParts(raw, token.span.start);
|
|
82
|
+
return {
|
|
83
|
+
type: 'StringLiteral',
|
|
84
|
+
parts,
|
|
85
|
+
isHeredoc: raw.includes('\n'),
|
|
86
|
+
span: token.span,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Split string content into literal segments and interpolation expressions.
|
|
91
|
+
* Escape syntax: {{ → literal {, }} → literal }
|
|
92
|
+
* Interpolation: {expr} where expr is any valid expression
|
|
93
|
+
*/
|
|
94
|
+
function parseStringParts(raw, baseLocation) {
|
|
95
|
+
const parts = [];
|
|
96
|
+
let i = 0;
|
|
97
|
+
let literalStart = 0;
|
|
98
|
+
while (i < raw.length) {
|
|
99
|
+
if (raw[i] === '{') {
|
|
100
|
+
// Check for escaped brace {{ - skip and let unescapeBraces handle it
|
|
101
|
+
if (raw[i + 1] === '{') {
|
|
102
|
+
i += 2;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
// Found interpolation start - save preceding literal
|
|
106
|
+
if (i > literalStart) {
|
|
107
|
+
const literal = unescapeBraces(raw.slice(literalStart, i));
|
|
108
|
+
if (literal)
|
|
109
|
+
parts.push(literal);
|
|
110
|
+
}
|
|
111
|
+
// Find matching closing brace (respecting nesting and escapes)
|
|
112
|
+
const exprStart = i + 1;
|
|
113
|
+
let depth = 1;
|
|
114
|
+
i++;
|
|
115
|
+
while (i < raw.length && depth > 0) {
|
|
116
|
+
// Skip escaped braces inside interpolation
|
|
117
|
+
if (raw[i] === '{' && raw[i + 1] === '{') {
|
|
118
|
+
i += 2;
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (raw[i] === '}' && raw[i + 1] === '}') {
|
|
122
|
+
i += 2;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (raw[i] === '{')
|
|
126
|
+
depth++;
|
|
127
|
+
else if (raw[i] === '}')
|
|
128
|
+
depth--;
|
|
129
|
+
i++;
|
|
130
|
+
}
|
|
131
|
+
if (depth !== 0) {
|
|
132
|
+
throw new ParseError("Unterminated string interpolation. Hint: Check for missing '}' in interpolation", baseLocation);
|
|
133
|
+
}
|
|
134
|
+
// Extract and parse the expression
|
|
135
|
+
const exprSource = raw.slice(exprStart, i - 1);
|
|
136
|
+
if (!exprSource.trim()) {
|
|
137
|
+
throw new ParseError('Empty string interpolation', baseLocation);
|
|
138
|
+
}
|
|
139
|
+
const interpolation = parseInterpolationExpr(exprSource, baseLocation);
|
|
140
|
+
parts.push(interpolation);
|
|
141
|
+
literalStart = i;
|
|
142
|
+
}
|
|
143
|
+
else if (raw[i] === '}' && raw[i + 1] === '}') {
|
|
144
|
+
// Skip escaped closing brace - let unescapeBraces handle it
|
|
145
|
+
i += 2;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
i++;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Add remaining literal segment
|
|
152
|
+
if (literalStart < raw.length) {
|
|
153
|
+
const literal = unescapeBraces(raw.slice(literalStart));
|
|
154
|
+
if (literal)
|
|
155
|
+
parts.push(literal);
|
|
156
|
+
}
|
|
157
|
+
// If no parts, return empty string
|
|
158
|
+
if (parts.length === 0) {
|
|
159
|
+
parts.push('');
|
|
160
|
+
}
|
|
161
|
+
return parts;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Replace escaped brace sequences with actual braces.
|
|
165
|
+
* {{ → { and }} → }
|
|
166
|
+
*/
|
|
167
|
+
function unescapeBraces(s) {
|
|
168
|
+
return s.replaceAll('{{', '{').replaceAll('}}', '}');
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Parse an interpolation expression using sub-lexer/parser.
|
|
172
|
+
*/
|
|
173
|
+
function parseInterpolationExpr(source, baseLocation) {
|
|
174
|
+
// Tokenize the expression
|
|
175
|
+
const tokens = tokenize(source);
|
|
176
|
+
// Filter out newlines and comments for expression parsing
|
|
177
|
+
const filtered = tokens.filter((t) => t.type !== TOKEN_TYPES.NEWLINE && t.type !== TOKEN_TYPES.COMMENT);
|
|
178
|
+
if (filtered.length === 0 || filtered[0]?.type === TOKEN_TYPES.EOF) {
|
|
179
|
+
throw new ParseError('Empty string interpolation', baseLocation);
|
|
180
|
+
}
|
|
181
|
+
// Parse as expression
|
|
182
|
+
const subState = createParserState(filtered);
|
|
183
|
+
const expression = parseExpressionFn(subState);
|
|
184
|
+
// Verify all tokens consumed (except EOF)
|
|
185
|
+
if (subState.tokens[subState.pos]?.type !== TOKEN_TYPES.EOF) {
|
|
186
|
+
throw new ParseError(`Unexpected token in interpolation: ${subState.tokens[subState.pos]?.value}`, baseLocation);
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
type: 'Interpolation',
|
|
190
|
+
expression,
|
|
191
|
+
span: expression.span,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
// ============================================================
|
|
195
|
+
// TUPLE & DICT PARSING
|
|
196
|
+
// ============================================================
|
|
197
|
+
export function parseTupleOrDict(state) {
|
|
198
|
+
const start = current(state).span.start;
|
|
199
|
+
expect(state, TOKEN_TYPES.LBRACKET, 'Expected [');
|
|
200
|
+
skipNewlines(state);
|
|
201
|
+
// Empty tuple
|
|
202
|
+
if (check(state, TOKEN_TYPES.RBRACKET)) {
|
|
203
|
+
advance(state);
|
|
204
|
+
return {
|
|
205
|
+
type: 'Tuple',
|
|
206
|
+
elements: [],
|
|
207
|
+
span: makeSpan(start, current(state).span.end),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
// Empty dict [:]
|
|
211
|
+
if (check(state, TOKEN_TYPES.COLON) &&
|
|
212
|
+
state.tokens[state.pos + 1]?.type === TOKEN_TYPES.RBRACKET) {
|
|
213
|
+
advance(state); // :
|
|
214
|
+
advance(state); // ]
|
|
215
|
+
return {
|
|
216
|
+
type: 'Dict',
|
|
217
|
+
entries: [],
|
|
218
|
+
span: makeSpan(start, current(state).span.end),
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
// Check if dict (identifier followed by :)
|
|
222
|
+
if (isDictStart(state)) {
|
|
223
|
+
return parseDict(state, start);
|
|
224
|
+
}
|
|
225
|
+
// Tuple
|
|
226
|
+
return parseTuple(state, start);
|
|
227
|
+
}
|
|
228
|
+
function parseTuple(state, start) {
|
|
229
|
+
const elements = [];
|
|
230
|
+
elements.push(parseExpressionFn(state));
|
|
231
|
+
skipNewlines(state);
|
|
232
|
+
while (check(state, TOKEN_TYPES.COMMA)) {
|
|
233
|
+
advance(state);
|
|
234
|
+
skipNewlines(state);
|
|
235
|
+
if (check(state, TOKEN_TYPES.RBRACKET))
|
|
236
|
+
break;
|
|
237
|
+
elements.push(parseExpressionFn(state));
|
|
238
|
+
skipNewlines(state);
|
|
239
|
+
}
|
|
240
|
+
expect(state, TOKEN_TYPES.RBRACKET, 'Expected ]');
|
|
241
|
+
return {
|
|
242
|
+
type: 'Tuple',
|
|
243
|
+
elements,
|
|
244
|
+
span: makeSpan(start, current(state).span.end),
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
function parseDict(state, start) {
|
|
248
|
+
const entries = [];
|
|
249
|
+
entries.push(parseDictEntry(state));
|
|
250
|
+
skipNewlines(state);
|
|
251
|
+
while (check(state, TOKEN_TYPES.COMMA)) {
|
|
252
|
+
advance(state);
|
|
253
|
+
skipNewlines(state);
|
|
254
|
+
if (check(state, TOKEN_TYPES.RBRACKET))
|
|
255
|
+
break;
|
|
256
|
+
entries.push(parseDictEntry(state));
|
|
257
|
+
skipNewlines(state);
|
|
258
|
+
}
|
|
259
|
+
expect(state, TOKEN_TYPES.RBRACKET, 'Expected ]');
|
|
260
|
+
return {
|
|
261
|
+
type: 'Dict',
|
|
262
|
+
entries,
|
|
263
|
+
span: makeSpan(start, current(state).span.end),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
function parseDictEntry(state) {
|
|
267
|
+
const start = current(state).span.start;
|
|
268
|
+
const keyToken = expect(state, TOKEN_TYPES.IDENTIFIER, 'Expected key');
|
|
269
|
+
expect(state, TOKEN_TYPES.COLON, 'Expected :');
|
|
270
|
+
const value = parseExpressionFn(state);
|
|
271
|
+
return {
|
|
272
|
+
type: 'DictEntry',
|
|
273
|
+
key: keyToken.value,
|
|
274
|
+
value,
|
|
275
|
+
span: makeSpan(start, current(state).span.end),
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
// ============================================================
|
|
279
|
+
// FUNCTION LITERAL PARSING
|
|
280
|
+
// ============================================================
|
|
281
|
+
/**
|
|
282
|
+
* Parse closure: |params| body or || body
|
|
283
|
+
* Params can be: |x|, |x: string|, |x: string = "default"|
|
|
284
|
+
*
|
|
285
|
+
* Body can be:
|
|
286
|
+
* - Simple: |x| $x (postfix-expr)
|
|
287
|
+
* - Grouped: |x| ($x * 2) (compound expression)
|
|
288
|
+
* - Block: |x| { $a ↵ $b } (multiple statements)
|
|
289
|
+
*/
|
|
290
|
+
export function parseClosure(state) {
|
|
291
|
+
const start = current(state).span.start;
|
|
292
|
+
// Handle || as no-param closure
|
|
293
|
+
if (check(state, TOKEN_TYPES.OR)) {
|
|
294
|
+
advance(state); // consume ||
|
|
295
|
+
const body = parseBody(state);
|
|
296
|
+
return {
|
|
297
|
+
type: 'Closure',
|
|
298
|
+
params: [],
|
|
299
|
+
body,
|
|
300
|
+
span: makeSpan(start, body.span.end),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
// Handle |params| body
|
|
304
|
+
expect(state, TOKEN_TYPES.PIPE_BAR, 'Expected |');
|
|
305
|
+
const params = [];
|
|
306
|
+
if (!check(state, TOKEN_TYPES.PIPE_BAR)) {
|
|
307
|
+
params.push(parseClosureParam(state));
|
|
308
|
+
while (check(state, TOKEN_TYPES.COMMA)) {
|
|
309
|
+
advance(state); // consume comma
|
|
310
|
+
params.push(parseClosureParam(state));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
expect(state, TOKEN_TYPES.PIPE_BAR, 'Expected |');
|
|
314
|
+
// Parse simple-body: block, grouped, or postfix-expr
|
|
315
|
+
const body = parseBody(state);
|
|
316
|
+
return {
|
|
317
|
+
type: 'Closure',
|
|
318
|
+
params,
|
|
319
|
+
body,
|
|
320
|
+
span: makeSpan(start, body.span.end),
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Parse simple-body: block, grouped, or postfix-expr
|
|
325
|
+
* No naked compound expressions — arithmetic/pipes/booleans must be grouped.
|
|
326
|
+
*
|
|
327
|
+
* Used by: closures, conditionals, loops
|
|
328
|
+
*/
|
|
329
|
+
export function parseBody(state) {
|
|
330
|
+
// Block: { ... }
|
|
331
|
+
if (check(state, TOKEN_TYPES.LBRACE)) {
|
|
332
|
+
return parseBlockFn(state);
|
|
333
|
+
}
|
|
334
|
+
// Grouped: ( ... ) - compound expressions go here
|
|
335
|
+
if (check(state, TOKEN_TYPES.LPAREN)) {
|
|
336
|
+
return parseGroupedFn(state);
|
|
337
|
+
}
|
|
338
|
+
// Bare break/return: these become pipe chains with implicit $ head
|
|
339
|
+
// Examples: break, return
|
|
340
|
+
if (check(state, TOKEN_TYPES.BREAK) || check(state, TOKEN_TYPES.RETURN)) {
|
|
341
|
+
return parsePipeChainFn(state);
|
|
342
|
+
}
|
|
343
|
+
// Parse postfix-expr (compound expressions like pipes must be grouped)
|
|
344
|
+
return parsePostfixExprFn(state);
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Parse function parameter: name, name: type, name = default, or name: type = default
|
|
348
|
+
* Type can be inferred from default value when not explicitly specified.
|
|
349
|
+
*/
|
|
350
|
+
function parseClosureParam(state) {
|
|
351
|
+
const start = current(state).span.start;
|
|
352
|
+
const nameToken = expect(state, TOKEN_TYPES.IDENTIFIER, 'Expected parameter name');
|
|
353
|
+
let typeName = null;
|
|
354
|
+
let defaultValue = null;
|
|
355
|
+
// Optional type annotation
|
|
356
|
+
if (check(state, TOKEN_TYPES.COLON)) {
|
|
357
|
+
advance(state);
|
|
358
|
+
typeName = parseTypeName(state, FUNC_PARAM_TYPES);
|
|
359
|
+
}
|
|
360
|
+
// Optional default value (with or without type annotation)
|
|
361
|
+
if (check(state, TOKEN_TYPES.ASSIGN)) {
|
|
362
|
+
advance(state);
|
|
363
|
+
defaultValue = parseLiteral(state);
|
|
364
|
+
}
|
|
365
|
+
return {
|
|
366
|
+
type: 'ClosureParam',
|
|
367
|
+
name: nameToken.value,
|
|
368
|
+
typeName,
|
|
369
|
+
defaultValue,
|
|
370
|
+
span: makeSpan(start, current(state).span.end),
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=literals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literals.js","sourceRoot":"","sources":["../../src/parser/literals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAEL,iBAAiB,EACjB,KAAK,EACL,OAAO,EACP,MAAM,EACN,OAAO,EACP,YAAY,EACZ,QAAQ,GACT,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE5E,oFAAoF;AACpF,IAAI,iBAAyD,CAAC;AAC9D,IAAI,YAA+C,CAAC;AACpD,IAAI,cAAuD,CAAC;AAC5D,IAAI,kBAA2D,CAAC;AAChE,IAAI,gBAAuD,CAAC;AAE5D,MAAM,UAAU,kBAAkB,CAChC,EAA0C;IAE1C,iBAAiB,GAAG,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAqC;IACjE,YAAY,GAAG,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,EAA2C;IAE3C,cAAc,GAAG,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,EAA2C;IAE3C,kBAAkB,GAAG,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,EAAyC;IAEzC,gBAAgB,GAAG,EAAE,CAAC;AACxB,CAAC;AAED,+DAA+D;AAC/D,kBAAkB;AAClB,+DAA+D;AAE/D,MAAM,UAAU,YAAY,CAAC,KAAkB;IAC7C,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO;YACL,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;YAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IAChE,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IACjE,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,yCAAyC;IACzC,8DAA8D;IAC9D,oFAAoF;IAEpF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;QACtC,IAAI,GAAG,0CAA0C,CAAC;IACpD,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,GAAG,EAAE,CAAC;QAC1C,IAAI,GAAG,iCAAiC,CAAC;IAC3C,CAAC;IACD,MAAM,IAAI,UAAU,CAClB,0BAA0B,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,EAC9C,KAAK,CAAC,IAAI,CAAC,KAAK,CACjB,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,iBAAiB;AACjB,+DAA+D;AAE/D;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAkB;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;IAExB,0DAA0D;IAC1D,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEtD,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,KAAK;QACL,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CACvB,GAAW,EACX,YAA4B;IAE5B,MAAM,KAAK,GAAmC,EAAE,CAAC;IACjD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,qEAAqE;YACrE,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACvB,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YAED,qDAAqD;YACrD,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3D,IAAI,OAAO;oBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;YAED,+DAA+D;YAC/D,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,CAAC,EAAE,CAAC;YACJ,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACnC,2CAA2C;gBAC3C,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACzC,CAAC,IAAI,CAAC,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACzC,CAAC,IAAI,CAAC,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;oBAAE,KAAK,EAAE,CAAC;qBACvB,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;oBAAE,KAAK,EAAE,CAAC;gBACjC,CAAC,EAAE,CAAC;YACN,CAAC;YAED,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,MAAM,IAAI,UAAU,CAClB,iFAAiF,EACjF,YAAY,CACb,CAAC;YACJ,CAAC;YAED,mCAAmC;YACnC,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;gBACvB,MAAM,IAAI,UAAU,CAAC,4BAA4B,EAAE,YAAY,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,aAAa,GAAG,sBAAsB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1B,YAAY,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAChD,4DAA4D;YAC5D,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,CAAC;YACN,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,IAAI,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QACxD,IAAI,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,mCAAmC;IACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,CAAS;IAC/B,OAAO,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAC7B,MAAc,EACd,YAA4B;IAE5B,0BAA0B;IAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,OAAO,CACxE,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,WAAW,CAAC,GAAG,EAAE,CAAC;QACnE,MAAM,IAAI,UAAU,CAAC,4BAA4B,EAAE,YAAY,CAAC,CAAC;IACnE,CAAC;IAED,sBAAsB;IACtB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAE/C,0CAA0C;IAC1C,IAAI,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,WAAW,CAAC,GAAG,EAAE,CAAC;QAC5D,MAAM,IAAI,UAAU,CAClB,sCAAsC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAC5E,YAAY,CACb,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,UAAU;QACV,IAAI,EAAE,UAAU,CAAC,IAAI;KACtB,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,uBAAuB;AACvB,+DAA+D;AAE/D,MAAM,UAAU,gBAAgB,CAAC,KAAkB;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACxC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAClD,YAAY,CAAC,KAAK,CAAC,CAAC;IAEpB,cAAc;IACd,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,OAAO;YACL,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,EAAE;YACZ,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SAC/C,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,IACE,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC;QAC/B,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,WAAW,CAAC,QAAQ,EAC1D,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QACpB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QACpB,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SAC/C,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,QAAQ;IACR,OAAO,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,UAAU,CAAC,KAAkB,EAAE,KAAqB;IAC3D,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,YAAY,CAAC,KAAK,CAAC,CAAC;IAEpB,OAAO,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC;YAAE,MAAM;QAC9C,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAClD,OAAO;QACL,IAAI,EAAE,OAAO;QACb,QAAQ;QACR,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAkB,EAAE,KAAqB;IAC1D,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,YAAY,CAAC,KAAK,CAAC,CAAC;IAEpB,OAAO,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC;YAAE,MAAM;QAC9C,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QACpC,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAClD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO;QACP,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAkB;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACvE,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAEvC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,QAAQ,CAAC,KAAK;QACnB,KAAK;QACL,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,2BAA2B;AAC3B,+DAA+D;AAE/D;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,KAAkB;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IAExC,gCAAgC;IAChC,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa;QAC7B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO;YACL,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,EAAE;YACV,IAAI;YACJ,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SACrC,CAAC;IACJ,CAAC;IAED,uBAAuB;IACvB,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAElD,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,OAAO,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB;YAChC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAElD,qDAAqD;IACrD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAE9B,OAAO;QACL,IAAI,EAAE,SAAS;QACf,MAAM;QACN,IAAI;QACJ,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;KACrC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,KAAkB;IAC1C,iBAAiB;IACjB,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,kDAAkD;IAClD,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,mEAAmE;IACnE,0BAA0B;IAC1B,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACxE,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,uEAAuE;IACvE,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,KAAkB;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACxC,MAAM,SAAS,GAAG,MAAM,CACtB,KAAK,EACL,WAAW,CAAC,UAAU,EACtB,yBAAyB,CAC1B,CAAC;IAEF,IAAI,QAAQ,GAAwC,IAAI,CAAC;IACzD,IAAI,YAAY,GAAuB,IAAI,CAAC;IAE5C,2BAA2B;IAC3B,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACpD,CAAC;IAED,2DAA2D;IAC3D,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,SAAS,CAAC,KAAK;QACrB,QAAQ;QACR,YAAY;QACZ,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;KAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser Extension: Collection Operator Parsing
|
|
3
|
+
* each, map, fold, filter
|
|
4
|
+
*/
|
|
5
|
+
import type { EachExprNode, FilterExprNode, FoldExprNode, IteratorBody, MapExprNode } from '../types.js';
|
|
6
|
+
declare module './parser.js' {
|
|
7
|
+
interface Parser {
|
|
8
|
+
parseIteratorBody(): IteratorBody;
|
|
9
|
+
hasAccumulatorPrefix(): boolean;
|
|
10
|
+
parseEachExpr(): EachExprNode;
|
|
11
|
+
parseMapExpr(): MapExprNode;
|
|
12
|
+
parseFoldExpr(): FoldExprNode;
|
|
13
|
+
parseFilterExpr(): FilterExprNode;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=parser-collect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-collect.d.ts","sourceRoot":"","sources":["../../src/parser/parser-collect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,WAAW,EACZ,MAAM,aAAa,CAAC;AAMrB,OAAO,QAAQ,aAAa,CAAC;IAC3B,UAAU,MAAM;QACd,iBAAiB,IAAI,YAAY,CAAC;QAClC,oBAAoB,IAAI,OAAO,CAAC;QAChC,aAAa,IAAI,YAAY,CAAC;QAC9B,YAAY,IAAI,WAAW,CAAC;QAC5B,aAAa,IAAI,YAAY,CAAC;QAC9B,eAAe,IAAI,cAAc,CAAC;KACnC;CACF"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser Extension: Collection Operator Parsing
|
|
3
|
+
* each, map, fold, filter
|
|
4
|
+
*/
|
|
5
|
+
import { Parser } from './parser.js';
|
|
6
|
+
import { ParseError, TOKEN_TYPES } from '../types.js';
|
|
7
|
+
import { check, expect, current, makeSpan, peek } from './state.js';
|
|
8
|
+
import { isClosureStart, parseBareHostCall } from './helpers.js';
|
|
9
|
+
// ============================================================
|
|
10
|
+
// COLLECTION OPERATOR BODY
|
|
11
|
+
// ============================================================
|
|
12
|
+
Parser.prototype.parseIteratorBody = function () {
|
|
13
|
+
if (isClosureStart(this.state)) {
|
|
14
|
+
return this.parseClosure();
|
|
15
|
+
}
|
|
16
|
+
if (check(this.state, TOKEN_TYPES.LBRACE)) {
|
|
17
|
+
return this.parseBlock();
|
|
18
|
+
}
|
|
19
|
+
if (check(this.state, TOKEN_TYPES.LPAREN)) {
|
|
20
|
+
return this.parseGrouped();
|
|
21
|
+
}
|
|
22
|
+
if (check(this.state, TOKEN_TYPES.DOLLAR) ||
|
|
23
|
+
check(this.state, TOKEN_TYPES.PIPE_VAR)) {
|
|
24
|
+
return this.parseVariable();
|
|
25
|
+
}
|
|
26
|
+
if (check(this.state, TOKEN_TYPES.STAR)) {
|
|
27
|
+
return this.parseSpread();
|
|
28
|
+
}
|
|
29
|
+
// Method shorthand: .method applies method to each element
|
|
30
|
+
if (check(this.state, TOKEN_TYPES.DOT)) {
|
|
31
|
+
return this.parsePostfixExpr();
|
|
32
|
+
}
|
|
33
|
+
// Bare function name: func or ns::func (no parens)
|
|
34
|
+
if (check(this.state, TOKEN_TYPES.IDENTIFIER)) {
|
|
35
|
+
return parseBareHostCall(this.state);
|
|
36
|
+
}
|
|
37
|
+
throw new ParseError(`Expected collection body (closure, block, grouped, variable, spread, method, or function), got: ${current(this.state).value}`, current(this.state).span.start);
|
|
38
|
+
};
|
|
39
|
+
Parser.prototype.hasAccumulatorPrefix = function () {
|
|
40
|
+
if (!check(this.state, TOKEN_TYPES.LPAREN)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
let depth = 1;
|
|
44
|
+
let i = 1;
|
|
45
|
+
while (depth > 0) {
|
|
46
|
+
const token = peek(this.state, i);
|
|
47
|
+
if (!token)
|
|
48
|
+
return false;
|
|
49
|
+
if (token.type === TOKEN_TYPES.LPAREN)
|
|
50
|
+
depth++;
|
|
51
|
+
else if (token.type === TOKEN_TYPES.RPAREN)
|
|
52
|
+
depth--;
|
|
53
|
+
i++;
|
|
54
|
+
}
|
|
55
|
+
const afterParen = peek(this.state, i);
|
|
56
|
+
if (!afterParen)
|
|
57
|
+
return false;
|
|
58
|
+
return (afterParen.type === TOKEN_TYPES.LBRACE ||
|
|
59
|
+
afterParen.type === TOKEN_TYPES.PIPE_BAR ||
|
|
60
|
+
afterParen.type === TOKEN_TYPES.OR ||
|
|
61
|
+
afterParen.type === TOKEN_TYPES.LPAREN);
|
|
62
|
+
};
|
|
63
|
+
// ============================================================
|
|
64
|
+
// EACH
|
|
65
|
+
// ============================================================
|
|
66
|
+
Parser.prototype.parseEachExpr = function () {
|
|
67
|
+
const start = current(this.state).span.start;
|
|
68
|
+
expect(this.state, TOKEN_TYPES.EACH, 'Expected each');
|
|
69
|
+
let accumulator = null;
|
|
70
|
+
if (this.hasAccumulatorPrefix()) {
|
|
71
|
+
accumulator = this.parseGrouped().expression;
|
|
72
|
+
}
|
|
73
|
+
const body = this.parseIteratorBody();
|
|
74
|
+
return {
|
|
75
|
+
type: 'EachExpr',
|
|
76
|
+
body,
|
|
77
|
+
accumulator,
|
|
78
|
+
span: makeSpan(start, current(this.state).span.end),
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
// ============================================================
|
|
82
|
+
// MAP
|
|
83
|
+
// ============================================================
|
|
84
|
+
Parser.prototype.parseMapExpr = function () {
|
|
85
|
+
const start = current(this.state).span.start;
|
|
86
|
+
expect(this.state, TOKEN_TYPES.MAP, 'Expected map');
|
|
87
|
+
const body = this.parseIteratorBody();
|
|
88
|
+
return {
|
|
89
|
+
type: 'MapExpr',
|
|
90
|
+
body,
|
|
91
|
+
span: makeSpan(start, current(this.state).span.end),
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
// ============================================================
|
|
95
|
+
// FOLD
|
|
96
|
+
// ============================================================
|
|
97
|
+
Parser.prototype.parseFoldExpr = function () {
|
|
98
|
+
const start = current(this.state).span.start;
|
|
99
|
+
expect(this.state, TOKEN_TYPES.FOLD, 'Expected fold');
|
|
100
|
+
let accumulator = null;
|
|
101
|
+
if (this.hasAccumulatorPrefix()) {
|
|
102
|
+
accumulator = this.parseGrouped().expression;
|
|
103
|
+
}
|
|
104
|
+
const body = this.parseIteratorBody();
|
|
105
|
+
return {
|
|
106
|
+
type: 'FoldExpr',
|
|
107
|
+
body,
|
|
108
|
+
accumulator,
|
|
109
|
+
span: makeSpan(start, current(this.state).span.end),
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
// ============================================================
|
|
113
|
+
// FILTER
|
|
114
|
+
// ============================================================
|
|
115
|
+
Parser.prototype.parseFilterExpr = function () {
|
|
116
|
+
const start = current(this.state).span.start;
|
|
117
|
+
expect(this.state, TOKEN_TYPES.FILTER, 'Expected filter');
|
|
118
|
+
const body = this.parseIteratorBody();
|
|
119
|
+
return {
|
|
120
|
+
type: 'FilterExpr',
|
|
121
|
+
body,
|
|
122
|
+
span: makeSpan(start, current(this.state).span.end),
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
//# sourceMappingURL=parser-collect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-collect.js","sourceRoot":"","sources":["../../src/parser/parser-collect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser Extension: Control Flow Parsing
|
|
3
|
+
* Conditionals, loops, and blocks
|
|
4
|
+
*/
|
|
5
|
+
import type { BlockNode, ConditionalNode, DoWhileLoopNode, ExpressionNode, WhileLoopNode, BodyNode } from '../types.js';
|
|
6
|
+
declare module './parser.js' {
|
|
7
|
+
interface Parser {
|
|
8
|
+
parsePipedConditional(): ConditionalNode;
|
|
9
|
+
parseConditionalWithCondition(conditionBody: BodyNode): ConditionalNode;
|
|
10
|
+
parseConditionalRest(condition: BodyNode | null, start: {
|
|
11
|
+
line: number;
|
|
12
|
+
column: number;
|
|
13
|
+
offset: number;
|
|
14
|
+
}): ConditionalNode;
|
|
15
|
+
parseLoop(condition: ExpressionNode | null): WhileLoopNode | DoWhileLoopNode;
|
|
16
|
+
parseLoopWithInput(condition: BodyNode): WhileLoopNode | DoWhileLoopNode;
|
|
17
|
+
parseBlock(): BlockNode;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=parser-control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-control.d.ts","sourceRoot":"","sources":["../../src/parser/parser-control.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAEV,SAAS,EACT,eAAe,EACf,eAAe,EACf,cAAc,EACd,aAAa,EACb,QAAQ,EAET,MAAM,aAAa,CAAC;AAarB,OAAO,QAAQ,aAAa,CAAC;IAC3B,UAAU,MAAM;QACd,qBAAqB,IAAI,eAAe,CAAC;QACzC,6BAA6B,CAAC,aAAa,EAAE,QAAQ,GAAG,eAAe,CAAC;QACxE,oBAAoB,CAClB,SAAS,EAAE,QAAQ,GAAG,IAAI,EAC1B,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,GACtD,eAAe,CAAC;QACnB,SAAS,CACP,SAAS,EAAE,cAAc,GAAG,IAAI,GAC/B,aAAa,GAAG,eAAe,CAAC;QACnC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,GAAG,aAAa,GAAG,eAAe,CAAC;QACzE,UAAU,IAAI,SAAS,CAAC;KACzB;CACF"}
|