@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,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser Helpers
|
|
3
|
+
* Lookahead predicates and utility parsing functions
|
|
4
|
+
* @internal This module contains internal parser utilities
|
|
5
|
+
*/
|
|
6
|
+
import { ParseError, TOKEN_TYPES } from '../types.js';
|
|
7
|
+
import { check, peek, expect } from './state.js';
|
|
8
|
+
// ============================================================
|
|
9
|
+
// VALID TYPE NAMES
|
|
10
|
+
// ============================================================
|
|
11
|
+
/** @internal */
|
|
12
|
+
export const VALID_TYPE_NAMES = [
|
|
13
|
+
'string',
|
|
14
|
+
'number',
|
|
15
|
+
'bool',
|
|
16
|
+
'closure',
|
|
17
|
+
'list',
|
|
18
|
+
'dict',
|
|
19
|
+
'tuple',
|
|
20
|
+
];
|
|
21
|
+
/** @internal */
|
|
22
|
+
export const FUNC_PARAM_TYPES = ['string', 'number', 'bool'];
|
|
23
|
+
// ============================================================
|
|
24
|
+
// LOOKAHEAD PREDICATES
|
|
25
|
+
// ============================================================
|
|
26
|
+
/**
|
|
27
|
+
* Check for function call: identifier( or namespace::func(
|
|
28
|
+
* Supports: func(), ns::func(), ns::sub::func()
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
export function isHostCall(state) {
|
|
32
|
+
if (!check(state, TOKEN_TYPES.IDENTIFIER)) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
// Simple case: identifier(
|
|
36
|
+
if (peek(state, 1).type === TOKEN_TYPES.LPAREN) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
// Namespaced case: identifier::identifier(
|
|
40
|
+
// Scan ahead for pattern: IDENT (:: IDENT)* (
|
|
41
|
+
let offset = 1;
|
|
42
|
+
while (peek(state, offset).type === TOKEN_TYPES.DOUBLE_COLON) {
|
|
43
|
+
offset++; // skip ::
|
|
44
|
+
if (peek(state, offset).type !== TOKEN_TYPES.IDENTIFIER) {
|
|
45
|
+
return false; // :: must be followed by identifier
|
|
46
|
+
}
|
|
47
|
+
offset++; // skip identifier
|
|
48
|
+
}
|
|
49
|
+
// If we consumed at least one ::, check for (
|
|
50
|
+
return offset > 1 && peek(state, offset).type === TOKEN_TYPES.LPAREN;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check for simple closure call: $name(
|
|
54
|
+
* Used in expression context where $var.method() should be parsed as Variable + MethodCall
|
|
55
|
+
* @internal
|
|
56
|
+
*/
|
|
57
|
+
export function isClosureCall(state) {
|
|
58
|
+
return (check(state, TOKEN_TYPES.DOLLAR) &&
|
|
59
|
+
peek(state, 1).type === TOKEN_TYPES.IDENTIFIER &&
|
|
60
|
+
peek(state, 2).type === TOKEN_TYPES.LPAREN);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check for closure call with property access: $name( or $name.prop...(
|
|
64
|
+
* Used in pipe target context where $dict.closure() should invoke the closure
|
|
65
|
+
* @internal
|
|
66
|
+
*/
|
|
67
|
+
export function isClosureCallWithAccess(state) {
|
|
68
|
+
if (!check(state, TOKEN_TYPES.DOLLAR))
|
|
69
|
+
return false;
|
|
70
|
+
if (peek(state, 1).type !== TOKEN_TYPES.IDENTIFIER)
|
|
71
|
+
return false;
|
|
72
|
+
// Scan through .identifier chains to find terminal (
|
|
73
|
+
let offset = 2;
|
|
74
|
+
while (peek(state, offset).type === TOKEN_TYPES.DOT) {
|
|
75
|
+
offset++; // skip .
|
|
76
|
+
if (peek(state, offset).type !== TOKEN_TYPES.IDENTIFIER)
|
|
77
|
+
return false;
|
|
78
|
+
offset++; // skip identifier
|
|
79
|
+
}
|
|
80
|
+
return peek(state, offset).type === TOKEN_TYPES.LPAREN;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check for pipe invoke: $( (invoke pipe value as closure)
|
|
84
|
+
* @internal
|
|
85
|
+
*/
|
|
86
|
+
export function canStartPipeInvoke(state) {
|
|
87
|
+
return (check(state, TOKEN_TYPES.PIPE_VAR) &&
|
|
88
|
+
peek(state, 1).type === TOKEN_TYPES.LPAREN);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Check for method call: .identifier
|
|
92
|
+
* @internal
|
|
93
|
+
*/
|
|
94
|
+
export function isMethodCall(state) {
|
|
95
|
+
return (check(state, TOKEN_TYPES.DOT) &&
|
|
96
|
+
peek(state, 1).type === TOKEN_TYPES.IDENTIFIER);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check for sequential spread target: @$ or @[ (not @{ which is for-loop)
|
|
100
|
+
* @internal
|
|
101
|
+
*/
|
|
102
|
+
export function isClosureChainTarget(state) {
|
|
103
|
+
return (check(state, TOKEN_TYPES.AT) &&
|
|
104
|
+
(peek(state, 1).type === TOKEN_TYPES.DOLLAR ||
|
|
105
|
+
peek(state, 1).type === TOKEN_TYPES.LBRACKET));
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Check for negative number: -42
|
|
109
|
+
* @internal
|
|
110
|
+
*/
|
|
111
|
+
export function isNegativeNumber(state) {
|
|
112
|
+
return (check(state, TOKEN_TYPES.MINUS) &&
|
|
113
|
+
peek(state, 1).type === TOKEN_TYPES.NUMBER);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check for dict start: identifier followed by colon
|
|
117
|
+
* @internal
|
|
118
|
+
*/
|
|
119
|
+
export function isDictStart(state) {
|
|
120
|
+
return (check(state, TOKEN_TYPES.IDENTIFIER) &&
|
|
121
|
+
peek(state, 1).type === TOKEN_TYPES.COLON);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Check for method call with args (for field access termination): .identifier(
|
|
125
|
+
* @internal
|
|
126
|
+
*/
|
|
127
|
+
export function isMethodCallWithArgs(state) {
|
|
128
|
+
return (peek(state, 1).type === TOKEN_TYPES.IDENTIFIER &&
|
|
129
|
+
peek(state, 2).type === TOKEN_TYPES.LPAREN);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Check for literal start (not LPAREN - that's now grouping)
|
|
133
|
+
* @internal
|
|
134
|
+
*/
|
|
135
|
+
export function isLiteralStart(state) {
|
|
136
|
+
return check(state, TOKEN_TYPES.STRING, TOKEN_TYPES.NUMBER, TOKEN_TYPES.TRUE, TOKEN_TYPES.FALSE, TOKEN_TYPES.LBRACKET);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check if current token can start an expression (for bare spread detection)
|
|
140
|
+
* @internal
|
|
141
|
+
*/
|
|
142
|
+
export function canStartExpression(state) {
|
|
143
|
+
return (isLiteralStart(state) ||
|
|
144
|
+
isClosureStart(state) ||
|
|
145
|
+
check(state, TOKEN_TYPES.DOLLAR, TOKEN_TYPES.PIPE_VAR, TOKEN_TYPES.IDENTIFIER, TOKEN_TYPES.DOT, TOKEN_TYPES.LPAREN, TOKEN_TYPES.LBRACE, TOKEN_TYPES.AT, TOKEN_TYPES.QUESTION, TOKEN_TYPES.BANG, TOKEN_TYPES.STAR, TOKEN_TYPES.MINUS));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Check for closure start: | or ||
|
|
149
|
+
* - |params| body
|
|
150
|
+
* - || body (no-param closure)
|
|
151
|
+
* @internal
|
|
152
|
+
*/
|
|
153
|
+
export function isClosureStart(state) {
|
|
154
|
+
return check(state, TOKEN_TYPES.PIPE_BAR, TOKEN_TYPES.OR);
|
|
155
|
+
}
|
|
156
|
+
// ============================================================
|
|
157
|
+
// UTILITY PARSING FUNCTIONS
|
|
158
|
+
// ============================================================
|
|
159
|
+
/**
|
|
160
|
+
* Parse and validate a type name from an identifier token.
|
|
161
|
+
* Throws ParseError if the type is not in the allowed list.
|
|
162
|
+
* @internal
|
|
163
|
+
*/
|
|
164
|
+
export function parseTypeName(state, validTypes) {
|
|
165
|
+
const typeToken = expect(state, TOKEN_TYPES.IDENTIFIER, 'Expected type name');
|
|
166
|
+
if (!validTypes.includes(typeToken.value)) {
|
|
167
|
+
throw new ParseError(`Invalid type: ${typeToken.value} (expected: ${validTypes.join(', ')})`, typeToken.span.start);
|
|
168
|
+
}
|
|
169
|
+
return typeToken.value;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Create a block containing a single boolean literal statement
|
|
173
|
+
* @internal
|
|
174
|
+
*/
|
|
175
|
+
export function makeBoolLiteralBlock(value, span) {
|
|
176
|
+
return {
|
|
177
|
+
type: 'Block',
|
|
178
|
+
statements: [
|
|
179
|
+
{
|
|
180
|
+
type: 'Statement',
|
|
181
|
+
expression: {
|
|
182
|
+
type: 'PipeChain',
|
|
183
|
+
head: {
|
|
184
|
+
type: 'PostfixExpr',
|
|
185
|
+
primary: { type: 'BoolLiteral', value, span },
|
|
186
|
+
methods: [],
|
|
187
|
+
span,
|
|
188
|
+
},
|
|
189
|
+
pipes: [],
|
|
190
|
+
terminator: null,
|
|
191
|
+
span,
|
|
192
|
+
},
|
|
193
|
+
span,
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
span,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// Note: parseArgumentList is defined in expressions.ts to avoid circular dependencies
|
|
200
|
+
// since it depends on parseExpression
|
|
201
|
+
// ============================================================
|
|
202
|
+
// BARE HOST CALL PARSING
|
|
203
|
+
// ============================================================
|
|
204
|
+
/**
|
|
205
|
+
* Parse a bare function name (no parens): `func` or `ns::func` or `ns::sub::func`
|
|
206
|
+
* Returns a HostCallNode with empty args.
|
|
207
|
+
* @internal
|
|
208
|
+
*/
|
|
209
|
+
export function parseBareHostCall(state) {
|
|
210
|
+
const start = state.tokens[state.pos].span.start;
|
|
211
|
+
let name = expect(state, TOKEN_TYPES.IDENTIFIER, 'Expected identifier').value;
|
|
212
|
+
// Collect namespaced name: ident::ident::...
|
|
213
|
+
while (check(state, TOKEN_TYPES.DOUBLE_COLON)) {
|
|
214
|
+
state.pos++; // consume ::
|
|
215
|
+
const next = expect(state, TOKEN_TYPES.IDENTIFIER, 'Expected identifier after ::');
|
|
216
|
+
name += '::' + next.value;
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
type: 'HostCall',
|
|
220
|
+
name,
|
|
221
|
+
args: [],
|
|
222
|
+
span: { start, end: state.tokens[state.pos - 1].span.end },
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/parser/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rill Parser
|
|
3
|
+
* Main entry point and re-exports
|
|
4
|
+
*/
|
|
5
|
+
import type { ParseResult, ScriptNode } from '../types.js';
|
|
6
|
+
import './parser-script.js';
|
|
7
|
+
import './parser-expr.js';
|
|
8
|
+
import './parser-literals.js';
|
|
9
|
+
import './parser-variables.js';
|
|
10
|
+
import './parser-control.js';
|
|
11
|
+
import './parser-functions.js';
|
|
12
|
+
import './parser-collect.js';
|
|
13
|
+
import './parser-extract.js';
|
|
14
|
+
/**
|
|
15
|
+
* Parse rill source code into an AST.
|
|
16
|
+
*
|
|
17
|
+
* Throws ParseError on first syntax error.
|
|
18
|
+
*
|
|
19
|
+
* @param source - The source code to parse
|
|
20
|
+
* @returns The parsed AST (ScriptNode)
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const ast = parse(source);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function parse(source: string): ScriptNode;
|
|
28
|
+
/**
|
|
29
|
+
* Parse rill source code with error recovery for IDE/tooling scenarios.
|
|
30
|
+
*
|
|
31
|
+
* Instead of throwing on first error, collects errors and returns
|
|
32
|
+
* a partial AST with ErrorNode entries where parsing failed.
|
|
33
|
+
*
|
|
34
|
+
* @param source - The source code to parse
|
|
35
|
+
* @returns ParseResult with AST, errors array, and success flag
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* const result = parseWithRecovery(source);
|
|
40
|
+
* if (!result.success) {
|
|
41
|
+
* console.log('Errors:', result.errors);
|
|
42
|
+
* }
|
|
43
|
+
* // AST may contain ErrorNode entries in statements
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function parseWithRecovery(source: string): ParseResult;
|
|
47
|
+
export { createParserState, type ParserState } from './state.js';
|
|
48
|
+
export { Parser } from './parser.js';
|
|
49
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK3D,OAAO,oBAAoB,CAAC;AAC5B,OAAO,kBAAkB,CAAC;AAC1B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,qBAAqB,CAAC;AAM7B;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAIhD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAU7D;AAOD,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAGjE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rill Parser
|
|
3
|
+
* Main entry point and re-exports
|
|
4
|
+
*/
|
|
5
|
+
import { tokenize } from '../lexer/index.js';
|
|
6
|
+
import { Parser } from './parser.js';
|
|
7
|
+
// Import extension modules to register prototype methods on Parser.
|
|
8
|
+
// These must be imported AFTER parser.js to ensure the class is defined.
|
|
9
|
+
import './parser-script.js';
|
|
10
|
+
import './parser-expr.js';
|
|
11
|
+
import './parser-literals.js';
|
|
12
|
+
import './parser-variables.js';
|
|
13
|
+
import './parser-control.js';
|
|
14
|
+
import './parser-functions.js';
|
|
15
|
+
import './parser-collect.js';
|
|
16
|
+
import './parser-extract.js';
|
|
17
|
+
// ============================================================
|
|
18
|
+
// MAIN ENTRY POINT
|
|
19
|
+
// ============================================================
|
|
20
|
+
/**
|
|
21
|
+
* Parse rill source code into an AST.
|
|
22
|
+
*
|
|
23
|
+
* Throws ParseError on first syntax error.
|
|
24
|
+
*
|
|
25
|
+
* @param source - The source code to parse
|
|
26
|
+
* @returns The parsed AST (ScriptNode)
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const ast = parse(source);
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function parse(source) {
|
|
34
|
+
const tokens = tokenize(source);
|
|
35
|
+
const parser = new Parser(tokens, { recoveryMode: false, source: '' });
|
|
36
|
+
return parser.parse();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Parse rill source code with error recovery for IDE/tooling scenarios.
|
|
40
|
+
*
|
|
41
|
+
* Instead of throwing on first error, collects errors and returns
|
|
42
|
+
* a partial AST with ErrorNode entries where parsing failed.
|
|
43
|
+
*
|
|
44
|
+
* @param source - The source code to parse
|
|
45
|
+
* @returns ParseResult with AST, errors array, and success flag
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* const result = parseWithRecovery(source);
|
|
50
|
+
* if (!result.success) {
|
|
51
|
+
* console.log('Errors:', result.errors);
|
|
52
|
+
* }
|
|
53
|
+
* // AST may contain ErrorNode entries in statements
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export function parseWithRecovery(source) {
|
|
57
|
+
const tokens = tokenize(source);
|
|
58
|
+
const parser = new Parser(tokens, { recoveryMode: true, source });
|
|
59
|
+
const ast = parser.parse();
|
|
60
|
+
return {
|
|
61
|
+
ast,
|
|
62
|
+
errors: parser.errors,
|
|
63
|
+
success: parser.errors.length === 0,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// ============================================================
|
|
67
|
+
// RE-EXPORTS
|
|
68
|
+
// ============================================================
|
|
69
|
+
// State (for advanced usage)
|
|
70
|
+
export { createParserState } from './state.js';
|
|
71
|
+
// Parser class (for advanced usage)
|
|
72
|
+
export { Parser } from './parser.js';
|
|
73
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,oEAAoE;AACpE,yEAAyE;AACzE,OAAO,oBAAoB,CAAC;AAC5B,OAAO,kBAAkB,CAAC;AAC1B,OAAO,sBAAsB,CAAC;AAC9B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,qBAAqB,CAAC;AAE7B,+DAA+D;AAC/D,mBAAmB;AACnB,+DAA+D;AAE/D;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,KAAK,CAAC,MAAc;IAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAE3B,OAAO;QACL,GAAG;QACH,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,aAAa;AACb,+DAA+D;AAE/D,6BAA6B;AAC7B,OAAO,EAAE,iBAAiB,EAAoB,MAAM,YAAY,CAAC;AAEjE,oCAAoC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Literal Parsing
|
|
3
|
+
* Strings, numbers, booleans, tuples, dicts, and closures
|
|
4
|
+
*/
|
|
5
|
+
import type { BlockNode, DictNode, ExpressionNode, ClosureNode, GroupedExprNode, LiteralNode, PipeChainNode, PostfixExprNode, BodyNode, StringLiteralNode, TupleNode } from '../types.js';
|
|
6
|
+
import { type ParserState } from './state.js';
|
|
7
|
+
export declare function setParseExpression(fn: (state: ParserState) => ExpressionNode): void;
|
|
8
|
+
export declare function setParseBlock(fn: (state: ParserState) => BlockNode): void;
|
|
9
|
+
export declare function setParseGrouped(fn: (state: ParserState) => GroupedExprNode): void;
|
|
10
|
+
export declare function setParsePostfixExpr(fn: (state: ParserState) => PostfixExprNode): void;
|
|
11
|
+
export declare function setLiteralsParsePipeChain(fn: (state: ParserState) => PipeChainNode): void;
|
|
12
|
+
export declare function parseLiteral(state: ParserState): LiteralNode;
|
|
13
|
+
/**
|
|
14
|
+
* Parse a string literal, handling interpolation expressions.
|
|
15
|
+
* Interpolation uses {expr} syntax where expr is any valid expression.
|
|
16
|
+
* Escaped braces \{ and \} produce literal braces.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseString(state: ParserState): StringLiteralNode;
|
|
19
|
+
export declare function parseTupleOrDict(state: ParserState): TupleNode | DictNode;
|
|
20
|
+
/**
|
|
21
|
+
* Parse closure: |params| body or || body
|
|
22
|
+
* Params can be: |x|, |x: string|, |x: string = "default"|
|
|
23
|
+
*
|
|
24
|
+
* Body can be:
|
|
25
|
+
* - Simple: |x| $x (postfix-expr)
|
|
26
|
+
* - Grouped: |x| ($x * 2) (compound expression)
|
|
27
|
+
* - Block: |x| { $a ↵ $b } (multiple statements)
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseClosure(state: ParserState): ClosureNode;
|
|
30
|
+
/**
|
|
31
|
+
* Parse simple-body: block, grouped, or postfix-expr
|
|
32
|
+
* No naked compound expressions — arithmetic/pipes/booleans must be grouped.
|
|
33
|
+
*
|
|
34
|
+
* Used by: closures, conditionals, loops
|
|
35
|
+
*/
|
|
36
|
+
export declare function parseBody(state: ParserState): BodyNode;
|
|
37
|
+
//# sourceMappingURL=literals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literals.d.ts","sourceRoot":"","sources":["../../src/parser/literals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,SAAS,EAET,QAAQ,EACR,cAAc,EAEd,WAAW,EACX,eAAe,EAEf,WAAW,EACX,aAAa,EACb,eAAe,EACf,QAAQ,EAER,iBAAiB,EACjB,SAAS,EACV,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,KAAK,WAAW,EAQjB,MAAM,YAAY,CAAC;AAUpB,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,cAAc,GACzC,IAAI,CAEN;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,SAAS,GAAG,IAAI,CAEzE;AAED,wBAAgB,eAAe,CAC7B,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,eAAe,GAC1C,IAAI,CAEN;AAED,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,eAAe,GAC1C,IAAI,CAEN;AAED,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,aAAa,GACxC,IAAI,CAEN;AAMD,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CA2C5D;AAMD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAajE;AAwID,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAoCzE;AA8DD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAsC5D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,QAAQ,CAmBtD"}
|