@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
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Operator Lookup Tables
3
+ */
4
+ import { TOKEN_TYPES } from '../types.js';
5
+ /** Two-character operator lookup table */
6
+ export const TWO_CHAR_OPERATORS = {
7
+ '->': TOKEN_TYPES.ARROW,
8
+ ':>': TOKEN_TYPES.CAPTURE_ARROW,
9
+ '*<': TOKEN_TYPES.STAR_LT,
10
+ '/<': TOKEN_TYPES.SLASH_LT,
11
+ '&&': TOKEN_TYPES.AND,
12
+ '||': TOKEN_TYPES.OR,
13
+ '==': TOKEN_TYPES.EQ,
14
+ '!=': TOKEN_TYPES.NE,
15
+ '<=': TOKEN_TYPES.LE,
16
+ '>=': TOKEN_TYPES.GE,
17
+ '??': TOKEN_TYPES.NULLISH_COALESCE,
18
+ '.?': TOKEN_TYPES.DOT_QUESTION,
19
+ '::': TOKEN_TYPES.DOUBLE_COLON,
20
+ };
21
+ /** Single-character operator lookup table */
22
+ export const SINGLE_CHAR_OPERATORS = {
23
+ '.': TOKEN_TYPES.DOT,
24
+ '?': TOKEN_TYPES.QUESTION,
25
+ '@': TOKEN_TYPES.AT,
26
+ ':': TOKEN_TYPES.COLON,
27
+ ',': TOKEN_TYPES.COMMA,
28
+ '!': TOKEN_TYPES.BANG,
29
+ '=': TOKEN_TYPES.ASSIGN,
30
+ '<': TOKEN_TYPES.LT,
31
+ '>': TOKEN_TYPES.GT,
32
+ '(': TOKEN_TYPES.LPAREN,
33
+ ')': TOKEN_TYPES.RPAREN,
34
+ '{': TOKEN_TYPES.LBRACE,
35
+ '}': TOKEN_TYPES.RBRACE,
36
+ '[': TOKEN_TYPES.LBRACKET,
37
+ ']': TOKEN_TYPES.RBRACKET,
38
+ '|': TOKEN_TYPES.PIPE_BAR,
39
+ '+': TOKEN_TYPES.PLUS,
40
+ '-': TOKEN_TYPES.MINUS,
41
+ '*': TOKEN_TYPES.STAR,
42
+ '/': TOKEN_TYPES.SLASH,
43
+ '%': TOKEN_TYPES.PERCENT,
44
+ '&': TOKEN_TYPES.AMPERSAND,
45
+ '^': TOKEN_TYPES.CARET,
46
+ };
47
+ /** Keyword lookup table */
48
+ export const KEYWORDS = {
49
+ true: TOKEN_TYPES.TRUE,
50
+ false: TOKEN_TYPES.FALSE,
51
+ break: TOKEN_TYPES.BREAK,
52
+ return: TOKEN_TYPES.RETURN,
53
+ each: TOKEN_TYPES.EACH,
54
+ map: TOKEN_TYPES.MAP,
55
+ fold: TOKEN_TYPES.FOLD,
56
+ filter: TOKEN_TYPES.FILTER,
57
+ };
58
+ //# sourceMappingURL=operators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operators.js","sourceRoot":"","sources":["../../src/lexer/operators.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,0CAA0C;AAC1C,MAAM,CAAC,MAAM,kBAAkB,GAA8B;IAC3D,IAAI,EAAE,WAAW,CAAC,KAAK;IACvB,IAAI,EAAE,WAAW,CAAC,aAAa;IAC/B,IAAI,EAAE,WAAW,CAAC,OAAO;IACzB,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,gBAAgB;IAClC,IAAI,EAAE,WAAW,CAAC,YAAY;IAC9B,IAAI,EAAE,WAAW,CAAC,YAAY;CAC/B,CAAC;AAEF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,qBAAqB,GAA8B;IAC9D,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,SAAS;IAC1B,GAAG,EAAE,WAAW,CAAC,KAAK;CACvB,CAAC;AAEF,2BAA2B;AAC3B,MAAM,CAAC,MAAM,QAAQ,GAA8B;IACjD,IAAI,EAAE,WAAW,CAAC,IAAI;IACtB,KAAK,EAAE,WAAW,CAAC,KAAK;IACxB,KAAK,EAAE,WAAW,CAAC,KAAK;IACxB,MAAM,EAAE,WAAW,CAAC,MAAM;IAC1B,IAAI,EAAE,WAAW,CAAC,IAAI;IACtB,GAAG,EAAE,WAAW,CAAC,GAAG;IACpB,IAAI,EAAE,WAAW,CAAC,IAAI;IACtB,MAAM,EAAE,WAAW,CAAC,MAAM;CAC3B,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Token Readers
3
+ * Functions to read specific token types from source
4
+ */
5
+ import type { Token } from '../types.js';
6
+ import { type LexerState } from './state.js';
7
+ export declare function readString(state: LexerState): Token;
8
+ export declare function readHeredoc(state: LexerState): Token;
9
+ export declare function readNumber(state: LexerState): Token;
10
+ export declare function readIdentifier(state: LexerState): Token;
11
+ export declare function readVariable(state: LexerState): Token;
12
+ //# sourceMappingURL=readers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readers.d.ts","sourceRoot":"","sources":["../../src/lexer/readers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAWzC,OAAO,EAIL,KAAK,UAAU,EAGhB,MAAM,YAAY,CAAC;AAwBpB,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAoCnD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CA2CpD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAgBnD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAUvD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAiBrD"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Token Readers
3
+ * Functions to read specific token types from source
4
+ */
5
+ import { TOKEN_TYPES } from '../types.js';
6
+ import { LexerError } from './errors.js';
7
+ import { isDigit, isIdentifierChar, isIdentifierStart, isWhitespace, makeToken, } from './helpers.js';
8
+ import { KEYWORDS } from './operators.js';
9
+ import { advance, currentLocation, isAtEnd, peek, peekString, } from './state.js';
10
+ /** Process escape sequence and return the unescaped character */
11
+ function processEscape(state) {
12
+ const escaped = advance(state);
13
+ switch (escaped) {
14
+ case 'n':
15
+ return '\n';
16
+ case 'r':
17
+ return '\r';
18
+ case 't':
19
+ return '\t';
20
+ case '\\':
21
+ return '\\';
22
+ case '"':
23
+ return '"';
24
+ default:
25
+ throw new LexerError(`Invalid escape sequence: \\${escaped}`, currentLocation(state));
26
+ }
27
+ }
28
+ export function readString(state) {
29
+ const start = currentLocation(state);
30
+ advance(state); // consume opening "
31
+ let value = '';
32
+ while (!isAtEnd(state) && peek(state) !== '"') {
33
+ if (peek(state) === '\\') {
34
+ advance(state); // consume backslash
35
+ value += processEscape(state);
36
+ }
37
+ else if (peek(state) === '{') {
38
+ // Interpolation: include {expr} literally, parser handles expression parsing
39
+ value += advance(state); // consume {
40
+ let braceDepth = 1;
41
+ while (!isAtEnd(state) && braceDepth > 0) {
42
+ if (peek(state) === '\\') {
43
+ advance(state); // consume backslash
44
+ value += processEscape(state);
45
+ }
46
+ else {
47
+ const ch = advance(state);
48
+ value += ch;
49
+ if (ch === '{')
50
+ braceDepth++;
51
+ if (ch === '}')
52
+ braceDepth--;
53
+ }
54
+ }
55
+ }
56
+ else if (peek(state) === '\n') {
57
+ throw new LexerError('Unterminated string literal', start);
58
+ }
59
+ else {
60
+ value += advance(state);
61
+ }
62
+ }
63
+ if (peek(state) === '"') {
64
+ advance(state); // consume closing "
65
+ }
66
+ return makeToken(TOKEN_TYPES.STRING, value, start, currentLocation(state));
67
+ }
68
+ export function readHeredoc(state) {
69
+ const start = currentLocation(state);
70
+ advance(state); // consume first <
71
+ advance(state); // consume second <
72
+ // Read delimiter
73
+ let delimiter = '';
74
+ while (!isAtEnd(state) && isIdentifierChar(peek(state))) {
75
+ delimiter += advance(state);
76
+ }
77
+ if (!delimiter) {
78
+ throw new LexerError('Expected heredoc delimiter', currentLocation(state));
79
+ }
80
+ // Skip to newline
81
+ while (!isAtEnd(state) && peek(state) !== '\n') {
82
+ if (!isWhitespace(peek(state))) {
83
+ throw new LexerError('Unexpected characters after heredoc delimiter', currentLocation(state));
84
+ }
85
+ advance(state);
86
+ }
87
+ if (peek(state) === '\n')
88
+ advance(state);
89
+ // Read body until delimiter appears alone on a line
90
+ let body = '';
91
+ while (!isAtEnd(state)) {
92
+ // Check if current line starts with delimiter
93
+ if (peekString(state, delimiter.length) === delimiter) {
94
+ const afterDelim = peek(state, delimiter.length);
95
+ if (afterDelim === '\n' || afterDelim === '' || afterDelim === '\r') {
96
+ // Found end delimiter - advance past it
97
+ for (let i = 0; i < delimiter.length; i++)
98
+ advance(state);
99
+ break;
100
+ }
101
+ }
102
+ body += advance(state);
103
+ }
104
+ return makeToken(TOKEN_TYPES.STRING, body, start, currentLocation(state));
105
+ }
106
+ export function readNumber(state) {
107
+ const start = currentLocation(state);
108
+ let value = '';
109
+ while (!isAtEnd(state) && isDigit(peek(state))) {
110
+ value += advance(state);
111
+ }
112
+ if (peek(state) === '.' && isDigit(peek(state, 1))) {
113
+ value += advance(state); // consume .
114
+ while (!isAtEnd(state) && isDigit(peek(state))) {
115
+ value += advance(state);
116
+ }
117
+ }
118
+ return makeToken(TOKEN_TYPES.NUMBER, value, start, currentLocation(state));
119
+ }
120
+ export function readIdentifier(state) {
121
+ const start = currentLocation(state);
122
+ let value = '';
123
+ while (!isAtEnd(state) && isIdentifierChar(peek(state))) {
124
+ value += advance(state);
125
+ }
126
+ const type = KEYWORDS[value] ?? TOKEN_TYPES.IDENTIFIER;
127
+ return makeToken(type, value, start, currentLocation(state));
128
+ }
129
+ export function readVariable(state) {
130
+ const start = currentLocation(state);
131
+ advance(state); // consume $
132
+ // Check for accumulator variable: $@
133
+ if (peek(state) === '@') {
134
+ advance(state); // consume @
135
+ return makeToken(TOKEN_TYPES.DOLLAR, '$@', start, currentLocation(state));
136
+ }
137
+ // Check if followed by identifier (named variable like $foo)
138
+ if (isIdentifierStart(peek(state))) {
139
+ return makeToken(TOKEN_TYPES.DOLLAR, '$', start, currentLocation(state));
140
+ }
141
+ // Lone $ is the pipe variable (current item in iteration)
142
+ return makeToken(TOKEN_TYPES.PIPE_VAR, '$', start, currentLocation(state));
143
+ }
144
+ //# sourceMappingURL=readers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readers.js","sourceRoot":"","sources":["../../src/lexer/readers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Lexer State
3
+ * Tracks position in source text during tokenization
4
+ */
5
+ import type { SourceLocation } from '../types.js';
6
+ export interface LexerState {
7
+ readonly source: string;
8
+ pos: number;
9
+ line: number;
10
+ column: number;
11
+ }
12
+ export declare function createLexerState(source: string): LexerState;
13
+ export declare function currentLocation(state: LexerState): SourceLocation;
14
+ export declare function peek(state: LexerState, offset?: number): string;
15
+ export declare function peekString(state: LexerState, length: number): string;
16
+ export declare function advance(state: LexerState): string;
17
+ export declare function isAtEnd(state: LexerState): boolean;
18
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/lexer/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAO3D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CAEjE;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,SAAI,GAAG,MAAM,CAE1D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAUjD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAElD"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Lexer State
3
+ * Tracks position in source text during tokenization
4
+ */
5
+ export function createLexerState(source) {
6
+ return {
7
+ source,
8
+ pos: 0,
9
+ line: 1,
10
+ column: 1,
11
+ };
12
+ }
13
+ export function currentLocation(state) {
14
+ return { line: state.line, column: state.column, offset: state.pos };
15
+ }
16
+ export function peek(state, offset = 0) {
17
+ return state.source[state.pos + offset] ?? '';
18
+ }
19
+ export function peekString(state, length) {
20
+ return state.source.slice(state.pos, state.pos + length);
21
+ }
22
+ export function advance(state) {
23
+ const ch = state.source[state.pos] ?? '';
24
+ state.pos++;
25
+ if (ch === '\n') {
26
+ state.line++;
27
+ state.column = 1;
28
+ }
29
+ else {
30
+ state.column++;
31
+ }
32
+ return ch;
33
+ }
34
+ export function isAtEnd(state) {
35
+ return state.pos >= state.source.length;
36
+ }
37
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/lexer/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,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,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,KAAiB,EAAE,MAAM,GAAG,CAAC;IAChD,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAiB,EAAE,MAAc;IAC1D,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAiB;IACvC,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,MAAM,UAAU,OAAO,CAAC,KAAiB;IACvC,OAAO,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tokenizer
3
+ * Main tokenization logic
4
+ */
5
+ import type { Token } from '../types.js';
6
+ import { type LexerState } from './state.js';
7
+ export declare function nextToken(state: LexerState): Token;
8
+ export declare function tokenize(source: string): Token[];
9
+ //# sourceMappingURL=tokenizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/lexer/tokenizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAkBzC,OAAO,EAKL,KAAK,UAAU,EAGhB,MAAM,YAAY,CAAC;AAgBpB,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAsFlD;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CAWhD"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Tokenizer
3
+ * Main tokenization logic
4
+ */
5
+ import { TOKEN_TYPES } from '../types.js';
6
+ import { LexerError } from './errors.js';
7
+ import { advanceAndMakeToken, isDigit, isIdentifierStart, isWhitespace, makeToken, } from './helpers.js';
8
+ import { SINGLE_CHAR_OPERATORS, TWO_CHAR_OPERATORS } from './operators.js';
9
+ import { readHeredoc, readIdentifier, readNumber, readString, readVariable, } from './readers.js';
10
+ import { advance, createLexerState, currentLocation, isAtEnd, peek, peekString, } from './state.js';
11
+ function skipWhitespace(state) {
12
+ while (!isAtEnd(state) && isWhitespace(peek(state))) {
13
+ advance(state);
14
+ }
15
+ }
16
+ function skipComment(state) {
17
+ if (peek(state) === '#') {
18
+ while (!isAtEnd(state) && peek(state) !== '\n') {
19
+ advance(state);
20
+ }
21
+ }
22
+ }
23
+ export function nextToken(state) {
24
+ skipWhitespace(state);
25
+ skipComment(state);
26
+ skipWhitespace(state);
27
+ if (isAtEnd(state)) {
28
+ const loc = currentLocation(state);
29
+ return makeToken(TOKEN_TYPES.EOF, '', loc, loc);
30
+ }
31
+ const start = currentLocation(state);
32
+ const ch = peek(state);
33
+ // Newline
34
+ if (ch === '\n') {
35
+ advance(state);
36
+ return makeToken(TOKEN_TYPES.NEWLINE, '\n', start, currentLocation(state));
37
+ }
38
+ // String
39
+ if (ch === '"') {
40
+ return readString(state);
41
+ }
42
+ // Heredoc
43
+ if (ch === '<' && peek(state, 1) === '<') {
44
+ return readHeredoc(state);
45
+ }
46
+ // Number (positive only - unary minus handled by parser)
47
+ if (isDigit(ch)) {
48
+ return readNumber(state);
49
+ }
50
+ // Identifier or keyword
51
+ if (isIdentifierStart(ch)) {
52
+ return readIdentifier(state);
53
+ }
54
+ // Variable
55
+ if (ch === '$') {
56
+ return readVariable(state);
57
+ }
58
+ // Three-character operators
59
+ const threeChar = peekString(state, 3);
60
+ if (threeChar === '---') {
61
+ return advanceAndMakeToken(state, 3, TOKEN_TYPES.FRONTMATTER_DELIM, '---', start);
62
+ }
63
+ // Two-character operators (lookup table)
64
+ const twoChar = peekString(state, 2);
65
+ const twoCharType = TWO_CHAR_OPERATORS[twoChar];
66
+ if (twoCharType) {
67
+ // Special case: :> is only CAPTURE_ARROW when followed by $ (possibly with whitespace)
68
+ // This avoids conflict with slice syntax /<start:> where :> should be COLON + GT
69
+ if (twoChar === ':>') {
70
+ let lookAhead = 2;
71
+ while (state.pos + lookAhead < state.source.length &&
72
+ isWhitespace(state.source[state.pos + lookAhead] ?? '')) {
73
+ lookAhead++;
74
+ }
75
+ const charAfter = state.source[state.pos + lookAhead] ?? '';
76
+ if (charAfter !== '$') {
77
+ // Not a capture arrow - treat as separate : and > tokens
78
+ return advanceAndMakeToken(state, 1, TOKEN_TYPES.COLON, ':', start);
79
+ }
80
+ }
81
+ return advanceAndMakeToken(state, 2, twoCharType, twoChar, start);
82
+ }
83
+ // Single-character operators (lookup table)
84
+ const singleCharType = SINGLE_CHAR_OPERATORS[ch];
85
+ if (singleCharType) {
86
+ return advanceAndMakeToken(state, 1, singleCharType, ch, start);
87
+ }
88
+ throw new LexerError(`Unexpected character: ${ch}`, start);
89
+ }
90
+ export function tokenize(source) {
91
+ const state = createLexerState(source);
92
+ const tokens = [];
93
+ let token;
94
+ do {
95
+ token = nextToken(state);
96
+ tokens.push(token);
97
+ } while (token.type !== TOKEN_TYPES.EOF);
98
+ return tokens;
99
+ }
100
+ //# sourceMappingURL=tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/lexer/tokenizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Rill Lexer
3
+ * Converts source text into tokens
4
+ */
5
+ import type { SourceLocation, Token } from './types.js';
6
+ export interface LexerState {
7
+ readonly source: string;
8
+ pos: number;
9
+ line: number;
10
+ column: number;
11
+ }
12
+ export declare function createLexerState(source: string): LexerState;
13
+ export declare class LexerError extends Error {
14
+ readonly location: SourceLocation;
15
+ constructor(message: string, location: SourceLocation);
16
+ }
17
+ export declare function nextToken(state: LexerState): Token;
18
+ export declare function tokenize(source: string): Token[];
19
+ //# sourceMappingURL=lexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAa,MAAM,YAAY,CAAC;AAOnE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAO3D;AAMD,qBAAa,UAAW,SAAQ,KAAK;aAGjB,QAAQ,EAAE,cAAc;gBADxC,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,cAAc;CAK3C;AA6SD,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAyElD;AAMD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CAWhD"}