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.
- package/README.md +25 -3
- package/lib/src/cli/hc.js +40 -0
- package/lib/src/cli/runfile.js +28 -0
- package/lib/src/execute/eval-pipe.js +15 -0
- package/lib/src/execute/evaluate.js +10 -0
- package/lib/src/execute/execute.js +18 -0
- package/lib/src/execute/frame-space.js +17 -0
- package/lib/src/execute/hc-eval.js +105 -0
- package/lib/src/execute/hc-log.js +39 -0
- package/lib/src/execute/hc-test.js +43 -0
- package/lib/src/execute/lex-bytes.js +42 -0
- package/lib/src/execute/lex-pipe.js +56 -0
- package/lib/src/execute/lex.js +110 -0
- package/lib/src/execute/lexer.js +24 -0
- package/lib/src/execute/parse-pipe.js +52 -0
- package/lib/src/execute/syntax.js +36 -0
- package/lib/src/execute/terminals.js +54 -0
- package/lib/src/execute.js +3 -0
- package/lib/src/frames/frame-alias.js +45 -0
- package/lib/src/frames/frame-arg.js +62 -0
- package/lib/src/frames/frame-array.js +47 -0
- package/lib/src/frames/frame-atom.js +41 -0
- package/lib/src/frames/frame-blob.js +104 -0
- package/lib/src/frames/frame-bytes.js +31 -0
- package/lib/src/frames/frame-comment.js +28 -0
- package/lib/src/frames/frame-doc.js +19 -0
- package/lib/src/frames/frame-expr.js +34 -0
- package/lib/src/frames/frame-group.js +31 -0
- package/lib/src/frames/frame-lazy.js +39 -0
- package/lib/src/frames/frame-list.js +58 -0
- package/lib/src/frames/frame-name.js +29 -0
- package/lib/src/frames/frame-note.js +104 -0
- package/lib/src/frames/frame-number.js +28 -0
- package/lib/src/frames/frame-schema.js +47 -0
- package/lib/src/frames/frame-string.js +41 -0
- package/lib/src/frames/frame-symbol.js +75 -0
- package/lib/src/frames/frame.js +75 -0
- package/lib/src/frames/meta-frame.js +99 -0
- package/lib/src/frames.js +24 -0
- package/lib/src/index.js +5 -0
- package/lib/src/maml/tag.js +17 -0
- package/lib/src/maml.js +26 -0
- package/lib/src/ops/conditionals.js +14 -0
- package/lib/src/ops/frame-curry.js +17 -0
- package/lib/src/ops/frame-ops.js +24 -0
- package/lib/src/ops/iterators.js +28 -0
- package/lib/src/ops.js +12 -0
- package/lib/src/version.js +3 -0
- package/lib/test/execute/eval-pipe-spec.js +45 -0
- package/lib/test/execute/evaluate-spec.js +76 -0
- package/lib/test/execute/execute-spec.js +115 -0
- package/lib/test/execute/hc-eval-spec.js +68 -0
- package/lib/test/execute/hc-test-spec.js +47 -0
- package/lib/test/execute/lex-pipe-spec.js +25 -0
- package/lib/test/execute/parse-spec.js +67 -0
- package/lib/test/execute/script-spec.js +29 -0
- package/lib/test/frames/frame-alias-spec.js +36 -0
- package/lib/test/frames/frame-arg-spec.js +57 -0
- package/lib/test/frames/frame-array-spec.js +54 -0
- package/lib/test/frames/frame-blob-spec.js +56 -0
- package/lib/test/frames/frame-bytes-spec.js +16 -0
- package/lib/test/frames/frame-comment-spec.js +17 -0
- package/lib/test/frames/frame-doc-spec.js +17 -0
- package/lib/test/frames/frame-expr-spec.js +60 -0
- package/lib/test/frames/frame-group-spec.js +27 -0
- package/lib/test/frames/frame-lazy-spec.js +49 -0
- package/lib/test/frames/frame-name-spec.js +26 -0
- package/lib/test/frames/frame-note-spec.js +48 -0
- package/lib/test/frames/frame-number-spec.js +17 -0
- package/lib/test/frames/frame-schema-spec.js +54 -0
- package/lib/test/frames/frame-spec.js +31 -0
- package/lib/test/frames/frame-string-spec.js +43 -0
- package/lib/test/frames/frame-symbol-spec.js +64 -0
- package/lib/test/frames/meta-frame-spec.js +75 -0
- package/lib/test/maml/maml-spec.js +42 -0
- package/lib/test/maml/tag-spec.js +53 -0
- package/lib/test/ops/iterators-spec.js +70 -0
- package/package.json +60 -34
- package/lib/bin.d.ts +0 -0
- package/lib/bin.js +0 -6
- package/lib/execute/actions.d.ts +0 -13
- package/lib/execute/actions.js +0 -48
- package/lib/execute/eval-pipe.d.ts +0 -5
- package/lib/execute/eval-pipe.js +0 -32
- package/lib/execute/evaluate.d.ts +0 -2
- package/lib/execute/evaluate.js +0 -20
- package/lib/execute/frame-space.d.ts +0 -7
- package/lib/execute/frame-space.js +0 -32
- package/lib/execute/group-pipe.d.ts +0 -6
- package/lib/execute/group-pipe.js +0 -27
- package/lib/execute/lex-pipe.d.ts +0 -12
- package/lib/execute/lex-pipe.js +0 -55
- package/lib/execute/lex.d.ts +0 -26
- package/lib/execute/lex.js +0 -94
- package/lib/execute/lexer.d.ts +0 -9
- package/lib/execute/lexer.js +0 -55
- package/lib/execute/parse-pipe.d.ts +0 -8
- package/lib/execute/parse-pipe.js +0 -49
- package/lib/execute/parser.d.ts +0 -8
- package/lib/execute/parser.js +0 -49
- package/lib/execute/syntax.d.ts +0 -2
- package/lib/execute/syntax.js +0 -23
- package/lib/execute/terminals.d.ts +0 -10
- package/lib/execute/terminals.js +0 -48
- package/lib/execute.d.ts +0 -1
- package/lib/execute.js +0 -9
- package/lib/frames/frame-arg.d.ts +0 -24
- package/lib/frames/frame-arg.js +0 -81
- package/lib/frames/frame-array.d.ts +0 -15
- package/lib/frames/frame-array.js +0 -50
- package/lib/frames/frame-atom.d.ts +0 -17
- package/lib/frames/frame-atom.js +0 -52
- package/lib/frames/frame-comment.d.ts +0 -12
- package/lib/frames/frame-comment.js +0 -36
- package/lib/frames/frame-doc.d.ts +0 -9
- package/lib/frames/frame-doc.js +0 -31
- package/lib/frames/frame-expr.d.ts +0 -9
- package/lib/frames/frame-expr.js +0 -48
- package/lib/frames/frame-group.d.ts +0 -7
- package/lib/frames/frame-group.js +0 -39
- package/lib/frames/frame-lazy.d.ts +0 -13
- package/lib/frames/frame-lazy.js +0 -54
- package/lib/frames/frame-list.d.ts +0 -15
- package/lib/frames/frame-list.js +0 -51
- package/lib/frames/frame-name.d.ts +0 -12
- package/lib/frames/frame-name.js +0 -37
- package/lib/frames/frame-number.d.ts +0 -9
- package/lib/frames/frame-number.js +0 -31
- package/lib/frames/frame-string.d.ts +0 -14
- package/lib/frames/frame-string.js +0 -47
- package/lib/frames/frame-symbol.d.ts +0 -18
- package/lib/frames/frame-symbol.js +0 -64
- package/lib/frames/frame.d.ts +0 -22
- package/lib/frames/frame.js +0 -73
- package/lib/frames/meta-frame.d.ts +0 -26
- package/lib/frames/meta-frame.js +0 -85
- package/lib/frames.d.ts +0 -15
- package/lib/frames.js +0 -36
- package/lib/hc.d.ts +0 -0
- package/lib/hc.js +0 -13
- package/lib/index.d.ts +0 -3
- package/lib/index.js +0 -9
- package/lib/maml/tag.d.ts +0 -2
- package/lib/maml/tag.js +0 -19
- package/lib/maml.d.ts +0 -2
- package/lib/maml.js +0 -30
- package/lib/ops/frame-curry.d.ts +0 -9
- package/lib/ops/frame-curry.js +0 -31
- package/lib/ops/frame-ops.d.ts +0 -12
- package/lib/ops/frame-ops.js +0 -41
- package/lib/ops/iterators.d.ts +0 -2
- package/lib/ops/iterators.js +0 -12
- package/lib/ops.d.ts +0 -3
- 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
|
-
[
|
|
4
|
+
[](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
|
-
##
|
|
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==
|