septima-lang 0.0.1 → 0.0.2
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/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/{cdl.d.ts → septima.d.ts} +8 -8
- package/dist/src/septima.js +63 -0
- package/dist/tests/parser.spec.js +7 -30
- package/dist/tests/{cdl.spec.d.ts → septima.spec.d.ts} +0 -0
- package/dist/tests/septima.spec.js +692 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -1
- package/src/{cdl.ts → septima.ts} +9 -9
- package/tests/parser.spec.ts +6 -6
- package/tests/{cdl.spec.ts → septima.spec.ts} +10 -10
- package/dist/src/cdl.js +0 -63
- package/dist/tests/cdl.spec.js +0 -692
package/dist/src/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './septima';
|
package/dist/src/index.js
CHANGED
|
@@ -14,5 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
__exportStar(require("./septima"), exports);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDRDQUF5QiJ9
|
|
@@ -3,25 +3,25 @@ import { Result, ResultSink } from './result';
|
|
|
3
3
|
import { Verbosity } from './runtime';
|
|
4
4
|
interface Options {
|
|
5
5
|
/**
|
|
6
|
-
* A callback function to be invoked when the
|
|
7
|
-
* value will be returned in that case. For instance, passing `() => undefined` will translate a `sink` value
|
|
8
|
-
* `undefined`. The default behavior is to throw an error.
|
|
6
|
+
* A callback function to be invoked when the Septima program evaluated to `sink`. Allows the caller to determine
|
|
7
|
+
* which value will be returned in that case. For instance, passing `() => undefined` will translate a `sink` value
|
|
8
|
+
* to `undefined`. The default behavior is to throw an error.
|
|
9
9
|
*/
|
|
10
10
|
onSink?: (res: ResultSink) => unknown;
|
|
11
11
|
}
|
|
12
|
-
export declare class
|
|
12
|
+
export declare class Septima {
|
|
13
13
|
readonly input: string;
|
|
14
14
|
private readonly scanner;
|
|
15
15
|
private readonly sourceCode;
|
|
16
16
|
private readonly parser;
|
|
17
17
|
/**
|
|
18
|
-
* Runs a
|
|
18
|
+
* Runs a Septima program and returns the value it evaluates to. If it evaluates to `sink`, returns the value computed
|
|
19
19
|
* by `options.onSink()` - if present, or throws an error - otherwise.
|
|
20
20
|
*
|
|
21
|
-
* This method is the simplest way to evaluate a
|
|
22
|
-
*
|
|
21
|
+
* This method is the simplest way to evaluate a Septima program, and it fits many common use cases. One can also use
|
|
22
|
+
* `.compute()` to get additional details about the execution.
|
|
23
23
|
*
|
|
24
|
-
* @param input the source code of the
|
|
24
|
+
* @param input the source code of the Septima program
|
|
25
25
|
* @param options
|
|
26
26
|
* @returns the value that `input` evaluates to
|
|
27
27
|
*/
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parse = exports.Septima = void 0;
|
|
4
|
+
const parser_1 = require("./parser");
|
|
5
|
+
const result_1 = require("./result");
|
|
6
|
+
const runtime_1 = require("./runtime");
|
|
7
|
+
const scanner_1 = require("./scanner");
|
|
8
|
+
const should_never_happen_1 = require("./should-never-happen");
|
|
9
|
+
const source_code_1 = require("./source-code");
|
|
10
|
+
class Septima {
|
|
11
|
+
constructor(input) {
|
|
12
|
+
this.input = input;
|
|
13
|
+
this.sourceCode = new source_code_1.SourceCode(this.input);
|
|
14
|
+
this.scanner = new scanner_1.Scanner(this.sourceCode);
|
|
15
|
+
this.parser = new parser_1.Parser(this.scanner);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Runs a Septima program and returns the value it evaluates to. If it evaluates to `sink`, returns the value computed
|
|
19
|
+
* by `options.onSink()` - if present, or throws an error - otherwise.
|
|
20
|
+
*
|
|
21
|
+
* This method is the simplest way to evaluate a Septima program, and it fits many common use cases. One can also use
|
|
22
|
+
* `.compute()` to get additional details about the execution.
|
|
23
|
+
*
|
|
24
|
+
* @param input the source code of the Septima program
|
|
25
|
+
* @param options
|
|
26
|
+
* @returns the value that `input` evaluates to
|
|
27
|
+
*/
|
|
28
|
+
static run(input, options) {
|
|
29
|
+
const onSink = options?.onSink ??
|
|
30
|
+
((r) => {
|
|
31
|
+
throw new Error(r.message);
|
|
32
|
+
});
|
|
33
|
+
const res = new Septima(input).compute();
|
|
34
|
+
if (res.tag === 'ok') {
|
|
35
|
+
return res.value;
|
|
36
|
+
}
|
|
37
|
+
if (res.tag === 'sink') {
|
|
38
|
+
return onSink(res);
|
|
39
|
+
}
|
|
40
|
+
(0, should_never_happen_1.shouldNeverHappen)(res);
|
|
41
|
+
}
|
|
42
|
+
compute(verbosity = 'quiet') {
|
|
43
|
+
const ast = parse(this.parser);
|
|
44
|
+
const runtime = new runtime_1.Runtime(ast, verbosity, this.parser);
|
|
45
|
+
const c = runtime.compute();
|
|
46
|
+
if (c.value) {
|
|
47
|
+
if (!c.value.isSink()) {
|
|
48
|
+
return { value: c.value.export(), tag: 'ok' };
|
|
49
|
+
}
|
|
50
|
+
return new result_1.ResultSinkImpl(c.value, this.sourceCode);
|
|
51
|
+
}
|
|
52
|
+
const runtimeErrorMessage = `${c.errorMessage} when evaluating:\n${this.sourceCode.formatTrace(c.expressionTrace)}`;
|
|
53
|
+
throw new Error(runtimeErrorMessage);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.Septima = Septima;
|
|
57
|
+
function parse(arg) {
|
|
58
|
+
const parser = typeof arg === 'string' ? new parser_1.Parser(new scanner_1.Scanner(new source_code_1.SourceCode(arg))) : arg;
|
|
59
|
+
const ast = parser.parse();
|
|
60
|
+
return ast;
|
|
61
|
+
}
|
|
62
|
+
exports.parse = parse;
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VwdGltYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXB0aW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFDQUFpQztBQUNqQyxxQ0FBNkQ7QUFDN0QsdUNBQThDO0FBQzlDLHVDQUFtQztBQUNuQywrREFBeUQ7QUFDekQsK0NBQTBDO0FBVzFDLE1BQWEsT0FBTztJQWtDbEIsWUFBcUIsS0FBYTtRQUFiLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHdCQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzVDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4QyxDQUFDO0lBakNEOzs7Ozs7Ozs7O09BVUc7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQWEsRUFBRSxPQUFpQjtRQUN6QyxNQUFNLE1BQU0sR0FDVixPQUFPLEVBQUUsTUFBTTtZQUNmLENBQUMsQ0FBQyxDQUFhLEVBQUUsRUFBRTtnQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDNUIsQ0FBQyxDQUFDLENBQUE7UUFDSixNQUFNLEdBQUcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUN4QyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ3BCLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQTtTQUNqQjtRQUVELElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxNQUFNLEVBQUU7WUFDdEIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7U0FDbkI7UUFFRCxJQUFBLHVDQUFpQixFQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3hCLENBQUM7SUFRRCxPQUFPLENBQUMsWUFBdUIsT0FBTztRQUNwQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzlCLE1BQU0sT0FBTyxHQUFHLElBQUksaUJBQU8sQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN4RCxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFM0IsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFO1lBQ1gsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ3JCLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUE7YUFDOUM7WUFDRCxPQUFPLElBQUksdUJBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtTQUNwRDtRQUVELE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDLENBQUMsWUFBWSxzQkFBc0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUE7UUFDbkgsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBQ3RDLENBQUM7Q0FDRjtBQXZERCwwQkF1REM7QUFFRCxTQUFnQixLQUFLLENBQUMsR0FBb0I7SUFDeEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQU0sQ0FBQyxJQUFJLGlCQUFPLENBQUMsSUFBSSx3QkFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBO0lBQzNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUMxQixPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUM7QUFKRCxzQkFJQyJ9
|
|
@@ -1,39 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
3
|
const ast_node_1 = require("../src/ast-node");
|
|
27
|
-
const
|
|
4
|
+
const septima_1 = require("../src/septima");
|
|
28
5
|
describe('parser', () => {
|
|
29
6
|
test('show()', () => {
|
|
30
|
-
expect((0, ast_node_1.show)(
|
|
31
|
-
expect((0, ast_node_1.show)(
|
|
7
|
+
expect((0, ast_node_1.show)((0, septima_1.parse)(`5`))).toEqual('5');
|
|
8
|
+
expect((0, ast_node_1.show)((0, septima_1.parse)(`fun (x) x*9`))).toEqual('fun (x) (x * 9)');
|
|
32
9
|
});
|
|
33
10
|
test('syntax errors', () => {
|
|
34
|
-
expect(() =>
|
|
35
|
-
expect(() =>
|
|
36
|
-
expect(() =>
|
|
11
|
+
expect(() => (0, septima_1.parse)(`a + #$%x`)).toThrowError('Unparsable input at (1:5..8) #$%x');
|
|
12
|
+
expect(() => (0, septima_1.parse)(`{#$%x: 8}`)).toThrowError('Expected an identifier at (1:2..9) #$%x: 8}');
|
|
13
|
+
expect(() => (0, septima_1.parse)(`"foo" "goo"`)).toThrowError('Loitering input at (1:7..11) "goo"');
|
|
37
14
|
});
|
|
38
15
|
});
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0cy9wYXJzZXIuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDhDQUFzQztBQUN0Qyw0Q0FBc0M7QUFFdEMsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7SUFDdEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDbEIsTUFBTSxDQUFDLElBQUEsZUFBSSxFQUFDLElBQUEsZUFBSyxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDckMsTUFBTSxDQUFDLElBQUEsZUFBSSxFQUFDLElBQUEsZUFBSyxFQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUMvRCxDQUFDLENBQUMsQ0FBQTtJQUNGLElBQUksQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLGVBQUssRUFBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO1FBQ2pGLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLGVBQUssRUFBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFBO1FBQzVGLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLGVBQUssRUFBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFBO0lBQ3ZGLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEifQ==
|
|
File without changes
|