@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.
Files changed (295) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +187 -0
  3. package/dist/cli.d.ts +11 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +69 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/demo.d.ts +6 -0
  8. package/dist/demo.d.ts.map +1 -0
  9. package/dist/demo.js +121 -0
  10. package/dist/demo.js.map +1 -0
  11. package/dist/index.d.ts +10 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +9 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/lexer/errors.d.ts +9 -0
  16. package/dist/lexer/errors.d.ts.map +1 -0
  17. package/dist/lexer/errors.js +12 -0
  18. package/dist/lexer/errors.js.map +1 -0
  19. package/dist/lexer/helpers.d.ts +14 -0
  20. package/dist/lexer/helpers.d.ts.map +1 -0
  21. package/dist/lexer/helpers.js +30 -0
  22. package/dist/lexer/helpers.js.map +1 -0
  23. package/dist/lexer/index.d.ts +8 -0
  24. package/dist/lexer/index.d.ts.map +1 -0
  25. package/dist/lexer/index.js +8 -0
  26. package/dist/lexer/index.js.map +1 -0
  27. package/dist/lexer/operators.d.ts +11 -0
  28. package/dist/lexer/operators.d.ts.map +1 -0
  29. package/dist/lexer/operators.js +58 -0
  30. package/dist/lexer/operators.js.map +1 -0
  31. package/dist/lexer/readers.d.ts +12 -0
  32. package/dist/lexer/readers.d.ts.map +1 -0
  33. package/dist/lexer/readers.js +144 -0
  34. package/dist/lexer/readers.js.map +1 -0
  35. package/dist/lexer/state.d.ts +18 -0
  36. package/dist/lexer/state.d.ts.map +1 -0
  37. package/dist/lexer/state.js +37 -0
  38. package/dist/lexer/state.js.map +1 -0
  39. package/dist/lexer/tokenizer.d.ts +9 -0
  40. package/dist/lexer/tokenizer.d.ts.map +1 -0
  41. package/dist/lexer/tokenizer.js +100 -0
  42. package/dist/lexer/tokenizer.js.map +1 -0
  43. package/dist/lexer.d.ts +19 -0
  44. package/dist/lexer.d.ts.map +1 -0
  45. package/dist/lexer.js +344 -0
  46. package/dist/lexer.js.map +1 -0
  47. package/dist/parser/arithmetic.d.ts +16 -0
  48. package/dist/parser/arithmetic.d.ts.map +1 -0
  49. package/dist/parser/arithmetic.js +128 -0
  50. package/dist/parser/arithmetic.js.map +1 -0
  51. package/dist/parser/boolean.d.ts +15 -0
  52. package/dist/parser/boolean.d.ts.map +1 -0
  53. package/dist/parser/boolean.js +20 -0
  54. package/dist/parser/boolean.js.map +1 -0
  55. package/dist/parser/control-flow.d.ts +56 -0
  56. package/dist/parser/control-flow.d.ts.map +1 -0
  57. package/dist/parser/control-flow.js +167 -0
  58. package/dist/parser/control-flow.js.map +1 -0
  59. package/dist/parser/expressions.d.ts +23 -0
  60. package/dist/parser/expressions.d.ts.map +1 -0
  61. package/dist/parser/expressions.js +950 -0
  62. package/dist/parser/expressions.js.map +1 -0
  63. package/dist/parser/extraction.d.ts +48 -0
  64. package/dist/parser/extraction.d.ts.map +1 -0
  65. package/dist/parser/extraction.js +279 -0
  66. package/dist/parser/extraction.js.map +1 -0
  67. package/dist/parser/functions.d.ts +20 -0
  68. package/dist/parser/functions.d.ts.map +1 -0
  69. package/dist/parser/functions.js +96 -0
  70. package/dist/parser/functions.js.map +1 -0
  71. package/dist/parser/helpers.d.ts +94 -0
  72. package/dist/parser/helpers.d.ts.map +1 -0
  73. package/dist/parser/helpers.js +225 -0
  74. package/dist/parser/helpers.js.map +1 -0
  75. package/dist/parser/index.d.ts +49 -0
  76. package/dist/parser/index.d.ts.map +1 -0
  77. package/dist/parser/index.js +73 -0
  78. package/dist/parser/index.js.map +1 -0
  79. package/dist/parser/literals.d.ts +37 -0
  80. package/dist/parser/literals.d.ts.map +1 -0
  81. package/dist/parser/literals.js +373 -0
  82. package/dist/parser/literals.js.map +1 -0
  83. package/dist/parser/parser-collect.d.ts +16 -0
  84. package/dist/parser/parser-collect.d.ts.map +1 -0
  85. package/dist/parser/parser-collect.js +125 -0
  86. package/dist/parser/parser-collect.js.map +1 -0
  87. package/dist/parser/parser-control.d.ts +20 -0
  88. package/dist/parser/parser-control.d.ts.map +1 -0
  89. package/dist/parser/parser-control.js +120 -0
  90. package/dist/parser/parser-control.js.map +1 -0
  91. package/dist/parser/parser-expr.d.ts +37 -0
  92. package/dist/parser/parser-expr.d.ts.map +1 -0
  93. package/dist/parser/parser-expr.js +639 -0
  94. package/dist/parser/parser-expr.js.map +1 -0
  95. package/dist/parser/parser-extract.d.ts +17 -0
  96. package/dist/parser/parser-extract.d.ts.map +1 -0
  97. package/dist/parser/parser-extract.js +222 -0
  98. package/dist/parser/parser-extract.js.map +1 -0
  99. package/dist/parser/parser-functions.d.ts +21 -0
  100. package/dist/parser/parser-functions.d.ts.map +1 -0
  101. package/dist/parser/parser-functions.js +155 -0
  102. package/dist/parser/parser-functions.js.map +1 -0
  103. package/dist/parser/parser-literals.d.ts +22 -0
  104. package/dist/parser/parser-literals.d.ts.map +1 -0
  105. package/dist/parser/parser-literals.js +288 -0
  106. package/dist/parser/parser-literals.js.map +1 -0
  107. package/dist/parser/parser-script.d.ts +21 -0
  108. package/dist/parser/parser-script.d.ts.map +1 -0
  109. package/dist/parser/parser-script.js +174 -0
  110. package/dist/parser/parser-script.js.map +1 -0
  111. package/dist/parser/parser-variables.d.ts +20 -0
  112. package/dist/parser/parser-variables.d.ts.map +1 -0
  113. package/dist/parser/parser-variables.js +146 -0
  114. package/dist/parser/parser-variables.js.map +1 -0
  115. package/dist/parser/parser.d.ts +49 -0
  116. package/dist/parser/parser.d.ts.map +1 -0
  117. package/dist/parser/parser.js +54 -0
  118. package/dist/parser/parser.js.map +1 -0
  119. package/dist/parser/script.d.ts +14 -0
  120. package/dist/parser/script.d.ts.map +1 -0
  121. package/dist/parser/script.js +196 -0
  122. package/dist/parser/script.js.map +1 -0
  123. package/dist/parser/state.d.ts +40 -0
  124. package/dist/parser/state.d.ts.map +1 -0
  125. package/dist/parser/state.js +129 -0
  126. package/dist/parser/state.js.map +1 -0
  127. package/dist/parser/variables.d.ts +10 -0
  128. package/dist/parser/variables.d.ts.map +1 -0
  129. package/dist/parser/variables.js +215 -0
  130. package/dist/parser/variables.js.map +1 -0
  131. package/dist/runtime/ast-equals.d.ts +13 -0
  132. package/dist/runtime/ast-equals.d.ts.map +1 -0
  133. package/dist/runtime/ast-equals.js +447 -0
  134. package/dist/runtime/ast-equals.js.map +1 -0
  135. package/dist/runtime/builtins.d.ts +13 -0
  136. package/dist/runtime/builtins.d.ts.map +1 -0
  137. package/dist/runtime/builtins.js +180 -0
  138. package/dist/runtime/builtins.js.map +1 -0
  139. package/dist/runtime/callable.d.ts +88 -0
  140. package/dist/runtime/callable.d.ts.map +1 -0
  141. package/dist/runtime/callable.js +98 -0
  142. package/dist/runtime/callable.js.map +1 -0
  143. package/dist/runtime/context.d.ts +13 -0
  144. package/dist/runtime/context.d.ts.map +1 -0
  145. package/dist/runtime/context.js +73 -0
  146. package/dist/runtime/context.js.map +1 -0
  147. package/dist/runtime/core/callable.d.ts +171 -0
  148. package/dist/runtime/core/callable.d.ts.map +1 -0
  149. package/dist/runtime/core/callable.js +246 -0
  150. package/dist/runtime/core/callable.js.map +1 -0
  151. package/dist/runtime/core/context.d.ts +29 -0
  152. package/dist/runtime/core/context.d.ts.map +1 -0
  153. package/dist/runtime/core/context.js +154 -0
  154. package/dist/runtime/core/context.js.map +1 -0
  155. package/dist/runtime/core/equals.d.ts +9 -0
  156. package/dist/runtime/core/equals.d.ts.map +1 -0
  157. package/dist/runtime/core/equals.js +381 -0
  158. package/dist/runtime/core/equals.js.map +1 -0
  159. package/dist/runtime/core/eval/base.d.ts +65 -0
  160. package/dist/runtime/core/eval/base.d.ts.map +1 -0
  161. package/dist/runtime/core/eval/base.js +112 -0
  162. package/dist/runtime/core/eval/base.js.map +1 -0
  163. package/dist/runtime/core/eval/evaluator.d.ts +47 -0
  164. package/dist/runtime/core/eval/evaluator.d.ts.map +1 -0
  165. package/dist/runtime/core/eval/evaluator.js +73 -0
  166. package/dist/runtime/core/eval/evaluator.js.map +1 -0
  167. package/dist/runtime/core/eval/index.d.ts +57 -0
  168. package/dist/runtime/core/eval/index.d.ts.map +1 -0
  169. package/dist/runtime/core/eval/index.js +95 -0
  170. package/dist/runtime/core/eval/index.js.map +1 -0
  171. package/dist/runtime/core/eval/mixins/annotations.d.ts +19 -0
  172. package/dist/runtime/core/eval/mixins/annotations.d.ts.map +1 -0
  173. package/dist/runtime/core/eval/mixins/annotations.js +146 -0
  174. package/dist/runtime/core/eval/mixins/annotations.js.map +1 -0
  175. package/dist/runtime/core/eval/mixins/closures.d.ts +49 -0
  176. package/dist/runtime/core/eval/mixins/closures.d.ts.map +1 -0
  177. package/dist/runtime/core/eval/mixins/closures.js +479 -0
  178. package/dist/runtime/core/eval/mixins/closures.js.map +1 -0
  179. package/dist/runtime/core/eval/mixins/collections.d.ts +24 -0
  180. package/dist/runtime/core/eval/mixins/collections.d.ts.map +1 -0
  181. package/dist/runtime/core/eval/mixins/collections.js +466 -0
  182. package/dist/runtime/core/eval/mixins/collections.js.map +1 -0
  183. package/dist/runtime/core/eval/mixins/control-flow.d.ts +27 -0
  184. package/dist/runtime/core/eval/mixins/control-flow.d.ts.map +1 -0
  185. package/dist/runtime/core/eval/mixins/control-flow.js +369 -0
  186. package/dist/runtime/core/eval/mixins/control-flow.js.map +1 -0
  187. package/dist/runtime/core/eval/mixins/core.d.ts +24 -0
  188. package/dist/runtime/core/eval/mixins/core.d.ts.map +1 -0
  189. package/dist/runtime/core/eval/mixins/core.js +335 -0
  190. package/dist/runtime/core/eval/mixins/core.js.map +1 -0
  191. package/dist/runtime/core/eval/mixins/expressions.d.ts +19 -0
  192. package/dist/runtime/core/eval/mixins/expressions.d.ts.map +1 -0
  193. package/dist/runtime/core/eval/mixins/expressions.js +202 -0
  194. package/dist/runtime/core/eval/mixins/expressions.js.map +1 -0
  195. package/dist/runtime/core/eval/mixins/extraction.d.ts +10 -0
  196. package/dist/runtime/core/eval/mixins/extraction.d.ts.map +1 -0
  197. package/dist/runtime/core/eval/mixins/extraction.js +250 -0
  198. package/dist/runtime/core/eval/mixins/extraction.js.map +1 -0
  199. package/dist/runtime/core/eval/mixins/literals.d.ts +23 -0
  200. package/dist/runtime/core/eval/mixins/literals.d.ts.map +1 -0
  201. package/dist/runtime/core/eval/mixins/literals.js +180 -0
  202. package/dist/runtime/core/eval/mixins/literals.js.map +1 -0
  203. package/dist/runtime/core/eval/mixins/types.d.ts +20 -0
  204. package/dist/runtime/core/eval/mixins/types.d.ts.map +1 -0
  205. package/dist/runtime/core/eval/mixins/types.js +109 -0
  206. package/dist/runtime/core/eval/mixins/types.js.map +1 -0
  207. package/dist/runtime/core/eval/mixins/variables.d.ts +34 -0
  208. package/dist/runtime/core/eval/mixins/variables.d.ts.map +1 -0
  209. package/dist/runtime/core/eval/mixins/variables.js +247 -0
  210. package/dist/runtime/core/eval/mixins/variables.js.map +1 -0
  211. package/dist/runtime/core/eval/types.d.ts +41 -0
  212. package/dist/runtime/core/eval/types.d.ts.map +1 -0
  213. package/dist/runtime/core/eval/types.js +10 -0
  214. package/dist/runtime/core/eval/types.js.map +1 -0
  215. package/dist/runtime/core/evaluate.d.ts +42 -0
  216. package/dist/runtime/core/evaluate.d.ts.map +1 -0
  217. package/dist/runtime/core/evaluate.debug.js +1251 -0
  218. package/dist/runtime/core/evaluate.js +1913 -0
  219. package/dist/runtime/core/evaluate.js.map +1 -0
  220. package/dist/runtime/core/execute.d.ts +26 -0
  221. package/dist/runtime/core/execute.d.ts.map +1 -0
  222. package/dist/runtime/core/execute.js +177 -0
  223. package/dist/runtime/core/execute.js.map +1 -0
  224. package/dist/runtime/core/signals.d.ts +19 -0
  225. package/dist/runtime/core/signals.d.ts.map +1 -0
  226. package/dist/runtime/core/signals.js +26 -0
  227. package/dist/runtime/core/signals.js.map +1 -0
  228. package/dist/runtime/core/types.d.ts +177 -0
  229. package/dist/runtime/core/types.d.ts.map +1 -0
  230. package/dist/runtime/core/types.js +50 -0
  231. package/dist/runtime/core/types.js.map +1 -0
  232. package/dist/runtime/core/values.d.ts +66 -0
  233. package/dist/runtime/core/values.d.ts.map +1 -0
  234. package/dist/runtime/core/values.js +240 -0
  235. package/dist/runtime/core/values.js.map +1 -0
  236. package/dist/runtime/evaluate.d.ts +32 -0
  237. package/dist/runtime/evaluate.d.ts.map +1 -0
  238. package/dist/runtime/evaluate.js +1111 -0
  239. package/dist/runtime/evaluate.js.map +1 -0
  240. package/dist/runtime/execute.d.ts +26 -0
  241. package/dist/runtime/execute.d.ts.map +1 -0
  242. package/dist/runtime/execute.js +121 -0
  243. package/dist/runtime/execute.js.map +1 -0
  244. package/dist/runtime/ext/builtins.d.ts +16 -0
  245. package/dist/runtime/ext/builtins.d.ts.map +1 -0
  246. package/dist/runtime/ext/builtins.js +528 -0
  247. package/dist/runtime/ext/builtins.js.map +1 -0
  248. package/dist/runtime/ext/content-parser.d.ts +83 -0
  249. package/dist/runtime/ext/content-parser.d.ts.map +1 -0
  250. package/dist/runtime/ext/content-parser.js +536 -0
  251. package/dist/runtime/ext/content-parser.js.map +1 -0
  252. package/dist/runtime/index.d.ts +28 -0
  253. package/dist/runtime/index.d.ts.map +1 -0
  254. package/dist/runtime/index.js +34 -0
  255. package/dist/runtime/index.js.map +1 -0
  256. package/dist/runtime/signals.d.ts +19 -0
  257. package/dist/runtime/signals.d.ts.map +1 -0
  258. package/dist/runtime/signals.js +26 -0
  259. package/dist/runtime/signals.js.map +1 -0
  260. package/dist/runtime/types.d.ts +169 -0
  261. package/dist/runtime/types.d.ts.map +1 -0
  262. package/dist/runtime/types.js +50 -0
  263. package/dist/runtime/types.js.map +1 -0
  264. package/dist/runtime/values.d.ts +50 -0
  265. package/dist/runtime/values.d.ts.map +1 -0
  266. package/dist/runtime/values.js +209 -0
  267. package/dist/runtime/values.js.map +1 -0
  268. package/dist/runtime.d.ts +254 -0
  269. package/dist/runtime.d.ts.map +1 -0
  270. package/dist/runtime.js +2014 -0
  271. package/dist/runtime.js.map +1 -0
  272. package/dist/types.d.ts +752 -0
  273. package/dist/types.d.ts.map +1 -0
  274. package/dist/types.js +189 -0
  275. package/dist/types.js.map +1 -0
  276. package/docs/00_INDEX.md +65 -0
  277. package/docs/01_guide.md +390 -0
  278. package/docs/02_types.md +399 -0
  279. package/docs/03_variables.md +314 -0
  280. package/docs/04_operators.md +551 -0
  281. package/docs/05_control-flow.md +350 -0
  282. package/docs/06_closures.md +353 -0
  283. package/docs/07_collections.md +686 -0
  284. package/docs/08_iterators.md +330 -0
  285. package/docs/09_strings.md +205 -0
  286. package/docs/10_parsing.md +366 -0
  287. package/docs/11_reference.md +350 -0
  288. package/docs/12_examples.md +771 -0
  289. package/docs/13_modules.md +519 -0
  290. package/docs/14_host-integration.md +826 -0
  291. package/docs/15_grammar.ebnf +693 -0
  292. package/docs/16_conventions.md +696 -0
  293. package/docs/99_llm-reference.txt +300 -0
  294. package/docs/assets/logo.png +0 -0
  295. package/package.json +70 -0
package/dist/lexer.js ADDED
@@ -0,0 +1,344 @@
1
+ /**
2
+ * Rill Lexer
3
+ * Converts source text into tokens
4
+ */
5
+ import { TOKEN_TYPES } from './types.js';
6
+ export function createLexerState(source) {
7
+ return {
8
+ source,
9
+ pos: 0,
10
+ line: 1,
11
+ column: 1,
12
+ };
13
+ }
14
+ // ============================================================
15
+ // LEXER ERRORS
16
+ // ============================================================
17
+ export class LexerError extends Error {
18
+ location;
19
+ constructor(message, location) {
20
+ super(`${message} at line ${location.line}, column ${location.column}`);
21
+ this.location = location;
22
+ this.name = 'LexerError';
23
+ }
24
+ }
25
+ // ============================================================
26
+ // HELPER FUNCTIONS
27
+ // ============================================================
28
+ function currentLocation(state) {
29
+ return { line: state.line, column: state.column, offset: state.pos };
30
+ }
31
+ function peek(state, offset = 0) {
32
+ return state.source[state.pos + offset] ?? '';
33
+ }
34
+ function peekString(state, length) {
35
+ return state.source.slice(state.pos, state.pos + length);
36
+ }
37
+ function advance(state) {
38
+ const ch = state.source[state.pos] ?? '';
39
+ state.pos++;
40
+ if (ch === '\n') {
41
+ state.line++;
42
+ state.column = 1;
43
+ }
44
+ else {
45
+ state.column++;
46
+ }
47
+ return ch;
48
+ }
49
+ function isAtEnd(state) {
50
+ return state.pos >= state.source.length;
51
+ }
52
+ function isDigit(ch) {
53
+ return ch >= '0' && ch <= '9';
54
+ }
55
+ function isLetter(ch) {
56
+ return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
57
+ }
58
+ function isIdentifierStart(ch) {
59
+ return isLetter(ch) || ch === '_';
60
+ }
61
+ function isIdentifierChar(ch) {
62
+ return isIdentifierStart(ch) || isDigit(ch);
63
+ }
64
+ function isWhitespace(ch) {
65
+ return ch === ' ' || ch === '\t' || ch === '\r';
66
+ }
67
+ function makeToken(type, value, start, end) {
68
+ return { type, value, span: { start, end } };
69
+ }
70
+ /** Advance n times and return a token */
71
+ function advanceAndMakeToken(state, n, type, value, start) {
72
+ for (let i = 0; i < n; i++)
73
+ advance(state);
74
+ return makeToken(type, value, start, currentLocation(state));
75
+ }
76
+ /** Two-character operator lookup table */
77
+ const TWO_CHAR_OPERATORS = {
78
+ '->': TOKEN_TYPES.ARROW,
79
+ ':<': TOKEN_TYPES.COLON_LT,
80
+ '/<': TOKEN_TYPES.SLASH_LT,
81
+ '&&': TOKEN_TYPES.AND,
82
+ '||': TOKEN_TYPES.OR,
83
+ '==': TOKEN_TYPES.EQ,
84
+ '!=': TOKEN_TYPES.NE,
85
+ '<=': TOKEN_TYPES.LE,
86
+ '>=': TOKEN_TYPES.GE,
87
+ '@(': TOKEN_TYPES.AT_PAREN,
88
+ };
89
+ /** Single-character operator lookup table */
90
+ const SINGLE_CHAR_OPERATORS = {
91
+ '.': TOKEN_TYPES.DOT,
92
+ '?': TOKEN_TYPES.QUESTION,
93
+ '@': TOKEN_TYPES.AT,
94
+ ':': TOKEN_TYPES.COLON,
95
+ ',': TOKEN_TYPES.COMMA,
96
+ '!': TOKEN_TYPES.BANG,
97
+ '=': TOKEN_TYPES.ASSIGN,
98
+ '<': TOKEN_TYPES.LT,
99
+ '>': TOKEN_TYPES.GT,
100
+ '(': TOKEN_TYPES.LPAREN,
101
+ ')': TOKEN_TYPES.RPAREN,
102
+ '{': TOKEN_TYPES.LBRACE,
103
+ '}': TOKEN_TYPES.RBRACE,
104
+ '[': TOKEN_TYPES.LBRACKET,
105
+ ']': TOKEN_TYPES.RBRACKET,
106
+ '|': TOKEN_TYPES.PIPE_BAR,
107
+ '+': TOKEN_TYPES.PLUS,
108
+ '-': TOKEN_TYPES.MINUS,
109
+ '*': TOKEN_TYPES.STAR,
110
+ '/': TOKEN_TYPES.SLASH,
111
+ '%': TOKEN_TYPES.PERCENT,
112
+ '~': TOKEN_TYPES.TILDE,
113
+ };
114
+ // ============================================================
115
+ // TOKENIZATION
116
+ // ============================================================
117
+ function skipWhitespace(state) {
118
+ while (!isAtEnd(state) && isWhitespace(peek(state))) {
119
+ advance(state);
120
+ }
121
+ }
122
+ function skipComment(state) {
123
+ if (peek(state) === '#') {
124
+ while (!isAtEnd(state) && peek(state) !== '\n') {
125
+ advance(state);
126
+ }
127
+ }
128
+ }
129
+ function readString(state) {
130
+ const start = currentLocation(state);
131
+ advance(state); // consume opening "
132
+ let value = '';
133
+ while (!isAtEnd(state) && peek(state) !== '"') {
134
+ if (peek(state) === '\\') {
135
+ advance(state);
136
+ const escaped = advance(state);
137
+ switch (escaped) {
138
+ case 'n':
139
+ value += '\n';
140
+ break;
141
+ case 'r':
142
+ value += '\r';
143
+ break;
144
+ case 't':
145
+ value += '\t';
146
+ break;
147
+ case '\\':
148
+ value += '\\';
149
+ break;
150
+ case '{':
151
+ value += '{';
152
+ break;
153
+ case '"':
154
+ value += '"';
155
+ break;
156
+ default:
157
+ throw new LexerError(`Invalid escape sequence: \\${escaped}`, currentLocation(state));
158
+ }
159
+ }
160
+ else if (peek(state) === '{') {
161
+ // Interpolation: include {expr} literally, runtime handles substitution
162
+ value += advance(state); // consume {
163
+ let braceDepth = 1;
164
+ while (!isAtEnd(state) && braceDepth > 0) {
165
+ const ch = advance(state);
166
+ value += ch;
167
+ if (ch === '{')
168
+ braceDepth++;
169
+ if (ch === '}')
170
+ braceDepth--;
171
+ }
172
+ }
173
+ else if (peek(state) === '\n') {
174
+ throw new LexerError('Unterminated string literal', start);
175
+ }
176
+ else {
177
+ value += advance(state);
178
+ }
179
+ }
180
+ if (peek(state) === '"') {
181
+ advance(state); // consume closing "
182
+ }
183
+ return makeToken(TOKEN_TYPES.STRING, value, start, currentLocation(state));
184
+ }
185
+ function readHeredoc(state) {
186
+ const start = currentLocation(state);
187
+ advance(state); // consume first <
188
+ advance(state); // consume second <
189
+ // Read delimiter
190
+ let delimiter = '';
191
+ while (!isAtEnd(state) && isIdentifierChar(peek(state))) {
192
+ delimiter += advance(state);
193
+ }
194
+ if (!delimiter) {
195
+ throw new LexerError('Expected heredoc delimiter', currentLocation(state));
196
+ }
197
+ // Skip to newline
198
+ while (!isAtEnd(state) && peek(state) !== '\n') {
199
+ if (!isWhitespace(peek(state))) {
200
+ throw new LexerError('Unexpected characters after heredoc delimiter', currentLocation(state));
201
+ }
202
+ advance(state);
203
+ }
204
+ if (peek(state) === '\n')
205
+ advance(state);
206
+ // Read body until delimiter appears alone on a line
207
+ let body = '';
208
+ while (!isAtEnd(state)) {
209
+ // Check if current line starts with delimiter
210
+ if (peekString(state, delimiter.length) === delimiter) {
211
+ const afterDelim = peek(state, delimiter.length);
212
+ if (afterDelim === '\n' || afterDelim === '' || afterDelim === '\r') {
213
+ // Found end delimiter - advance past it
214
+ Array.from({ length: delimiter.length }).forEach(() => advance(state));
215
+ break;
216
+ }
217
+ }
218
+ body += advance(state);
219
+ }
220
+ return makeToken(TOKEN_TYPES.STRING, body, start, currentLocation(state));
221
+ }
222
+ function readNumber(state) {
223
+ const start = currentLocation(state);
224
+ let value = '';
225
+ while (!isAtEnd(state) && isDigit(peek(state))) {
226
+ value += advance(state);
227
+ }
228
+ if (peek(state) === '.' && isDigit(peek(state, 1))) {
229
+ value += advance(state); // consume .
230
+ while (!isAtEnd(state) && isDigit(peek(state))) {
231
+ value += advance(state);
232
+ }
233
+ }
234
+ return makeToken(TOKEN_TYPES.NUMBER, value, start, currentLocation(state));
235
+ }
236
+ function readIdentifier(state) {
237
+ const start = currentLocation(state);
238
+ let value = '';
239
+ while (!isAtEnd(state) && isIdentifierChar(peek(state))) {
240
+ value += advance(state);
241
+ }
242
+ // Check for keywords
243
+ let type = TOKEN_TYPES.IDENTIFIER;
244
+ switch (value) {
245
+ case 'true':
246
+ type = TOKEN_TYPES.TRUE;
247
+ break;
248
+ case 'false':
249
+ type = TOKEN_TYPES.FALSE;
250
+ break;
251
+ case 'break':
252
+ type = TOKEN_TYPES.BREAK;
253
+ break;
254
+ case 'return':
255
+ type = TOKEN_TYPES.RETURN;
256
+ break;
257
+ }
258
+ // Check for max: (loop option)
259
+ if (value === 'max' && peek(state) === ':') {
260
+ advance(state);
261
+ return makeToken(TOKEN_TYPES.MAX, 'max:', start, currentLocation(state));
262
+ }
263
+ return makeToken(type, value, start, currentLocation(state));
264
+ }
265
+ function readVariable(state) {
266
+ const start = currentLocation(state);
267
+ advance(state); // consume $
268
+ // Check if followed by identifier (named variable like $foo)
269
+ if (isIdentifierStart(peek(state))) {
270
+ return makeToken(TOKEN_TYPES.DOLLAR, '$', start, currentLocation(state));
271
+ }
272
+ // Lone $ is the pipe variable (current item in iteration)
273
+ return makeToken(TOKEN_TYPES.PIPE_VAR, '$', start, currentLocation(state));
274
+ }
275
+ export function nextToken(state) {
276
+ skipWhitespace(state);
277
+ skipComment(state);
278
+ skipWhitespace(state);
279
+ if (isAtEnd(state)) {
280
+ const loc = currentLocation(state);
281
+ return makeToken(TOKEN_TYPES.EOF, '', loc, loc);
282
+ }
283
+ const start = currentLocation(state);
284
+ const ch = peek(state);
285
+ // Newline
286
+ if (ch === '\n') {
287
+ advance(state);
288
+ return makeToken(TOKEN_TYPES.NEWLINE, '\n', start, currentLocation(state));
289
+ }
290
+ // String
291
+ if (ch === '"') {
292
+ return readString(state);
293
+ }
294
+ // Heredoc
295
+ if (ch === '<' && peek(state, 1) === '<') {
296
+ return readHeredoc(state);
297
+ }
298
+ // Number (positive only - unary minus handled by parser)
299
+ if (isDigit(ch)) {
300
+ return readNumber(state);
301
+ }
302
+ // Identifier or keyword
303
+ if (isIdentifierStart(ch)) {
304
+ return readIdentifier(state);
305
+ }
306
+ // Variable
307
+ if (ch === '$') {
308
+ return readVariable(state);
309
+ }
310
+ // Three-character operators
311
+ const threeChar = peekString(state, 3);
312
+ if (threeChar === '@<>') {
313
+ return advanceAndMakeToken(state, 3, TOKEN_TYPES.AT_LT_GT, '@<>', start);
314
+ }
315
+ if (threeChar === '---') {
316
+ return advanceAndMakeToken(state, 3, TOKEN_TYPES.FRONTMATTER_DELIM, '---', start);
317
+ }
318
+ // Two-character operators (lookup table)
319
+ const twoChar = peekString(state, 2);
320
+ const twoCharType = TWO_CHAR_OPERATORS[twoChar];
321
+ if (twoCharType) {
322
+ return advanceAndMakeToken(state, 2, twoCharType, twoChar, start);
323
+ }
324
+ // Single-character operators (lookup table)
325
+ const singleCharType = SINGLE_CHAR_OPERATORS[ch];
326
+ if (singleCharType) {
327
+ return advanceAndMakeToken(state, 1, singleCharType, ch, start);
328
+ }
329
+ throw new LexerError(`Unexpected character: ${ch}`, start);
330
+ }
331
+ // ============================================================
332
+ // TOKENIZE ALL
333
+ // ============================================================
334
+ export function tokenize(source) {
335
+ const state = createLexerState(source);
336
+ const tokens = [];
337
+ let token;
338
+ do {
339
+ token = nextToken(state);
340
+ tokens.push(token);
341
+ } while (token.type !== TOKEN_TYPES.EOF);
342
+ return tokens;
343
+ }
344
+ //# sourceMappingURL=lexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.js","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAazC,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO;QACL,MAAM;QACN,GAAG,EAAE,CAAC;QACN,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;KACV,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,eAAe;AACf,+DAA+D;AAE/D,MAAM,OAAO,UAAW,SAAQ,KAAK;IAGjB;IAFlB,YACE,OAAe,EACC,QAAwB;QAExC,KAAK,CAAC,GAAG,OAAO,YAAY,QAAQ,CAAC,IAAI,YAAY,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAFxD,aAAQ,GAAR,QAAQ,CAAgB;QAGxC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,+DAA+D;AAC/D,mBAAmB;AACnB,+DAA+D;AAE/D,SAAS,eAAe,CAAC,KAAiB;IACxC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,IAAI,CAAC,KAAiB,EAAE,MAAM,GAAG,CAAC;IACzC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,UAAU,CAAC,KAAiB,EAAE,MAAc;IACnD,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,OAAO,CAAC,KAAiB;IAChC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACzC,KAAK,CAAC,GAAG,EAAE,CAAC;IACZ,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,MAAM,EAAE,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,KAAiB;IAChC,OAAO,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;AAC1C,CAAC;AAED,SAAS,OAAO,CAAC,EAAU;IACzB,OAAO,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC;AAChC,CAAC;AAED,SAAS,QAAQ,CAAC,EAAU;IAC1B,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAU;IACnC,OAAO,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC;AACpC,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAU;IAClC,OAAO,iBAAiB,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC9B,OAAO,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,SAAS,CAChB,IAAe,EACf,KAAa,EACb,KAAqB,EACrB,GAAmB;IAEnB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;AAC/C,CAAC;AAED,yCAAyC;AACzC,SAAS,mBAAmB,CAC1B,KAAiB,EACjB,CAAS,EACT,IAAe,EACf,KAAa,EACb,KAAqB;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,0CAA0C;AAC1C,MAAM,kBAAkB,GAA8B;IACpD,IAAI,EAAE,WAAW,CAAC,KAAK;IACvB,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,IAAI,EAAE,WAAW,CAAC,GAAG;IACrB,IAAI,EAAE,WAAW,CAAC,EAAE;IACpB,IAAI,EAAE,WAAW,CAAC,EAAE;IACpB,IAAI,EAAE,WAAW,CAAC,EAAE;IACpB,IAAI,EAAE,WAAW,CAAC,EAAE;IACpB,IAAI,EAAE,WAAW,CAAC,EAAE;IACpB,IAAI,EAAE,WAAW,CAAC,QAAQ;CAC3B,CAAC;AAEF,6CAA6C;AAC7C,MAAM,qBAAqB,GAA8B;IACvD,GAAG,EAAE,WAAW,CAAC,GAAG;IACpB,GAAG,EAAE,WAAW,CAAC,QAAQ;IACzB,GAAG,EAAE,WAAW,CAAC,EAAE;IACnB,GAAG,EAAE,WAAW,CAAC,KAAK;IACtB,GAAG,EAAE,WAAW,CAAC,KAAK;IACtB,GAAG,EAAE,WAAW,CAAC,IAAI;IACrB,GAAG,EAAE,WAAW,CAAC,MAAM;IACvB,GAAG,EAAE,WAAW,CAAC,EAAE;IACnB,GAAG,EAAE,WAAW,CAAC,EAAE;IACnB,GAAG,EAAE,WAAW,CAAC,MAAM;IACvB,GAAG,EAAE,WAAW,CAAC,MAAM;IACvB,GAAG,EAAE,WAAW,CAAC,MAAM;IACvB,GAAG,EAAE,WAAW,CAAC,MAAM;IACvB,GAAG,EAAE,WAAW,CAAC,QAAQ;IACzB,GAAG,EAAE,WAAW,CAAC,QAAQ;IACzB,GAAG,EAAE,WAAW,CAAC,QAAQ;IACzB,GAAG,EAAE,WAAW,CAAC,IAAI;IACrB,GAAG,EAAE,WAAW,CAAC,KAAK;IACtB,GAAG,EAAE,WAAW,CAAC,IAAI;IACrB,GAAG,EAAE,WAAW,CAAC,KAAK;IACtB,GAAG,EAAE,WAAW,CAAC,OAAO;IACxB,GAAG,EAAE,WAAW,CAAC,KAAK;CACvB,CAAC;AAEF,+DAA+D;AAC/D,eAAe;AACf,+DAA+D;AAE/D,SAAS,cAAc,CAAC,KAAiB;IACvC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAiB;IACpC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QACxB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAiB;IACnC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB;IAEpC,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/B,QAAQ,OAAO,EAAE,CAAC;gBAChB,KAAK,GAAG;oBACN,KAAK,IAAI,IAAI,CAAC;oBACd,MAAM;gBACR,KAAK,GAAG;oBACN,KAAK,IAAI,IAAI,CAAC;oBACd,MAAM;gBACR,KAAK,GAAG;oBACN,KAAK,IAAI,IAAI,CAAC;oBACd,MAAM;gBACR,KAAK,IAAI;oBACP,KAAK,IAAI,IAAI,CAAC;oBACd,MAAM;gBACR,KAAK,GAAG;oBACN,KAAK,IAAI,GAAG,CAAC;oBACb,MAAM;gBACR,KAAK,GAAG;oBACN,KAAK,IAAI,GAAG,CAAC;oBACb,MAAM;gBACR;oBACE,MAAM,IAAI,UAAU,CAClB,8BAA8B,OAAO,EAAE,EACvC,eAAe,CAAC,KAAK,CAAC,CACvB,CAAC;YACN,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;YAC/B,wEAAwE;YACxE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY;YACrC,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACzC,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC1B,KAAK,IAAI,EAAE,CAAC;gBACZ,IAAI,EAAE,KAAK,GAAG;oBAAE,UAAU,EAAE,CAAC;gBAC7B,IAAI,EAAE,KAAK,GAAG;oBAAE,UAAU,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YAChC,MAAM,IAAI,UAAU,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB;IACtC,CAAC;IAED,OAAO,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,WAAW,CAAC,KAAiB;IACpC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB;IAClC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB;IAEnC,iBAAiB;IACjB,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACxD,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAAC,4BAA4B,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,kBAAkB;IAClB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,UAAU,CAClB,+CAA+C,EAC/C,eAAe,CAAC,KAAK,CAAC,CACvB,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAEzC,oDAAoD;IACpD,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,8CAA8C;QAC9C,IAAI,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;YACtD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,EAAE,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBACpE,wCAAwC;gBACxC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBACvE,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,UAAU,CAAC,KAAiB;IACnC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,KAAK,GAAG,EAAE,CAAC;IAEf,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAC/C,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY;QACrC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC/C,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,cAAc,CAAC,KAAiB;IACvC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,KAAK,GAAG,EAAE,CAAC;IAEf,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACxD,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,qBAAqB;IACrB,IAAI,IAAI,GAAc,WAAW,CAAC,UAAU,CAAC;IAC7C,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;YACxB,MAAM;QACR,KAAK,OAAO;YACV,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC;YACzB,MAAM;QACR,KAAK,OAAO;YACV,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC;YACzB,MAAM;QACR,KAAK,QAAQ;YACX,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC;YAC1B,MAAM;IACV,CAAC;IAED,+BAA+B;IAC/B,IAAI,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,OAAO,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,YAAY,CAAC,KAAiB;IACrC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY;IAE5B,6DAA6D;IAC7D,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,0DAA0D;IAC1D,OAAO,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAiB;IACzC,cAAc,CAAC,KAAK,CAAC,CAAC;IACtB,WAAW,CAAC,KAAK,CAAC,CAAC;IACnB,cAAc,CAAC,KAAK,CAAC,CAAC;IAEtB,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAEvB,UAAU;IACV,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,OAAO,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,SAAS;IACT,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;QACf,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU;IACV,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACzC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,yDAAyD;IACzD,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAChB,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,wBAAwB;IACxB,IAAI,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1B,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,WAAW;IACX,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;QACf,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,4BAA4B;IAC5B,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACvC,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,mBAAmB,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACxB,OAAO,mBAAmB,CACxB,KAAK,EACL,CAAC,EACD,WAAW,CAAC,iBAAiB,EAC7B,KAAK,EACL,KAAK,CACN,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,mBAAmB,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACpE,CAAC;IAED,4CAA4C;IAC5C,MAAM,cAAc,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;IACjD,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,mBAAmB,CAAC,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,IAAI,UAAU,CAAC,yBAAyB,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED,+DAA+D;AAC/D,eAAe;AACf,+DAA+D;AAE/D,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,KAAY,CAAC;IAEjB,GAAG,CAAC;QACF,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,QAAQ,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,GAAG,EAAE;IAEzC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Arithmetic Expression Parsing
3
+ * Handles | expr | arithmetic expressions
4
+ */
5
+ import type { ArithmeticNode } from '../types.js';
6
+ import { type ParserState } from './state.js';
7
+ /**
8
+ * Parse arithmetic expression: | expr |
9
+ * Grammar:
10
+ * arith-expr = "|" additive "|"
11
+ * additive = multiplicative { ("+" | "-") multiplicative }
12
+ * multiplicative = factor { ("*" | "/" | "%") factor }
13
+ * factor = number | variable | "(" additive ")" | "-" factor
14
+ */
15
+ export declare function parseArithmetic(state: ParserState): ArithmeticNode;
16
+ //# sourceMappingURL=arithmetic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arithmetic.d.ts","sourceRoot":"","sources":["../../src/parser/arithmetic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA8B,MAAM,aAAa,CAAC;AAE9E,OAAO,EAAE,KAAK,WAAW,EAA6C,MAAM,YAAY,CAAC;AAOzF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,CAYlE"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Arithmetic Expression Parsing
3
+ * Handles | expr | arithmetic expressions
4
+ */
5
+ import { ParseError, TOKEN_TYPES } from '../types.js';
6
+ import { check, advance, expect, current, makeSpan } from './state.js';
7
+ import { parseVariable } from './variables.js';
8
+ // ============================================================
9
+ // ARITHMETIC EXPRESSIONS
10
+ // ============================================================
11
+ /**
12
+ * Parse arithmetic expression: | expr |
13
+ * Grammar:
14
+ * arith-expr = "|" additive "|"
15
+ * additive = multiplicative { ("+" | "-") multiplicative }
16
+ * multiplicative = factor { ("*" | "/" | "%") factor }
17
+ * factor = number | variable | "(" additive ")" | "-" factor
18
+ */
19
+ export function parseArithmetic(state) {
20
+ const start = current(state).span.start;
21
+ expect(state, TOKEN_TYPES.PIPE_BAR, 'Expected |');
22
+ const expr = parseArithAdditive(state);
23
+ expect(state, TOKEN_TYPES.PIPE_BAR, 'Expected closing |');
24
+ return {
25
+ ...expr,
26
+ span: makeSpan(start, current(state).span.end),
27
+ };
28
+ }
29
+ function parseArithAdditive(state) {
30
+ const start = current(state).span.start;
31
+ let left = parseArithMultiplicative(state);
32
+ while (check(state, TOKEN_TYPES.PLUS, TOKEN_TYPES.MINUS)) {
33
+ const opToken = advance(state);
34
+ const op = opToken.type === TOKEN_TYPES.PLUS ? '+' : '-';
35
+ const right = parseArithMultiplicative(state);
36
+ left = {
37
+ type: 'Arithmetic',
38
+ op,
39
+ left,
40
+ right,
41
+ span: makeSpan(start, current(state).span.end),
42
+ };
43
+ }
44
+ return left;
45
+ }
46
+ function parseArithMultiplicative(state) {
47
+ const start = current(state).span.start;
48
+ let left = parseArithFactor(state);
49
+ while (check(state, TOKEN_TYPES.STAR, TOKEN_TYPES.SLASH, TOKEN_TYPES.PERCENT)) {
50
+ const opToken = advance(state);
51
+ let op;
52
+ switch (opToken.type) {
53
+ case TOKEN_TYPES.STAR:
54
+ op = '*';
55
+ break;
56
+ case TOKEN_TYPES.SLASH:
57
+ op = '/';
58
+ break;
59
+ default:
60
+ op = '%';
61
+ }
62
+ const right = parseArithFactor(state);
63
+ left = {
64
+ type: 'Arithmetic',
65
+ op,
66
+ left,
67
+ right,
68
+ span: makeSpan(start, current(state).span.end),
69
+ };
70
+ }
71
+ return left;
72
+ }
73
+ function parseArithFactor(state) {
74
+ const start = current(state).span.start;
75
+ // Unary minus
76
+ if (check(state, TOKEN_TYPES.MINUS)) {
77
+ advance(state);
78
+ const operand = parseArithFactor(state);
79
+ // Represent -x as (0 - x)
80
+ const zero = {
81
+ type: 'NumberLiteral',
82
+ value: 0,
83
+ span: makeSpan(start, start),
84
+ };
85
+ return {
86
+ type: 'Arithmetic',
87
+ op: '-',
88
+ left: zero,
89
+ right: operand,
90
+ span: makeSpan(start, current(state).span.end),
91
+ };
92
+ }
93
+ // Grouped expression
94
+ if (check(state, TOKEN_TYPES.LPAREN)) {
95
+ advance(state);
96
+ const expr = parseArithAdditive(state);
97
+ expect(state, TOKEN_TYPES.RPAREN, 'Expected )');
98
+ return expr;
99
+ }
100
+ // Number literal
101
+ if (check(state, TOKEN_TYPES.NUMBER)) {
102
+ const token = advance(state);
103
+ return {
104
+ type: 'Arithmetic',
105
+ op: null,
106
+ left: {
107
+ type: 'NumberLiteral',
108
+ value: parseFloat(token.value),
109
+ span: token.span,
110
+ },
111
+ right: null,
112
+ span: token.span,
113
+ };
114
+ }
115
+ // Variable ($ or $name)
116
+ if (check(state, TOKEN_TYPES.DOLLAR, TOKEN_TYPES.PIPE_VAR)) {
117
+ const variable = parseVariable(state);
118
+ return {
119
+ type: 'Arithmetic',
120
+ op: null,
121
+ left: variable,
122
+ right: null,
123
+ span: variable.span,
124
+ };
125
+ }
126
+ throw new ParseError(`Expected number or variable in arithmetic, got: ${current(state).value}`, current(state).span.start);
127
+ }
128
+ //# sourceMappingURL=arithmetic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arithmetic.js","sourceRoot":"","sources":["../../src/parser/arithmetic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Boolean Expression Parsing - Circular Dependency Helpers
3
+ *
4
+ * This module only contains setter functions for breaking circular dependencies.
5
+ * Boolean/logical operators (&&, ||, !) are now part of the main expression grammar
6
+ * in expressions.ts.
7
+ */
8
+ import type { BlockNode, GroupedExprNode } from '../types.js';
9
+ import type { ParserState } from './state.js';
10
+ declare let parseGroupedFn: (state: ParserState) => GroupedExprNode;
11
+ export declare function setParseGrouped(fn: (state: ParserState) => GroupedExprNode): void;
12
+ declare let parseBlockFn: (state: ParserState) => BlockNode;
13
+ export declare function setParseBlock(fn: (state: ParserState) => BlockNode): void;
14
+ export { parseGroupedFn, parseBlockFn };
15
+ //# sourceMappingURL=boolean.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boolean.d.ts","sourceRoot":"","sources":["../../src/parser/boolean.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,QAAA,IAAI,cAAc,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,eAAe,CAAC;AAE5D,wBAAgB,eAAe,CAC7B,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,eAAe,GAC1C,IAAI,CAEN;AAGD,QAAA,IAAI,YAAY,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,SAAS,CAAC;AAEpD,wBAAgB,aAAa,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,SAAS,GAAG,IAAI,CAEzE;AAGD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Boolean Expression Parsing - Circular Dependency Helpers
3
+ *
4
+ * This module only contains setter functions for breaking circular dependencies.
5
+ * Boolean/logical operators (&&, ||, !) are now part of the main expression grammar
6
+ * in expressions.ts.
7
+ */
8
+ // Forward declaration for grouped expression parsing
9
+ let parseGroupedFn;
10
+ export function setParseGrouped(fn) {
11
+ parseGroupedFn = fn;
12
+ }
13
+ // Forward declaration - will be set to break circular dependency
14
+ let parseBlockFn;
15
+ export function setParseBlock(fn) {
16
+ parseBlockFn = fn;
17
+ }
18
+ // Re-export for any code that might still use these
19
+ export { parseGroupedFn, parseBlockFn };
20
+ //# sourceMappingURL=boolean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boolean.js","sourceRoot":"","sources":["../../src/parser/boolean.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,qDAAqD;AACrD,IAAI,cAAuD,CAAC;AAE5D,MAAM,UAAU,eAAe,CAC7B,EAA2C;IAE3C,cAAc,GAAG,EAAE,CAAC;AACtB,CAAC;AAED,iEAAiE;AACjE,IAAI,YAA+C,CAAC;AAEpD,MAAM,UAAU,aAAa,CAAC,EAAqC;IACjE,YAAY,GAAG,EAAE,CAAC;AACpB,CAAC;AAED,oDAAoD;AACpD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Control Flow Parsing
3
+ * Conditionals, loops, and blocks
4
+ *
5
+ * New loop syntax (v0.0.2):
6
+ * loop = [ simple-body ] , "@" , simple-body , [ "?" , simple-body ]
7
+ *
8
+ * Semantics (determined at runtime):
9
+ * - If input is bool and no trailing "?": while loop
10
+ * - If input is list and no trailing "?": for-each
11
+ * - If no input and no trailing "?": for-each over $
12
+ * - If trailing "? cond": do-while
13
+ */
14
+ import type { AnnotatedStatementNode, BlockNode, ConditionalNode, DoWhileLoopNode, ExpressionNode, ForLoopNode, BodyNode, StatementNode } from '../types.js';
15
+ import { type ParserState } from './state.js';
16
+ export declare function setParseStatement(fn: (state: ParserState) => StatementNode | AnnotatedStatementNode): void;
17
+ /**
18
+ * Parse piped conditional: ? then_body [! else_body]
19
+ * Called when bare `?` is seen (condition is implicit $).
20
+ */
21
+ export declare function parsePipedConditional(state: ParserState): ConditionalNode;
22
+ /**
23
+ * Parse conditional after condition is already parsed: ? then_body [! else_body]
24
+ * Called when we've parsed an expression and see `?` following it.
25
+ */
26
+ export declare function parseConditionalWithCondition(state: ParserState, conditionBody: BodyNode): ConditionalNode;
27
+ /**
28
+ * Parse the rest of a conditional after `?` is consumed.
29
+ * Grammar: then_body [! (conditional | else_body)]
30
+ */
31
+ export declare function parseConditionalRest(state: ParserState, condition: BodyNode | null, start: {
32
+ line: number;
33
+ column: number;
34
+ offset: number;
35
+ }): ConditionalNode;
36
+ /**
37
+ * Parse loop starting with @: @ body [? cond]
38
+ *
39
+ * New syntax:
40
+ * @ body - for-each over $
41
+ * @ body ? cond - do-while (body first, then check)
42
+ *
43
+ * Called when bare `@` is seen (no input expression).
44
+ */
45
+ export declare function parseLoop(state: ParserState, input: ExpressionNode | null): ForLoopNode | DoWhileLoopNode;
46
+ /**
47
+ * Parse loop with input: input @ body
48
+ *
49
+ * New syntax:
50
+ * input @ body - while (if input is bool) or for-each (if input is list)
51
+ *
52
+ * Called when we've parsed an expression and see `@` following it.
53
+ */
54
+ export declare function parseLoopWithInput(state: ParserState, input: BodyNode): ForLoopNode | DoWhileLoopNode;
55
+ export declare function parseBlock(state: ParserState): BlockNode;
56
+ //# sourceMappingURL=control-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-flow.d.ts","sourceRoot":"","sources":["../../src/parser/control-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,sBAAsB,EACtB,SAAS,EACT,eAAe,EACf,eAAe,EACf,cAAc,EACd,WAAW,EACX,QAAQ,EACR,aAAa,EACd,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,KAAK,WAAW,EAQjB,MAAM,YAAY,CAAC;AAQpB,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,aAAa,GAAG,sBAAsB,GACjE,IAAI,CAEN;AAMD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,eAAe,CAKzE;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,WAAW,EAClB,aAAa,EAAE,QAAQ,GACtB,eAAe,CAKjB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,QAAQ,GAAG,IAAI,EAC1B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtD,eAAe,CA6BjB;AAMD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,cAAc,GAAG,IAAI,GAC3B,WAAW,GAAG,eAAe,CA4B/B;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,QAAQ,GACd,WAAW,GAAG,eAAe,CAyB/B;AAMD,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,CAuBxD"}