hclang 0.1.0 → 0.5.4

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 (154) hide show
  1. package/README.md +25 -3
  2. package/lib/src/cli/hc.js +40 -0
  3. package/lib/src/cli/runfile.js +28 -0
  4. package/lib/src/execute/eval-pipe.js +15 -0
  5. package/lib/src/execute/evaluate.js +10 -0
  6. package/lib/src/execute/execute.js +18 -0
  7. package/lib/src/execute/frame-space.js +17 -0
  8. package/lib/src/execute/hc-eval.js +105 -0
  9. package/lib/src/execute/hc-log.js +39 -0
  10. package/lib/src/execute/hc-test.js +43 -0
  11. package/lib/src/execute/lex-bytes.js +42 -0
  12. package/lib/src/execute/lex-pipe.js +56 -0
  13. package/lib/src/execute/lex.js +110 -0
  14. package/lib/src/execute/lexer.js +24 -0
  15. package/lib/src/execute/parse-pipe.js +52 -0
  16. package/lib/src/execute/syntax.js +36 -0
  17. package/lib/src/execute/terminals.js +54 -0
  18. package/lib/src/execute.js +3 -0
  19. package/lib/src/frames/frame-alias.js +45 -0
  20. package/lib/src/frames/frame-arg.js +62 -0
  21. package/lib/src/frames/frame-array.js +47 -0
  22. package/lib/src/frames/frame-atom.js +41 -0
  23. package/lib/src/frames/frame-blob.js +104 -0
  24. package/lib/src/frames/frame-bytes.js +31 -0
  25. package/lib/src/frames/frame-comment.js +28 -0
  26. package/lib/src/frames/frame-doc.js +19 -0
  27. package/lib/src/frames/frame-expr.js +34 -0
  28. package/lib/src/frames/frame-group.js +31 -0
  29. package/lib/src/frames/frame-lazy.js +39 -0
  30. package/lib/src/frames/frame-list.js +58 -0
  31. package/lib/src/frames/frame-name.js +29 -0
  32. package/lib/src/frames/frame-note.js +104 -0
  33. package/lib/src/frames/frame-number.js +28 -0
  34. package/lib/src/frames/frame-schema.js +47 -0
  35. package/lib/src/frames/frame-string.js +41 -0
  36. package/lib/src/frames/frame-symbol.js +75 -0
  37. package/lib/src/frames/frame.js +75 -0
  38. package/lib/src/frames/meta-frame.js +99 -0
  39. package/lib/src/frames.js +24 -0
  40. package/lib/src/index.js +5 -0
  41. package/lib/src/maml/tag.js +17 -0
  42. package/lib/src/maml.js +26 -0
  43. package/lib/src/ops/conditionals.js +14 -0
  44. package/lib/src/ops/frame-curry.js +17 -0
  45. package/lib/src/ops/frame-ops.js +24 -0
  46. package/lib/src/ops/iterators.js +28 -0
  47. package/lib/src/ops.js +12 -0
  48. package/lib/src/version.js +3 -0
  49. package/lib/test/execute/eval-pipe-spec.js +45 -0
  50. package/lib/test/execute/evaluate-spec.js +76 -0
  51. package/lib/test/execute/execute-spec.js +115 -0
  52. package/lib/test/execute/hc-eval-spec.js +68 -0
  53. package/lib/test/execute/hc-test-spec.js +47 -0
  54. package/lib/test/execute/lex-pipe-spec.js +25 -0
  55. package/lib/test/execute/parse-spec.js +67 -0
  56. package/lib/test/execute/script-spec.js +29 -0
  57. package/lib/test/frames/frame-alias-spec.js +36 -0
  58. package/lib/test/frames/frame-arg-spec.js +57 -0
  59. package/lib/test/frames/frame-array-spec.js +54 -0
  60. package/lib/test/frames/frame-blob-spec.js +56 -0
  61. package/lib/test/frames/frame-bytes-spec.js +16 -0
  62. package/lib/test/frames/frame-comment-spec.js +17 -0
  63. package/lib/test/frames/frame-doc-spec.js +17 -0
  64. package/lib/test/frames/frame-expr-spec.js +60 -0
  65. package/lib/test/frames/frame-group-spec.js +27 -0
  66. package/lib/test/frames/frame-lazy-spec.js +49 -0
  67. package/lib/test/frames/frame-name-spec.js +26 -0
  68. package/lib/test/frames/frame-note-spec.js +48 -0
  69. package/lib/test/frames/frame-number-spec.js +17 -0
  70. package/lib/test/frames/frame-schema-spec.js +54 -0
  71. package/lib/test/frames/frame-spec.js +31 -0
  72. package/lib/test/frames/frame-string-spec.js +43 -0
  73. package/lib/test/frames/frame-symbol-spec.js +64 -0
  74. package/lib/test/frames/meta-frame-spec.js +75 -0
  75. package/lib/test/maml/maml-spec.js +42 -0
  76. package/lib/test/maml/tag-spec.js +53 -0
  77. package/lib/test/ops/iterators-spec.js +70 -0
  78. package/package.json +60 -34
  79. package/lib/bin.d.ts +0 -0
  80. package/lib/bin.js +0 -6
  81. package/lib/execute/actions.d.ts +0 -13
  82. package/lib/execute/actions.js +0 -48
  83. package/lib/execute/eval-pipe.d.ts +0 -5
  84. package/lib/execute/eval-pipe.js +0 -32
  85. package/lib/execute/evaluate.d.ts +0 -2
  86. package/lib/execute/evaluate.js +0 -20
  87. package/lib/execute/frame-space.d.ts +0 -7
  88. package/lib/execute/frame-space.js +0 -32
  89. package/lib/execute/group-pipe.d.ts +0 -6
  90. package/lib/execute/group-pipe.js +0 -27
  91. package/lib/execute/lex-pipe.d.ts +0 -12
  92. package/lib/execute/lex-pipe.js +0 -55
  93. package/lib/execute/lex.d.ts +0 -26
  94. package/lib/execute/lex.js +0 -94
  95. package/lib/execute/lexer.d.ts +0 -9
  96. package/lib/execute/lexer.js +0 -55
  97. package/lib/execute/parse-pipe.d.ts +0 -8
  98. package/lib/execute/parse-pipe.js +0 -49
  99. package/lib/execute/parser.d.ts +0 -8
  100. package/lib/execute/parser.js +0 -49
  101. package/lib/execute/syntax.d.ts +0 -2
  102. package/lib/execute/syntax.js +0 -23
  103. package/lib/execute/terminals.d.ts +0 -10
  104. package/lib/execute/terminals.js +0 -48
  105. package/lib/execute.d.ts +0 -1
  106. package/lib/execute.js +0 -9
  107. package/lib/frames/frame-arg.d.ts +0 -24
  108. package/lib/frames/frame-arg.js +0 -81
  109. package/lib/frames/frame-array.d.ts +0 -15
  110. package/lib/frames/frame-array.js +0 -50
  111. package/lib/frames/frame-atom.d.ts +0 -17
  112. package/lib/frames/frame-atom.js +0 -52
  113. package/lib/frames/frame-comment.d.ts +0 -12
  114. package/lib/frames/frame-comment.js +0 -36
  115. package/lib/frames/frame-doc.d.ts +0 -9
  116. package/lib/frames/frame-doc.js +0 -31
  117. package/lib/frames/frame-expr.d.ts +0 -9
  118. package/lib/frames/frame-expr.js +0 -48
  119. package/lib/frames/frame-group.d.ts +0 -7
  120. package/lib/frames/frame-group.js +0 -39
  121. package/lib/frames/frame-lazy.d.ts +0 -13
  122. package/lib/frames/frame-lazy.js +0 -54
  123. package/lib/frames/frame-list.d.ts +0 -15
  124. package/lib/frames/frame-list.js +0 -51
  125. package/lib/frames/frame-name.d.ts +0 -12
  126. package/lib/frames/frame-name.js +0 -37
  127. package/lib/frames/frame-number.d.ts +0 -9
  128. package/lib/frames/frame-number.js +0 -31
  129. package/lib/frames/frame-string.d.ts +0 -14
  130. package/lib/frames/frame-string.js +0 -47
  131. package/lib/frames/frame-symbol.d.ts +0 -18
  132. package/lib/frames/frame-symbol.js +0 -64
  133. package/lib/frames/frame.d.ts +0 -22
  134. package/lib/frames/frame.js +0 -73
  135. package/lib/frames/meta-frame.d.ts +0 -26
  136. package/lib/frames/meta-frame.js +0 -85
  137. package/lib/frames.d.ts +0 -15
  138. package/lib/frames.js +0 -36
  139. package/lib/hc.d.ts +0 -0
  140. package/lib/hc.js +0 -13
  141. package/lib/index.d.ts +0 -3
  142. package/lib/index.js +0 -9
  143. package/lib/maml/tag.d.ts +0 -2
  144. package/lib/maml/tag.js +0 -19
  145. package/lib/maml.d.ts +0 -2
  146. package/lib/maml.js +0 -30
  147. package/lib/ops/frame-curry.d.ts +0 -9
  148. package/lib/ops/frame-curry.js +0 -31
  149. package/lib/ops/frame-ops.d.ts +0 -12
  150. package/lib/ops/frame-ops.js +0 -41
  151. package/lib/ops/iterators.d.ts +0 -2
  152. package/lib/ops/iterators.js +0 -12
  153. package/lib/ops.d.ts +0 -3
  154. package/lib/ops.js +0 -8
package/README.md CHANGED
@@ -1,12 +1,30 @@
1
1
  # Homiconic C
2
+ version: 0.5.4
2
3
 
3
- [ ![Codeship Status for HC](https://app.codeship.com/projects/aaeb71c0-b7d8-0134-5ab7-22c228ba91d5/status?branch=master)](https://app.codeship.com/projects/194564)
4
+ [![Codeship Status for TheSwanFactory/hclang](https://app.codeship.com/projects/b1198f30-aee9-0137-5fdc-4a1003a17a1c/status?branch=master)](https://app.codeship.com/projects/362584)
4
5
 
5
6
  ## Introduction
6
7
 
7
- [Homoiconic C](https://theswanfactory.com/2016/12/20/homoiconic-c-a-universal-language-for-code-and-data/) (HC) is a single universal language for code and data. This repository contains the first implementation of HC as an interpreter written in TypeScript running on `nodejs`. It also contains a sample application called MAML, the [*Multipurpose Abstract Markup Language*](https://theswanfactory.com/2016/11/08/introducing-maml-a-draft-proposal-for-html6/). MAML is a radically simple proposal for replacing all the existing web technologies (HMTL, CSS, JavaScript, SVG, etc.) with a single format based on HC.
8
+ [Homoiconic C](https://theswanfactory.wordpress.com/2016/12/20/homoiconic-c-a-universal-language-for-code-and-data/) (HC) is a single universal language for code and data. This repository contains the first implementation of HC as an interpreter written in TypeScript running on `nodejs`. It also contains a sample application called MAML, the [*Multipurpose Abstract Markup Language*](https://theswanfactory.wordpress.com/2016/11/08/introducing-maml-a-draft-proposal-for-html6/). MAML is a radically simple proposal for replacing all the existing web technologies (HMTL, CSS, JavaScript, SVG, etc.) with a single format based on HC. It can also be used to define easily-parseable variants of other common file formats (e.g., HCSV, HCSON).
8
9
 
9
- ## Getting Started
10
+ ## Usage
11
+
12
+ ```
13
+ $ npm install
14
+ $ export DEBUG=true # optional
15
+ $ npm run hc
16
+ ```
17
+ This will launch the interpreter.
18
+
19
+ ## BitScheme
20
+
21
+ To generate and run the BitScheme documentation, type:
22
+ ```
23
+ $ npm run bs:all
24
+ ```
25
+ This will open the BitScheme.html file, and also run the documentation through the testdoc evaluator which will generate pass/fail messages.
26
+
27
+ ## Development
10
28
 
11
29
  1. Install the [Atom editor](http://flight-manual.atom.io/getting-started/sections/installing-atom/).
12
30
 
@@ -18,3 +36,7 @@
18
36
  * e.g., `brew install node` on macOS.
19
37
 
20
38
  5. Run `npm test`.
39
+
40
+ ## Debugging
41
+ 0. $ npm run inspect
42
+ 5. # In Chrome: chrome://inspect
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ import { HCEval } from '../execute/hc-eval.js';
3
+ import { HCLog } from '../execute/hc-log.js';
4
+ import { HCTest } from '../execute/hc-test.js';
5
+ import minimist from 'minimist';
6
+ import { runfile } from './runfile.js';
7
+ const aliases = {
8
+ e: 'evaluate',
9
+ h: 'help',
10
+ i: 'interactive',
11
+ t: 'testdoc',
12
+ v: 'verbose',
13
+ V: 'version'
14
+ };
15
+ const options = minimist(process.argv.slice(2), { alias: aliases });
16
+ if (options.verbose) {
17
+ console.error('options', options);
18
+ }
19
+ const context = HCEval.make_context(process.env);
20
+ const out = new HCLog(context);
21
+ let hc_eval = new HCEval(out);
22
+ let evaluated = false;
23
+ let test;
24
+ if (options.testdoc) {
25
+ test = new HCTest(out);
26
+ hc_eval = new HCEval(test);
27
+ evaluated = true;
28
+ }
29
+ if (options.evaluate) {
30
+ hc_eval.call(options.evaluate.toString());
31
+ evaluated = true;
32
+ }
33
+ options._.forEach((file) => {
34
+ evaluated = runfile(hc_eval, file);
35
+ });
36
+ if (options.interactive || !evaluated) {
37
+ out.prompt = true;
38
+ hc_eval.repl();
39
+ }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2hjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFHQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDOUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQzVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUM5QyxPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUE7QUFDL0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUV0QyxNQUFNLE9BQU8sR0FBRztJQUNkLENBQUMsRUFBRSxVQUFVO0lBQ2IsQ0FBQyxFQUFFLE1BQU07SUFDVCxDQUFDLEVBQUUsYUFBYTtJQUNoQixDQUFDLEVBQUUsU0FBUztJQUNaLENBQUMsRUFBRSxTQUFTO0lBQ1osQ0FBQyxFQUFFLFNBQVM7Q0FDYixDQUFBO0FBQ0QsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7QUFDbkUsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO0lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0NBQ2xDO0FBRUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDaEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDOUIsSUFBSSxPQUFPLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDN0IsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFBO0FBQ3JCLElBQUksSUFBWSxDQUFBO0FBRWhCLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtJQUNuQixJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDdEIsT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzFCLFNBQVMsR0FBRyxJQUFJLENBQUE7Q0FDakI7QUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7SUFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDekMsU0FBUyxHQUFHLElBQUksQ0FBQTtDQUNqQjtBQUVELE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7SUFDOUIsU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDcEMsQ0FBQyxDQUFDLENBQUE7QUFFRixJQUFJLE9BQU8sQ0FBQyxXQUFXLElBQUksQ0FBQyxTQUFTLEVBQUU7SUFDckMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUE7SUFDakIsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFBO0NBQ2YifQ==
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'fs';
3
+ import readline from 'readline';
4
+ const RUNDOC = '#!/usr/bin/env hc \n```\n';
5
+ const ENDDOC = '```\n';
6
+ function is_doc(file) {
7
+ const file_ext = file.split('.').pop();
8
+ return file_ext === 'adoc' || file_ext === 'md';
9
+ }
10
+ function runfile(hc_eval, file) {
11
+ const file_ext = file.split('.').pop();
12
+ const is_doc_file = is_doc(file);
13
+ if (is_doc_file) {
14
+ hc_eval.call(RUNDOC);
15
+ }
16
+ const rl = readline.createInterface(fs.createReadStream(file), undefined);
17
+ rl.on('line', (line) => {
18
+ hc_eval.call(line);
19
+ });
20
+ rl.on('close', () => {
21
+ if (is_doc_file) {
22
+ hc_eval.call(ENDDOC);
23
+ }
24
+ });
25
+ return true;
26
+ }
27
+ export { runfile };
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGkvcnVuZmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ25CLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQTtBQUcvQixNQUFNLE1BQU0sR0FBRywyQkFBMkIsQ0FBQTtBQUMxQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUE7QUFFdEIsU0FBUyxNQUFNLENBQUUsSUFBWTtJQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQ3RDLE9BQU8sUUFBUSxLQUFLLE1BQU0sSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFBO0FBQ2pELENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBRSxPQUFlLEVBQUUsSUFBUztJQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNoQyxJQUFJLFdBQVcsRUFBRTtRQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7S0FDckI7SUFDRCxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUN6RSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDcEIsQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDbEIsSUFBSSxXQUFXLEVBQUU7WUFDZixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1NBQ3JCO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDRixPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRCxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUEifQ==
@@ -0,0 +1,15 @@
1
+ import { Frame, NilContext } from '../frames.js';
2
+ export class EvalPipe extends Frame {
3
+ constructor(out, meta = NilContext) {
4
+ super(meta);
5
+ this.set(Frame.kOUT, out);
6
+ this.up = out;
7
+ }
8
+ apply(expr, context) {
9
+ const out = this.get(Frame.kOUT);
10
+ const result = expr.in([out, context]);
11
+ out.apply(result, context);
12
+ return result;
13
+ }
14
+ }
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbC1waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4ZWN1dGUvZXZhbC1waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBVyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRXpELE1BQU0sT0FBTyxRQUFTLFNBQVEsS0FBSztJQUNqQyxZQUFhLEdBQVUsRUFBRSxPQUFnQixVQUFVO1FBQ2pELEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNYLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUN6QixJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQTtJQUNmLENBQUM7SUFFTSxLQUFLLENBQUUsSUFBVyxFQUFFLE9BQWM7UUFDdkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQ3RDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzFCLE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztDQUNGIn0=
@@ -0,0 +1,10 @@
1
+ import { FrameArray } from '../frames.js';
2
+ import { HCEval } from './hc-eval.js';
3
+ export const evaluate = (input, ...args) => {
4
+ const out = new FrameArray([]);
5
+ const hc_eval = new HCEval(out);
6
+ hc_eval.call(input);
7
+ return out;
8
+ };
9
+ // https://stackoverflow.com/questions/63524054/typescript-optional-arguments-spreading-crashing-in-v4
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXhlY3V0ZS9ldmFsdWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFFckMsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBYSxFQUFFLEdBQUcsSUFBUyxFQUFTLEVBQUU7SUFDN0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNuQixPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUMsQ0FBQTtBQUNELHNHQUFzRyJ9
@@ -0,0 +1,18 @@
1
+ import { evaluate } from './evaluate.js';
2
+ const stripLastCommas = (array) => {
3
+ const result = array.map((item) => {
4
+ const n = item.length - 1;
5
+ if (item[n] === ',') {
6
+ return item.substring(0, n);
7
+ }
8
+ return item;
9
+ });
10
+ return result;
11
+ };
12
+ export const execute = (input) => {
13
+ const result = evaluate(input);
14
+ const array = result.toStringArray();
15
+ const stripped = stripLastCommas(array);
16
+ return stripped.join('\n');
17
+ };
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leGVjdXRlL2V4ZWN1dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUd4QyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQW9CLEVBQUUsRUFBRTtJQUMvQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDaEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7UUFDekIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQ25CLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7U0FDNUI7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUMsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtJQUN2QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFlLENBQUE7SUFDNUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQ3BDLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN2QyxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDNUIsQ0FBQyxDQUFBIn0=
@@ -0,0 +1,17 @@
1
+ import * as frame from '../frames.js';
2
+ export class FrameSpace extends frame.FrameAtom {
3
+ constructor(meta = frame.NilContext) {
4
+ super(meta);
5
+ this.is.void = true;
6
+ }
7
+ string_start() {
8
+ return FrameSpace.SPACE_CHAR;
9
+ }
10
+ ;
11
+ canInclude(char) {
12
+ return char === FrameSpace.SPACE_CHAR;
13
+ }
14
+ }
15
+ FrameSpace.SPACE_CHAR = ' ';
16
+ ;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWUtc3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXhlY3V0ZS9mcmFtZS1zcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLGNBQWMsQ0FBQTtBQUVyQyxNQUFNLE9BQU8sVUFBVyxTQUFRLEtBQUssQ0FBQyxTQUFTO0lBRzdDLFlBQWEsSUFBSSxHQUFHLEtBQUssQ0FBQyxVQUFVO1FBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNYLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQTtJQUNyQixDQUFDO0lBRU0sWUFBWTtRQUNqQixPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUE7SUFDOUIsQ0FBQztJQUFBLENBQUM7SUFFSyxVQUFVLENBQUUsSUFBWTtRQUM3QixPQUFPLElBQUksS0FBSyxVQUFVLENBQUMsVUFBVSxDQUFBO0lBQ3ZDLENBQUM7O0FBYnNCLHFCQUFVLEdBQUcsR0FBRyxDQUFBO0FBY3hDLENBQUMifQ==
@@ -0,0 +1,105 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import chalk from 'chalk';
11
+ import { FrameGroup, FrameString } from '../frames.js';
12
+ import { version } from '../version.js';
13
+ import { EvalPipe } from './eval-pipe.js';
14
+ import { Lex } from './lex.js';
15
+ import { LexPipe } from './lex-pipe.js';
16
+ import { ParsePipe } from './parse-pipe.js';
17
+ import { stdin as input, stdout as output } from 'node:process';
18
+ import readline from 'node:readline/promises';
19
+ export class HCEval {
20
+ static make_context(env) {
21
+ const context = {};
22
+ Object.entries(env).forEach(([key, value]) => {
23
+ if (key[0] !== 'n') {
24
+ context[key] = new FrameString(value || 'undefined');
25
+ }
26
+ });
27
+ if (context.DEBUG_ENV) {
28
+ console.debug('DEBUG_ENV', context);
29
+ }
30
+ return context;
31
+ }
32
+ static make_pipe(out) {
33
+ const evaluator = new EvalPipe(out); // evaluate groups into results
34
+ const parser = new ParsePipe(evaluator, FrameGroup); // parse tokens into groups of expressions
35
+ const lexer = new LexPipe(parser); // lex characters into tokens
36
+ return lexer;
37
+ }
38
+ static make_prompt(level) {
39
+ const indent = 2 * (level - 1);
40
+ const middle = ' '.repeat(indent);
41
+ return HCEval.EXPECT + middle + HCEval.EXPECT;
42
+ }
43
+ constructor(out) {
44
+ this.out = out;
45
+ this.pipe = HCEval.make_pipe(this.out);
46
+ this.lex = this.pipe;
47
+ }
48
+ call(input) {
49
+ if (!input) {
50
+ return null;
51
+ }
52
+ // console.error("HCEval.input", input);
53
+ const source = new FrameString(input);
54
+ this.checkInput(input);
55
+ const result = source.reduce(this.lex);
56
+ // console.error("HCEval.result", result);
57
+ this.lex = (result instanceof Lex) ? result : this.pipe;
58
+ return result;
59
+ }
60
+ repl() {
61
+ return __awaiter(this, void 0, void 0, function* () {
62
+ console.log(chalk.green('.hc ' + version + ';'));
63
+ let status = true;
64
+ while (status) {
65
+ const input = yield this.getInput();
66
+ if (!input) {
67
+ status = false;
68
+ break;
69
+ }
70
+ this.call(input);
71
+ }
72
+ return status;
73
+ });
74
+ }
75
+ getInput() {
76
+ return __awaiter(this, void 0, void 0, function* () {
77
+ let prefix = HCEval.SOURCE;
78
+ if (this.pipe.level > 0) {
79
+ prefix = HCEval.make_prompt(this.pipe.level);
80
+ }
81
+ const rlp = readline.createInterface({ input, output });
82
+ const answer = yield rlp.question(chalk.grey(prefix));
83
+ rlp.close();
84
+ return answer;
85
+ });
86
+ }
87
+ checkInput(input) {
88
+ const head = input.substr(0, 2);
89
+ const tail = input.substr(2);
90
+ const value = new FrameString(tail);
91
+ switch (head) {
92
+ case HCEval.SOURCE: {
93
+ this.out.set(HCEval.SOURCE, value);
94
+ break;
95
+ }
96
+ case HCEval.EXPECT: {
97
+ this.out.set(HCEval.EXPECT, value);
98
+ break;
99
+ }
100
+ }
101
+ }
102
+ }
103
+ HCEval.SOURCE = '; ';
104
+ HCEval.EXPECT = '# ';
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGMtZXZhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leGVjdXRlL2hjLWV2YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBQ3pCLE9BQU8sRUFBa0IsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQzlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzNDLE9BQU8sRUFBRSxLQUFLLElBQUksS0FBSyxFQUFFLE1BQU0sSUFBSSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDL0QsT0FBTyxRQUFRLE1BQU0sd0JBQXdCLENBQUE7QUFLN0MsTUFBTSxPQUFPLE1BQU07SUFJVixNQUFNLENBQUMsWUFBWSxDQUFFLEdBQWdCO1FBQzFDLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQTtRQUMzQixNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO2dCQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUMsS0FBSyxJQUFJLFdBQVcsQ0FBQyxDQUFBO2FBQ3JEO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFX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
@@ -0,0 +1,39 @@
1
+ import chalk from 'chalk';
2
+ import { Frame } from '../frames.js';
3
+ import { HCEval } from './hc-eval.js';
4
+ export class HCLog extends Frame {
5
+ constructor(context, prompt = false) {
6
+ super(context);
7
+ this.prompt = prompt;
8
+ }
9
+ apply(argument, _parameter = Frame.nil) {
10
+ const debug = this.get('DEBUG');
11
+ if (debug !== Frame.missing) {
12
+ console.log(argument.id, argument);
13
+ }
14
+ if (argument !== Frame.nil && !argument.is.void && !argument.is.statement) {
15
+ const output = argument.toString();
16
+ if (this.prompt) {
17
+ console.log(chalk.grey(HCEval.EXPECT + output));
18
+ }
19
+ else {
20
+ const colorized = this.color(output);
21
+ console.log(colorized);
22
+ }
23
+ }
24
+ return argument;
25
+ }
26
+ color(output) {
27
+ if (output[0] !== '$') {
28
+ return output;
29
+ }
30
+ const flag = output[1];
31
+ const part = output.split(' .n ');
32
+ switch (flag) {
33
+ case '+': return chalk.green(part[0]) + chalk.grey.italic(part[1]);
34
+ case '-': return chalk.red(part[0]) + chalk.grey.italic(part[1]);
35
+ default: return chalk.yellow(output);
36
+ }
37
+ }
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGMtbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4ZWN1dGUvaGMtbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEVBQVcsS0FBSyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFJckMsTUFBTSxPQUFPLEtBQU0sU0FBUSxLQUFLO0lBQzlCLFlBQWEsT0FBZ0IsRUFBUyxTQUFrQixLQUFLO1FBQzNELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQURzQixXQUFNLEdBQU4sTUFBTSxDQUFpQjtJQUU3RCxDQUFDO0lBRU0sS0FBSyxDQUFFLFFBQWUsRUFBRSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUc7UUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMvQixJQUFJLEtBQUssS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQTtTQUNuQztRQUNELElBQUksUUFBUSxLQUFLLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFO1lBQ3pFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtZQUNsQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQTthQUNoRDtpQkFBTTtnQkFDTCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO2FBQ3ZCO1NBQ0Y7UUFDRCxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBRU8sS0FBSyxDQUFFLE1BQWM7UUFDM0IsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQ3JCLE9BQU8sTUFBTSxDQUFBO1NBQ2Q7UUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNqQyxRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2xFLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2hFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUNyQztJQUNILENBQUM7Q0FDRiJ9
@@ -0,0 +1,43 @@
1
+ import { Frame, FrameNote, FrameString, NilContext } from '../frames.js';
2
+ import { HCEval } from './hc-eval.js';
3
+ export class HCTest extends Frame {
4
+ constructor(out) {
5
+ super(NilContext);
6
+ this.out = out;
7
+ this.actual = Frame.missing;
8
+ this.n = { total: 0, pass: 0, fail: 0 };
9
+ }
10
+ apply(argument, parameter = Frame.nil) {
11
+ const source = this.get(HCEval.SOURCE);
12
+ const expected = this.get(HCEval.EXPECT);
13
+ if (!this.actual.is.missing || !expected.is.missing) {
14
+ const result = this.performTest(expected, this.actual, source);
15
+ return this.out.call(result, parameter);
16
+ }
17
+ if (!source.is.missing) {
18
+ const actual = argument.toString();
19
+ this.actual = new FrameString(actual);
20
+ }
21
+ return argument;
22
+ }
23
+ performTest(expected, actual, source) {
24
+ const result = this.assertEqual(expected.toString(), actual.toString(), source.toString());
25
+ this.set(HCEval.SOURCE, Frame.missing);
26
+ this.set(HCEval.EXPECT, Frame.missing);
27
+ this.actual = Frame.missing;
28
+ return result;
29
+ }
30
+ assertEqual(expected, actual, source) {
31
+ const base = source + ' +' + expected;
32
+ this.n.total += 1;
33
+ if (expected === actual) {
34
+ this.n.pass += 1;
35
+ return FrameNote.pass(base, JSON.stringify(this.n));
36
+ }
37
+ else {
38
+ this.n.fail += 1;
39
+ return FrameNote.fail(base + ' -' + actual, JSON.stringify(this.n));
40
+ }
41
+ }
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGMtdGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leGVjdXRlL2hjLXRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN4RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBSXJDLE1BQU0sT0FBTyxNQUFPLFNBQVEsS0FBSztJQUkvQixZQUF1QixHQUFVO1FBQy9CLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQURJLFFBQUcsR0FBSCxHQUFHLENBQU87UUFFL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFBO1FBQzNCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFBO0lBQ3pDLENBQUM7SUFFTSxLQUFLLENBQUUsUUFBZSxFQUFFLFNBQVMsR0FBRyxLQUFLLENBQUMsR0FBRztRQUNsRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUV4QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUU7WUFDbkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQTtZQUM5RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQTtTQUN4QztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRTtZQUN0QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUE7WUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUN0QztRQUNELE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFFTSxXQUFXLENBQUUsUUFBZSxFQUFFLE1BQWEsRUFBRSxNQUFhO1FBQy9ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUMxRixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFBO1FBQzNCLE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVNLFdBQVcsQ0FBRSxRQUFnQixFQUFFLE1BQWMsRUFBRSxNQUFjO1FBQ2xFLE1BQU0sSUFBSSxHQUFHLE1BQU0sR0FBRyxJQUFJLEdBQUcsUUFBUSxDQUFBO1FBRXJDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQTtRQUNqQixJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUU7WUFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFBO1lBQ2hCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUNwRDthQUFNO1lBQ0wsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFBO1lBQ2hCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ3BFO0lBQ0gsQ0FBQztDQUNGIn0=
@@ -0,0 +1,42 @@
1
+ import { Frame, FrameBytes, FrameSymbol } from '../frames.js';
2
+ import { Token } from './lex.js';
3
+ export class LexBytes extends Frame {
4
+ constructor(count, up) {
5
+ super();
6
+ this.count = count;
7
+ this.source = '';
8
+ this.body = [];
9
+ this.is.void = true;
10
+ this.up = up;
11
+ }
12
+ call(argument, _parameter = Frame.nil) {
13
+ if (argument === FrameSymbol.end()) {
14
+ return this.finish(argument, false);
15
+ }
16
+ const char = argument.toString();
17
+ const code = char.charCodeAt(0);
18
+ this.body.push(code);
19
+ if (this.body.length === this.count) {
20
+ this.finish(argument, false);
21
+ }
22
+ return this;
23
+ }
24
+ finish(_argument, _passAlong) {
25
+ this.exportFrame();
26
+ return this.up;
27
+ }
28
+ exportFrame() {
29
+ const output = this.makeFrame();
30
+ const out = this.get(Frame.kOUT);
31
+ return out.call(output);
32
+ }
33
+ makeFrame() {
34
+ if (this.body.length === 0) {
35
+ return FrameSymbol.end();
36
+ }
37
+ const frame = new FrameBytes(this.body);
38
+ this.body = [];
39
+ return new Token(frame);
40
+ }
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV4LWJ5dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4ZWN1dGUvbGV4LWJ5dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBWSxNQUFNLGNBQWMsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRWhDLE1BQU0sT0FBTyxRQUFTLFNBQVEsS0FBSztJQUlqQyxZQUE4QixLQUFhLEVBQUUsRUFBUztRQUNwRCxLQUFLLEVBQUUsQ0FBQTtRQURxQixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBSHBDLFdBQU0sR0FBVyxFQUFFLENBQUE7UUFLeEIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUE7UUFDZCxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDbkIsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7SUFDZCxDQUFDO0lBRU0sSUFBSSxDQUFFLFFBQWUsRUFBRSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUc7UUFDbEQsSUFBSSxRQUFRLEtBQUssV0FBVyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUE7U0FDcEM7UUFDRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUE7UUFDaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNwQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUE7U0FDN0I7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFUyxNQUFNLENBQUUsU0FBZ0IsRUFBRSxVQUFtQjtRQUNyRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDbEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFBO0lBQ2hCLENBQUM7SUFFUyxXQUFXO1FBQ25CLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUMvQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNoQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUVTLFNBQVM7UUFDakIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUIsT0FBTyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUE7U0FDekI7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUE7UUFDZCxPQUFPLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3pCLENBQUM7Q0FDRiJ9
@@ -0,0 +1,56 @@
1
+ import { Frame, FrameString, FrameSymbol } from '../frames.js';
2
+ import { getSyntax } from './syntax.js';
3
+ export class LexPipe extends Frame {
4
+ constructor(out) {
5
+ const syntax = getSyntax();
6
+ syntax[Frame.kOUT] = out;
7
+ super(syntax);
8
+ this.level = 0;
9
+ }
10
+ lex_string(input) {
11
+ const source = new FrameString(input);
12
+ return this.lex(source);
13
+ }
14
+ lex(source) {
15
+ return source.reduce(this);
16
+ }
17
+ finish(_parameter) {
18
+ const output = FrameSymbol.end();
19
+ const out = this.get(Frame.kOUT);
20
+ out.call(output);
21
+ return this;
22
+ }
23
+ perform(action) {
24
+ const parser = this.get(Frame.kOUT);
25
+ for (const [key, value] of Object.entries(action)) {
26
+ switch (key) {
27
+ case 'semi-next': {
28
+ parser.next(true);
29
+ break;
30
+ }
31
+ case 'next': {
32
+ parser.next(false);
33
+ break;
34
+ }
35
+ case 'end': {
36
+ parser.finish(value);
37
+ break;
38
+ }
39
+ case 'push': {
40
+ const next_parser = parser.push(value);
41
+ this.set(Frame.kOUT, next_parser);
42
+ this.level += 1;
43
+ break;
44
+ }
45
+ case 'pop': {
46
+ const next_parser = parser.pop(value);
47
+ this.set(Frame.kOUT, next_parser);
48
+ this.level -= 1;
49
+ break;
50
+ }
51
+ }
52
+ }
53
+ return this;
54
+ }
55
+ }
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV4LXBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXhlY3V0ZS9sZXgtcGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFFOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUd2QyxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQUs7SUFHaEMsWUFBYSxHQUFVO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFBO1FBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFBO1FBQ3hCLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNiLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBO0lBQ2hCLENBQUM7SUFFTSxVQUFVLENBQUUsS0FBYTtRQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUVNLEdBQUcsQ0FBRSxNQUFtQjtRQUM3QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDNUIsQ0FBQztJQUVNLE1BQU0sQ0FBRSxVQUFpQjtRQUM5QixNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDaEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDaEMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNoQixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFTSxPQUFPLENBQUUsTUFBZTtRQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQWMsQ0FBQTtRQUNoRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNqRCxRQUFRLEdBQUcsRUFBRTtnQkFDWCxLQUFLLFdBQVcsQ0FBQyxDQUFDO29CQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUNqQixNQUFLO2lCQUNOO2dCQUNELEtBQUssTUFBTSxDQUFDLENBQUM7b0JBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDbEIsTUFBSztpQkFDTjtnQkFDRCxLQUFLLEtBQUssQ0FBQyxDQUFDO29CQUNWLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQ3BCLE1BQUs7aUJBQ047Z0JBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQztvQkFDWCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO29CQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUE7b0JBQ2pDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFBO29CQUNmLE1BQUs7aUJBQ047Z0JBQ0QsS0FBSyxLQUFLLENBQUMsQ0FBQztvQkFDVixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO29CQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUE7b0JBQ2pDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFBO29CQUNmLE1BQUs7aUJBQ047YUFDRjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0NBQ0YifQ==
@@ -0,0 +1,110 @@
1
+ import { Frame, FrameAtom, FrameBytes, FrameComment, FrameQuote, NilContext } from '../frames.js';
2
+ import { LexBytes } from './lex-bytes.js';
3
+ import { LexPipe } from './lex-pipe.js';
4
+ import { terminals } from './terminals.js';
5
+ export class Token extends FrameAtom {
6
+ constructor(data) {
7
+ super(NilContext);
8
+ this.data = data;
9
+ }
10
+ called_by(callee, parameter) {
11
+ return callee.apply(this.data, parameter);
12
+ }
13
+ toData() {
14
+ return this.data;
15
+ }
16
+ inspect() {
17
+ return `Token[${this.data.inspect()}]`;
18
+ }
19
+ }
20
+ export class Lex extends Frame {
21
+ static isTerminal(char) {
22
+ const terms = Object.keys(terminals);
23
+ return terms.includes(char);
24
+ }
25
+ constructor(Factory) {
26
+ super();
27
+ this.Factory = Factory;
28
+ this.pipe = new LexPipe(this);
29
+ this.body = '';
30
+ this.sample = new Factory('');
31
+ this.source = '';
32
+ this.is.void = true;
33
+ const name = this.sample.className();
34
+ this.id = this.id + '.' + name;
35
+ }
36
+ // TODO: use terminal to determine next parsing class
37
+ // Right now, FrameSpace/FrameNumber consume the initial '#' of a comment
38
+ // That should only happen at the end of a Quote
39
+ call(argument, _parameter = Frame.nil) {
40
+ const char = argument.toString();
41
+ const end = this.isEnd(char);
42
+ const terminal = Lex.isTerminal(char);
43
+ const not_quote = !this.isQuote();
44
+ if (end && terminal) { // ends token on a terminal
45
+ return this.finish(argument, true);
46
+ }
47
+ if (end) { // ends token, but not on a terminal
48
+ const use_arg_for_next_token = not_quote && !this.isComment();
49
+ const result = this.finish(argument, use_arg_for_next_token);
50
+ return result;
51
+ }
52
+ if (terminal && not_quote) { // unquoted terminal implicitly ends token
53
+ return this.finish(argument, true);
54
+ }
55
+ // otherwise, add to body since still in interior
56
+ // including quoted terminals
57
+ if (this.body === '') {
58
+ this.body = this.source;
59
+ }
60
+ this.body = this.body + argument.toString();
61
+ return this;
62
+ }
63
+ toString() {
64
+ return this.id + `[${this.body}]`;
65
+ }
66
+ isEnd(char) {
67
+ return !this.sample.canInclude(char);
68
+ }
69
+ isComment() {
70
+ return (this.sample instanceof FrameComment);
71
+ }
72
+ isQuote() {
73
+ return (this.sample instanceof FrameQuote);
74
+ }
75
+ finish(argument, passAlong) {
76
+ const recurse = this.checkRecursive(argument);
77
+ if (recurse !== null) {
78
+ return recurse;
79
+ }
80
+ this.exportFrame();
81
+ if (passAlong) {
82
+ const result = this.up.call(argument);
83
+ return result;
84
+ }
85
+ return this.up;
86
+ }
87
+ checkRecursive(_argument) {
88
+ if (!(this.sample instanceof FrameBytes)) {
89
+ return null;
90
+ }
91
+ const n = parseInt(this.body, 10);
92
+ const lex = new LexBytes(n, this.up);
93
+ return lex;
94
+ }
95
+ exportFrame() {
96
+ const output = this.makeFrame();
97
+ const out = this.get(Frame.kOUT);
98
+ const result = out.call(output);
99
+ return result;
100
+ }
101
+ makeFrame() {
102
+ if (this.body === '') {
103
+ this.body = this.source;
104
+ }
105
+ const frame = new this.Factory(this.body);
106
+ this.body = '';
107
+ return new Token(frame);
108
+ }
109
+ }
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4ZWN1dGUvbGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUF5QixVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDeEgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBSTFDLE1BQU0sT0FBTyxLQUFNLFNBQVEsU0FBUztJQUNsQyxZQUF1QixJQUFXO1FBQ2hDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQURJLFNBQUksR0FBSixJQUFJLENBQU87SUFFbEMsQ0FBQztJQUVNLFNBQVMsQ0FBRSxNQUFhLEVBQUUsU0FBZ0I7UUFDL0MsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDM0MsQ0FBQztJQUVTLE1BQU07UUFDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUE7SUFDbEIsQ0FBQztJQUVNLE9BQU87UUFDWixPQUFPLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFBO0lBQ3hDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxHQUFJLFNBQVEsS0FBSztJQUNyQixNQUFNLENBQUMsVUFBVSxDQUFFLElBQVk7UUFDcEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNwQyxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDN0IsQ0FBQztJQU9ELFlBQThCLE9BQVk7UUFDeEMsS0FBSyxFQUFFLENBQUE7UUFEcUIs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
@@ -0,0 +1,24 @@
1
+ import { Frame, FrameString } from '../frames.js';
2
+ import { getSyntax } from './syntax.js';
3
+ export class Lexer extends Frame {
4
+ constructor(out) {
5
+ const syntax = getSyntax();
6
+ syntax[Lexer.kOUT] = out;
7
+ super(syntax);
8
+ }
9
+ lex_string(input) {
10
+ const source = new FrameString(input);
11
+ return this.lex(source);
12
+ }
13
+ lex(source) {
14
+ return source.reduce(this);
15
+ }
16
+ fold(argument) {
17
+ const out = this.get(Frame.kOUT);
18
+ this.set(Frame.kOUT, out.call(argument));
19
+ }
20
+ finish(_options) {
21
+ return Frame.nil;
22
+ }
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV4ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXhlY3V0ZS9sZXhlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBSXZDLE1BQU0sT0FBTyxLQUFNLFNBQVEsS0FBSztJQUM5QixZQUFhLEdBQVU7UUFDckIsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUE7UUFDMUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUE7UUFDeEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ2YsQ0FBQztJQUVNLFVBQVUsQ0FBRSxLQUFhO1FBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN6QixDQUFDO0lBRU0sR0FBRyxDQUFFLE1BQW1CO1FBQzdCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM1QixDQUFDO0lBRU0sSUFBSSxDQUFFLFFBQWU7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUMxQyxDQUFDO0lBRU0sTUFBTSxDQUFFLFFBQW9CO1FBQ2pDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQTtJQUNsQixDQUFDO0NBQ0YifQ==