openalgo-script 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +226 -0
- package/README.md +53 -22
- package/dist/adapters/charts/run.d.ts.map +1 -1
- package/dist/adapters/charts/run.js +6 -0
- package/dist/adapters/charts/run.js.map +1 -1
- package/dist/adapters/charts/tables.d.ts +6 -19
- package/dist/adapters/charts/tables.d.ts.map +1 -1
- package/dist/adapters/charts/tables.js.map +1 -1
- package/dist/adapters/charts/undrawable.d.ts +4 -0
- package/dist/adapters/charts/undrawable.d.ts.map +1 -0
- package/dist/adapters/charts/undrawable.js +47 -0
- package/dist/adapters/charts/undrawable.js.map +1 -0
- package/dist/core/backtest/drive.d.ts +36 -1
- package/dist/core/backtest/drive.d.ts.map +1 -1
- package/dist/core/backtest/drive.js +13 -107
- package/dist/core/backtest/drive.js.map +1 -1
- package/dist/core/backtest/index.d.ts +2 -0
- package/dist/core/backtest/index.d.ts.map +1 -1
- package/dist/core/backtest/index.js.map +1 -1
- package/dist/core/backtest/walk.d.ts +39 -0
- package/dist/core/backtest/walk.d.ts.map +1 -0
- package/dist/core/backtest/walk.js +125 -0
- package/dist/core/backtest/walk.js.map +1 -0
- package/dist/core/catalogue/catalogue.generated.d.ts +178 -1
- package/dist/core/catalogue/catalogue.generated.d.ts.map +1 -1
- package/dist/core/catalogue/catalogue.generated.js +18 -1
- package/dist/core/catalogue/catalogue.generated.js.map +1 -1
- package/dist/core/catalogue/types.d.ts +8 -2
- package/dist/core/catalogue/types.d.ts.map +1 -1
- package/dist/core/catalogue/values.generated.d.ts +51 -0
- package/dist/core/catalogue/values.generated.d.ts.map +1 -1
- package/dist/core/check/assigned.d.ts +19 -0
- package/dist/core/check/assigned.d.ts.map +1 -0
- package/dist/core/check/assigned.js +14 -0
- package/dist/core/check/assigned.js.map +1 -0
- package/dist/core/check/call-sites.d.ts.map +1 -1
- package/dist/core/check/call-sites.js +9 -4
- package/dist/core/check/call-sites.js.map +1 -1
- package/dist/core/check/calls.d.ts.map +1 -1
- package/dist/core/check/calls.js +12 -4
- package/dist/core/check/calls.js.map +1 -1
- package/dist/core/check/check.d.ts.map +1 -1
- package/dist/core/check/check.js +15 -2
- package/dist/core/check/check.js.map +1 -1
- package/dist/core/check/checker.d.ts +26 -0
- package/dist/core/check/checker.d.ts.map +1 -1
- package/dist/core/check/checker.js +38 -2
- package/dist/core/check/checker.js.map +1 -1
- package/dist/core/check/constant.d.ts +16 -0
- package/dist/core/check/constant.d.ts.map +1 -1
- package/dist/core/check/constant.js +52 -0
- package/dist/core/check/constant.js.map +1 -1
- package/dist/core/check/deleted.d.ts +3 -0
- package/dist/core/check/deleted.d.ts.map +1 -0
- package/dist/core/check/deleted.js +109 -0
- package/dist/core/check/deleted.js.map +1 -0
- package/dist/core/check/expressions.js +1 -1
- package/dist/core/check/expressions.js.map +1 -1
- package/dist/core/check/library-output.d.ts.map +1 -1
- package/dist/core/check/library-output.js +1 -0
- package/dist/core/check/library-output.js.map +1 -1
- package/dist/core/check/library-prose.generated.js +10 -10
- package/dist/core/check/library-prose.generated.js.map +1 -1
- package/dist/core/check/library.d.ts +7 -0
- package/dist/core/check/library.d.ts.map +1 -1
- package/dist/core/check/library.js +1 -0
- package/dist/core/check/library.js.map +1 -1
- package/dist/core/check/surface.d.ts +9 -0
- package/dist/core/check/surface.d.ts.map +1 -1
- package/dist/core/check/surface.js +13 -0
- package/dist/core/check/surface.js.map +1 -1
- package/dist/core/engine/bar-source.d.ts +65 -0
- package/dist/core/engine/bar-source.d.ts.map +1 -0
- package/dist/core/engine/bar-source.js +58 -0
- package/dist/core/engine/bar-source.js.map +1 -0
- package/dist/core/engine/channels.js +2 -2
- package/dist/core/engine/channels.js.map +1 -1
- package/dist/core/engine/engine.d.ts +9 -11
- package/dist/core/engine/engine.d.ts.map +1 -1
- package/dist/core/engine/engine.js +26 -27
- package/dist/core/engine/engine.js.map +1 -1
- package/dist/core/engine/guard.d.ts.map +1 -1
- package/dist/core/engine/guard.js +10 -0
- package/dist/core/engine/guard.js.map +1 -1
- package/dist/core/engine/host.d.ts +4 -2
- package/dist/core/engine/host.d.ts.map +1 -1
- package/dist/core/engine/host.js.map +1 -1
- package/dist/core/engine/index.d.ts +1 -0
- package/dist/core/engine/index.d.ts.map +1 -1
- package/dist/core/engine/index.js.map +1 -1
- package/dist/core/engine/library/binding.d.ts +2 -0
- package/dist/core/engine/library/binding.d.ts.map +1 -1
- package/dist/core/engine/library/binding.js.map +1 -1
- package/dist/core/engine/library/index.d.ts +8 -0
- package/dist/core/engine/library/index.d.ts.map +1 -1
- package/dist/core/engine/library/index.js +10 -0
- package/dist/core/engine/library/index.js.map +1 -1
- package/dist/core/engine/library/maths.js +2 -2
- package/dist/core/engine/library/maths.js.map +1 -1
- package/dist/core/engine/library/objects.d.ts.map +1 -1
- package/dist/core/engine/library/objects.js +1 -1
- package/dist/core/engine/library/objects.js.map +1 -1
- package/dist/core/engine/machine.js +5 -5
- package/dist/core/engine/machine.js.map +1 -1
- package/dist/core/engine/memory.js +2 -2
- package/dist/core/engine/memory.js.map +1 -1
- package/dist/core/engine/registers.js +2 -2
- package/dist/core/engine/registers.js.map +1 -1
- package/dist/core/engine/request-body.d.ts +3 -1
- package/dist/core/engine/request-body.d.ts.map +1 -1
- package/dist/core/engine/request-body.js +3 -1
- package/dist/core/engine/request-body.js.map +1 -1
- package/dist/core/engine/request-plan.d.ts +3 -3
- package/dist/core/engine/request-plan.js +3 -3
- package/dist/core/engine/requests.d.ts +2 -2
- package/dist/core/engine/requests.d.ts.map +1 -1
- package/dist/core/engine/requests.js +5 -4
- package/dist/core/engine/requests.js.map +1 -1
- package/dist/core/engine/series.d.ts +18 -6
- package/dist/core/engine/series.d.ts.map +1 -1
- package/dist/core/engine/series.js +24 -5
- package/dist/core/engine/series.js.map +1 -1
- package/dist/core/engine/session/record.d.ts +4 -4
- package/dist/core/engine/session/record.js +4 -4
- package/dist/core/engine/values/index.d.ts +1 -1
- package/dist/core/engine/values/index.d.ts.map +1 -1
- package/dist/core/engine/values/index.js +1 -1
- package/dist/core/engine/values/index.js.map +1 -1
- package/dist/core/engine/values/value.d.ts +2 -0
- package/dist/core/engine/values/value.d.ts.map +1 -1
- package/dist/core/engine/values/value.js +4 -0
- package/dist/core/engine/values/value.js.map +1 -1
- package/dist/core/importer/calls.d.ts +29 -0
- package/dist/core/importer/calls.d.ts.map +1 -0
- package/dist/core/importer/calls.js +267 -0
- package/dist/core/importer/calls.js.map +1 -0
- package/dist/core/importer/context.d.ts +118 -0
- package/dist/core/importer/context.d.ts.map +1 -0
- package/dist/core/importer/context.js +120 -0
- package/dist/core/importer/context.js.map +1 -0
- package/dist/core/importer/expressions.d.ts +44 -0
- package/dist/core/importer/expressions.d.ts.map +1 -0
- package/dist/core/importer/expressions.js +223 -0
- package/dist/core/importer/expressions.js.map +1 -0
- package/dist/core/importer/importer.d.ts +13 -0
- package/dist/core/importer/importer.d.ts.map +1 -0
- package/dist/core/importer/importer.js +220 -0
- package/dist/core/importer/importer.js.map +1 -0
- package/dist/core/importer/index.d.ts +20 -0
- package/dist/core/importer/index.d.ts.map +1 -0
- package/dist/core/importer/index.js +18 -0
- package/dist/core/importer/index.js.map +1 -0
- package/dist/core/importer/lexer.d.ts +68 -0
- package/dist/core/importer/lexer.d.ts.map +1 -0
- package/dist/core/importer/lexer.js +207 -0
- package/dist/core/importer/lexer.js.map +1 -0
- package/dist/core/importer/names.d.ts +41 -0
- package/dist/core/importer/names.d.ts.map +1 -0
- package/dist/core/importer/names.js +78 -0
- package/dist/core/importer/names.js.map +1 -0
- package/dist/core/importer/orders.d.ts +8 -0
- package/dist/core/importer/orders.d.ts.map +1 -0
- package/dist/core/importer/orders.js +332 -0
- package/dist/core/importer/orders.js.map +1 -0
- package/dist/core/importer/outputs.d.ts +19 -0
- package/dist/core/importer/outputs.d.ts.map +1 -0
- package/dist/core/importer/outputs.js +266 -0
- package/dist/core/importer/outputs.js.map +1 -0
- package/dist/core/importer/parser.d.ts +5 -0
- package/dist/core/importer/parser.d.ts.map +1 -0
- package/dist/core/importer/parser.js +439 -0
- package/dist/core/importer/parser.js.map +1 -0
- package/dist/core/importer/presence.d.ts +32 -0
- package/dist/core/importer/presence.d.ts.map +1 -0
- package/dist/core/importer/presence.js +146 -0
- package/dist/core/importer/presence.js.map +1 -0
- package/dist/core/importer/settle.d.ts +23 -0
- package/dist/core/importer/settle.d.ts.map +1 -0
- package/dist/core/importer/settle.js +135 -0
- package/dist/core/importer/settle.js.map +1 -0
- package/dist/core/importer/statements.d.ts +4 -0
- package/dist/core/importer/statements.d.ts.map +1 -0
- package/dist/core/importer/statements.js +339 -0
- package/dist/core/importer/statements.js.map +1 -0
- package/dist/core/importer/syntax.d.ts +182 -0
- package/dist/core/importer/syntax.d.ts.map +1 -0
- package/dist/core/importer/syntax.js +14 -0
- package/dist/core/importer/syntax.js.map +1 -0
- package/dist/core/importer/table.d.ts +52 -0
- package/dist/core/importer/table.d.ts.map +1 -0
- package/dist/core/importer/table.js +156 -0
- package/dist/core/importer/table.js.map +1 -0
- package/dist/core/importer/values.d.ts +27 -0
- package/dist/core/importer/values.d.ts.map +1 -0
- package/dist/core/importer/values.js +236 -0
- package/dist/core/importer/values.js.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +11 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/stdlib/averages/exponential.d.ts.map +1 -1
- package/dist/core/stdlib/averages/exponential.js +3 -6
- package/dist/core/stdlib/averages/exponential.js.map +1 -1
- package/dist/core/stdlib/averages/gaussian.d.ts +15 -0
- package/dist/core/stdlib/averages/gaussian.d.ts.map +1 -0
- package/dist/core/stdlib/averages/gaussian.js +55 -0
- package/dist/core/stdlib/averages/gaussian.js.map +1 -0
- package/dist/core/stdlib/averages/shaped.d.ts +2 -6
- package/dist/core/stdlib/averages/shaped.d.ts.map +1 -1
- package/dist/core/stdlib/averages/shaped.js +8 -22
- package/dist/core/stdlib/averages/shaped.js.map +1 -1
- package/dist/core/stdlib/calendar/civil.d.ts.map +1 -1
- package/dist/core/stdlib/calendar/civil.js +5 -2
- package/dist/core/stdlib/calendar/civil.js.map +1 -1
- package/dist/core/stdlib/maths/arithmetic.d.ts.map +1 -1
- package/dist/core/stdlib/maths/arithmetic.js +2 -1
- package/dist/core/stdlib/maths/arithmetic.js.map +1 -1
- package/dist/core/stdlib/maths/elementary.d.ts +3 -20
- package/dist/core/stdlib/maths/elementary.d.ts.map +1 -1
- package/dist/core/stdlib/maths/elementary.js +17 -13
- package/dist/core/stdlib/maths/elementary.js.map +1 -1
- package/dist/core/stdlib/maths/hypot.d.ts +8 -0
- package/dist/core/stdlib/maths/hypot.d.ts.map +1 -0
- package/dist/core/stdlib/maths/hypot.js +68 -0
- package/dist/core/stdlib/maths/hypot.js.map +1 -0
- package/dist/core/stdlib/maths/power.d.ts +3 -0
- package/dist/core/stdlib/maths/power.d.ts.map +1 -0
- package/dist/core/stdlib/maths/power.js +83 -0
- package/dist/core/stdlib/maths/power.js.map +1 -0
- package/dist/core/stdlib/maths/transcendental.d.ts +15 -0
- package/dist/core/stdlib/maths/transcendental.d.ts.map +1 -0
- package/dist/core/stdlib/maths/transcendental.js +185 -0
- package/dist/core/stdlib/maths/transcendental.js.map +1 -0
- package/dist/core/stdlib/maths/trigonometric.d.ts +4 -0
- package/dist/core/stdlib/maths/trigonometric.d.ts.map +1 -0
- package/dist/core/stdlib/maths/trigonometric.js +196 -0
- package/dist/core/stdlib/maths/trigonometric.js.map +1 -0
- package/dist/core/stdlib/series/conditions.d.ts +2 -4
- package/dist/core/stdlib/series/conditions.d.ts.map +1 -1
- package/dist/core/stdlib/series/conditions.js +9 -13
- package/dist/core/stdlib/series/conditions.js.map +1 -1
- package/dist/core/stdlib/series/statistics.d.ts.map +1 -1
- package/dist/core/stdlib/series/statistics.js +2 -0
- package/dist/core/stdlib/series/statistics.js.map +1 -1
- package/dist/core/stdlib/values/history.d.ts +26 -0
- package/dist/core/stdlib/values/history.d.ts.map +1 -0
- package/dist/core/stdlib/values/history.js +52 -0
- package/dist/core/stdlib/values/history.js.map +1 -0
- package/dist/core/stdlib/values/index.d.ts +1 -0
- package/dist/core/stdlib/values/index.d.ts.map +1 -1
- package/dist/core/stdlib/values/index.js +1 -0
- package/dist/core/stdlib/values/index.js.map +1 -1
- package/dist/core/stdlib/values/lookback.d.ts +4 -1
- package/dist/core/stdlib/values/lookback.d.ts.map +1 -1
- package/dist/core/stdlib/values/lookback.js +48 -45
- package/dist/core/stdlib/values/lookback.js.map +1 -1
- package/dist/core/stdlib/values/region.d.ts +6 -5
- package/dist/core/stdlib/values/region.d.ts.map +1 -1
- package/dist/core/stdlib/values/region.js +3 -3
- package/dist/core/stdlib/values/region.js.map +1 -1
- package/dist/core/stdlib/volatility/measures.d.ts.map +1 -1
- package/dist/core/stdlib/volatility/measures.js +6 -4
- package/dist/core/stdlib/volatility/measures.js.map +1 -1
- package/dist/core/version/version.generated.d.ts +1 -1
- package/dist/core/version/version.generated.js +1 -1
- package/package.json +13 -2
- package/spec/errors.json +380 -20
- package/src/adapters/charts/run.ts +6 -0
- package/src/adapters/charts/tables.ts +6 -19
- package/src/adapters/charts/undrawable.ts +51 -0
- package/src/core/backtest/drive.ts +66 -154
- package/src/core/backtest/index.ts +2 -0
- package/src/core/backtest/walk.ts +182 -0
- package/src/core/catalogue/catalogue.generated.ts +18 -1
- package/src/core/catalogue/types.ts +8 -2
- package/src/core/catalogue/values.generated.ts +16 -0
- package/src/core/check/assigned.ts +31 -0
- package/src/core/check/call-sites.ts +11 -4
- package/src/core/check/calls.ts +13 -4
- package/src/core/check/check.ts +14 -2
- package/src/core/check/checker.ts +39 -2
- package/src/core/check/constant.ts +57 -0
- package/src/core/check/deleted.ts +135 -0
- package/src/core/check/expressions.ts +1 -1
- package/src/core/check/library-output.ts +1 -0
- package/src/core/check/library-prose.generated.ts +10 -10
- package/src/core/check/library.ts +8 -0
- package/src/core/check/surface.ts +16 -0
- package/src/core/engine/bar-source.ts +113 -0
- package/src/core/engine/channels.ts +2 -2
- package/src/core/engine/engine.ts +29 -28
- package/src/core/engine/guard.ts +12 -1
- package/src/core/engine/host.ts +4 -2
- package/src/core/engine/index.ts +1 -0
- package/src/core/engine/library/binding.ts +2 -0
- package/src/core/engine/library/index.ts +11 -0
- package/src/core/engine/library/maths.ts +2 -2
- package/src/core/engine/library/objects.ts +1 -6
- package/src/core/engine/machine.ts +5 -5
- package/src/core/engine/memory.ts +2 -2
- package/src/core/engine/registers.ts +2 -2
- package/src/core/engine/request-body.ts +5 -7
- package/src/core/engine/request-plan.ts +3 -3
- package/src/core/engine/requests.ts +11 -8
- package/src/core/engine/series.ts +30 -6
- package/src/core/engine/session/record.ts +4 -4
- package/src/core/engine/values/index.ts +1 -0
- package/src/core/engine/values/value.ts +5 -0
- package/src/core/importer/calls.ts +274 -0
- package/src/core/importer/context.ts +197 -0
- package/src/core/importer/expressions.ts +247 -0
- package/src/core/importer/importer.ts +226 -0
- package/src/core/importer/index.ts +19 -0
- package/src/core/importer/lexer.ts +285 -0
- package/src/core/importer/names.ts +104 -0
- package/src/core/importer/orders.ts +307 -0
- package/src/core/importer/outputs.ts +245 -0
- package/src/core/importer/parser.ts +436 -0
- package/src/core/importer/presence.ts +164 -0
- package/src/core/importer/settle.ts +141 -0
- package/src/core/importer/statements.ts +331 -0
- package/src/core/importer/syntax.ts +144 -0
- package/src/core/importer/table.ts +191 -0
- package/src/core/importer/values.ts +241 -0
- package/src/core/index.ts +13 -0
- package/src/core/stdlib/averages/exponential.ts +3 -4
- package/src/core/stdlib/averages/gaussian.ts +52 -0
- package/src/core/stdlib/averages/shaped.ts +8 -21
- package/src/core/stdlib/calendar/civil.ts +5 -2
- package/src/core/stdlib/maths/arithmetic.ts +2 -1
- package/src/core/stdlib/maths/elementary.ts +20 -33
- package/src/core/stdlib/maths/hypot.ts +63 -0
- package/src/core/stdlib/maths/power.ts +57 -0
- package/src/core/stdlib/maths/transcendental.ts +160 -0
- package/src/core/stdlib/maths/trigonometric.ts +160 -0
- package/src/core/stdlib/series/conditions.ts +9 -12
- package/src/core/stdlib/series/statistics.ts +1 -0
- package/src/core/stdlib/values/history.ts +70 -0
- package/src/core/stdlib/values/index.ts +1 -0
- package/src/core/stdlib/values/lookback.ts +51 -47
- package/src/core/stdlib/values/region.ts +7 -5
- package/src/core/stdlib/volatility/measures.ts +6 -4
- package/src/core/version/version.generated.ts +1 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/** The width of one block in the dialect, which a continuation is indented off. */
|
|
2
|
+
const BLOCK = 4;
|
|
3
|
+
const TWO_CHARACTER = [':=', '==', '!=', '<=', '>=', '=>', '+=', '-=', '*=', '/=', '%='];
|
|
4
|
+
const ONE_CHARACTER = '+-*/%<>=?:,.()[]';
|
|
5
|
+
/** Tokens after which a statement cannot end, so the next indented line continues it. */
|
|
6
|
+
const CONTINUES = new Set([
|
|
7
|
+
',', '+', '-', '*', '/', '%', '==', '!=', '<', '<=', '>', '>=', '?', ':', ':=', '=',
|
|
8
|
+
'+=', '-=', '*=', '/=', '%=', 'and', 'or', 'not', '(', '[',
|
|
9
|
+
]);
|
|
10
|
+
const NAME_START = /[A-Za-z_]/;
|
|
11
|
+
const NAME_PART = /[A-Za-z0-9_]/;
|
|
12
|
+
const DIGIT = /[0-9]/;
|
|
13
|
+
const HEX = /[0-9A-Fa-f]/;
|
|
14
|
+
const ESCAPES = { n: '\n', t: '\t', r: '\r', '\\': '\\', "'": "'", '"': '"' };
|
|
15
|
+
/** Columns of leading whitespace, and where the text after it starts. */
|
|
16
|
+
function measure(text) {
|
|
17
|
+
let indent = 0;
|
|
18
|
+
let start = 0;
|
|
19
|
+
while (start < text.length) {
|
|
20
|
+
const c = text[start];
|
|
21
|
+
if (c === ' ')
|
|
22
|
+
indent += 1;
|
|
23
|
+
else if (c === '\t')
|
|
24
|
+
indent += BLOCK - (indent % BLOCK);
|
|
25
|
+
else
|
|
26
|
+
break;
|
|
27
|
+
start += 1;
|
|
28
|
+
}
|
|
29
|
+
return { indent, start };
|
|
30
|
+
}
|
|
31
|
+
function readString(text, at) {
|
|
32
|
+
const quote = text[at];
|
|
33
|
+
let value = '';
|
|
34
|
+
let i = at + 1;
|
|
35
|
+
while (i < text.length) {
|
|
36
|
+
const c = text[i] ?? '';
|
|
37
|
+
if (c === quote)
|
|
38
|
+
return { end: i + 1, value, closed: true };
|
|
39
|
+
if (c === '\\' && i + 1 < text.length) {
|
|
40
|
+
const next = text[i + 1] ?? '';
|
|
41
|
+
value += ESCAPES[next] ?? next;
|
|
42
|
+
i += 2;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
value += c;
|
|
46
|
+
i += 1;
|
|
47
|
+
}
|
|
48
|
+
return { end: text.length, value, closed: false };
|
|
49
|
+
}
|
|
50
|
+
function readNumber(text, at) {
|
|
51
|
+
let i = at;
|
|
52
|
+
while (i < text.length && DIGIT.test(text[i] ?? ''))
|
|
53
|
+
i += 1;
|
|
54
|
+
if (text[i] === '.' && !NAME_START.test(text[i + 1] ?? '')) {
|
|
55
|
+
i += 1;
|
|
56
|
+
while (i < text.length && DIGIT.test(text[i] ?? ''))
|
|
57
|
+
i += 1;
|
|
58
|
+
}
|
|
59
|
+
if ((text[i] === 'e' || text[i] === 'E') && /[0-9+-]/.test(text[i + 1] ?? '')) {
|
|
60
|
+
let j = i + 1;
|
|
61
|
+
if (text[j] === '+' || text[j] === '-')
|
|
62
|
+
j += 1;
|
|
63
|
+
if (DIGIT.test(text[j] ?? '')) {
|
|
64
|
+
i = j;
|
|
65
|
+
while (i < text.length && DIGIT.test(text[i] ?? ''))
|
|
66
|
+
i += 1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return i;
|
|
70
|
+
}
|
|
71
|
+
/** Every token on one physical line, and the comment that ends it if any. */
|
|
72
|
+
function tokensOf(text, start, lineStart, line) {
|
|
73
|
+
const tokens = [];
|
|
74
|
+
const token = (kind, from, to, value) => {
|
|
75
|
+
const written = text.slice(from, to);
|
|
76
|
+
tokens.push({ kind, text: written, value: value ?? written, offset: lineStart + from, length: to - from });
|
|
77
|
+
};
|
|
78
|
+
let i = start;
|
|
79
|
+
while (i < text.length) {
|
|
80
|
+
const c = text[i] ?? '';
|
|
81
|
+
if (c === ' ' || c === '\t') {
|
|
82
|
+
i += 1;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (c === '/' && text[i + 1] === '/') {
|
|
86
|
+
return { tokens, remark: { text: text.slice(i + 2).trimEnd(), offset: lineStart + i, line } };
|
|
87
|
+
}
|
|
88
|
+
if (NAME_START.test(c)) {
|
|
89
|
+
let j = i + 1;
|
|
90
|
+
while (j < text.length && NAME_PART.test(text[j] ?? ''))
|
|
91
|
+
j += 1;
|
|
92
|
+
token('name', i, j);
|
|
93
|
+
i = j;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (DIGIT.test(c) || (c === '.' && DIGIT.test(text[i + 1] ?? ''))) {
|
|
97
|
+
const j = readNumber(text, i);
|
|
98
|
+
token('number', i, j);
|
|
99
|
+
i = j;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (c === '"' || c === "'") {
|
|
103
|
+
const read = readString(text, i);
|
|
104
|
+
token(read.closed ? 'string' : 'bad', i, read.end, read.value);
|
|
105
|
+
i = read.end;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (c === '#') {
|
|
109
|
+
let j = i + 1;
|
|
110
|
+
while (j < text.length && HEX.test(text[j] ?? ''))
|
|
111
|
+
j += 1;
|
|
112
|
+
token(j - i === 7 || j - i === 9 ? 'color' : 'bad', i, j);
|
|
113
|
+
i = j;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const pair = text.slice(i, i + 2);
|
|
117
|
+
if (TWO_CHARACTER.includes(pair)) {
|
|
118
|
+
token('op', i, i + 2);
|
|
119
|
+
i += 2;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
token(ONE_CHARACTER.includes(c) ? 'op' : 'bad', i, i + 1);
|
|
123
|
+
i += 1;
|
|
124
|
+
}
|
|
125
|
+
return { tokens, remark: undefined };
|
|
126
|
+
}
|
|
127
|
+
/** How far a line's brackets leave the statement open. */
|
|
128
|
+
function depthAfter(depth, tokens) {
|
|
129
|
+
let open = depth;
|
|
130
|
+
for (const one of tokens) {
|
|
131
|
+
if (one.kind !== 'op')
|
|
132
|
+
continue;
|
|
133
|
+
if (one.text === '(' || one.text === '[')
|
|
134
|
+
open += 1;
|
|
135
|
+
else if (one.text === ')' || one.text === ']')
|
|
136
|
+
open = Math.max(0, open - 1);
|
|
137
|
+
}
|
|
138
|
+
return open;
|
|
139
|
+
}
|
|
140
|
+
function continues(current, next) {
|
|
141
|
+
if (current.depth > 0)
|
|
142
|
+
return true;
|
|
143
|
+
if (next.indent <= current.indent)
|
|
144
|
+
return false;
|
|
145
|
+
if (next.indent % BLOCK !== 0)
|
|
146
|
+
return true;
|
|
147
|
+
const last = current.tokens[current.tokens.length - 1];
|
|
148
|
+
return last !== undefined && CONTINUES.has(last.text);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* The whole file as items: statements, comment lines and blank lines, in order.
|
|
152
|
+
*
|
|
153
|
+
* A comment line or a blank line inside an open statement belongs to that
|
|
154
|
+
* statement and ends nothing, the same rule OpenScript gives them.
|
|
155
|
+
*/
|
|
156
|
+
export function readItems(file) {
|
|
157
|
+
const items = [];
|
|
158
|
+
let current;
|
|
159
|
+
const held = [];
|
|
160
|
+
const close = () => {
|
|
161
|
+
if (current === undefined)
|
|
162
|
+
return;
|
|
163
|
+
const { indent, tokens, remarks, firstLine, lastLine } = current;
|
|
164
|
+
items.push({ kind: 'code', logical: { indent, tokens, remarks, firstLine, lastLine } });
|
|
165
|
+
current = undefined;
|
|
166
|
+
};
|
|
167
|
+
for (let line = 1; line <= file.lineCount; line += 1) {
|
|
168
|
+
const text = file.lineText(line);
|
|
169
|
+
const { indent, start } = measure(text);
|
|
170
|
+
const read = tokensOf(text, start, file.lineStart(line), line);
|
|
171
|
+
const physical = { line, indent, tokens: read.tokens, remark: read.remark };
|
|
172
|
+
if (physical.tokens.length === 0) {
|
|
173
|
+
if (current !== undefined && current.depth > 0) {
|
|
174
|
+
if (physical.remark !== undefined)
|
|
175
|
+
current.remarks.push(physical.remark);
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
held.push(physical.remark === undefined
|
|
179
|
+
? { kind: 'blank', line }
|
|
180
|
+
: { kind: 'remark', remark: physical.remark, indent });
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
if (current !== undefined && continues(current, physical)) {
|
|
184
|
+
current.tokens.push(...physical.tokens);
|
|
185
|
+
if (physical.remark !== undefined)
|
|
186
|
+
current.remarks.push(physical.remark);
|
|
187
|
+
current.lastLine = line;
|
|
188
|
+
current.depth = depthAfter(current.depth, physical.tokens);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
close();
|
|
192
|
+
items.push(...held);
|
|
193
|
+
held.length = 0;
|
|
194
|
+
current = {
|
|
195
|
+
indent,
|
|
196
|
+
tokens: [...physical.tokens],
|
|
197
|
+
remarks: physical.remark === undefined ? [] : [physical.remark],
|
|
198
|
+
firstLine: line,
|
|
199
|
+
lastLine: line,
|
|
200
|
+
depth: depthAfter(0, physical.tokens),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
close();
|
|
204
|
+
items.push(...held);
|
|
205
|
+
return items;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=lexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexer.js","sourceRoot":"","sources":["../../../src/core/importer/lexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type BindingKind = 'variable' | 'function' | 'parameter' | 'loop';
|
|
2
|
+
export interface Binding {
|
|
3
|
+
readonly output: string;
|
|
4
|
+
readonly kind: BindingKind;
|
|
5
|
+
readonly topLevel: boolean;
|
|
6
|
+
/** Bound to a declaration handle, which only `fill` may take. */
|
|
7
|
+
handle: 'plot' | 'level' | undefined;
|
|
8
|
+
/** Never absent on any bar: bound to an input or a literal and never reassigned. */
|
|
9
|
+
present: boolean;
|
|
10
|
+
/** A whole-number constant in the source dialect's sense, which version 5 divides without a fraction. */
|
|
11
|
+
whole: boolean;
|
|
12
|
+
/** A function's parameters, source spelling to output spelling, for its named arguments. */
|
|
13
|
+
labels: ReadonlyMap<string, string> | undefined;
|
|
14
|
+
}
|
|
15
|
+
export declare class Scope {
|
|
16
|
+
readonly names: Map<string, Binding>;
|
|
17
|
+
readonly parent: Scope | undefined;
|
|
18
|
+
constructor(parent: Scope | undefined);
|
|
19
|
+
find(name: string): Binding | undefined;
|
|
20
|
+
get isGlobal(): boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare class Namer {
|
|
23
|
+
#private;
|
|
24
|
+
/** `used` is every identifier the source writes, anywhere. */
|
|
25
|
+
constructor(used: Iterable<string>);
|
|
26
|
+
/** Whether OpenScript already means something by this name. */
|
|
27
|
+
static reserved(name: string): boolean;
|
|
28
|
+
/** A spelling no source name and no OpenScript name has, starting from `base`. */
|
|
29
|
+
fresh(base: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* The spelling of a source name declared in `scope`.
|
|
32
|
+
*
|
|
33
|
+
* `hides` says whether an enclosing scope can already see the name, which is
|
|
34
|
+
* the case the source dialect reads as a new name and OpenScript would read
|
|
35
|
+
* as an update of the old one.
|
|
36
|
+
*/
|
|
37
|
+
declare(name: string, hides: boolean): string;
|
|
38
|
+
}
|
|
39
|
+
/** A binding with the defaults a plain declaration has. */
|
|
40
|
+
export declare function binding(output: string, kind: BindingKind, topLevel: boolean): Binding;
|
|
41
|
+
//# sourceMappingURL=names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../../../src/core/importer/names.ts"],"names":[],"mappings":"AAsBA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;AAEzE,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,iEAAiE;IACjE,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACrC,oFAAoF;IACpF,OAAO,EAAE,OAAO,CAAC;IACjB,yGAAyG;IACzG,KAAK,EAAE,OAAO,CAAC;IACf,4FAA4F;IAC5F,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CACjD;AAKD,qBAAa,KAAK;IAChB,QAAQ,CAAC,KAAK,uBAA8B;IAC5C,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC;gBAEvB,MAAM,EAAE,KAAK,GAAG,SAAS;IAIrC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIvC,IAAI,QAAQ,IAAI,OAAO,CAEtB;CACF;AAED,qBAAa,KAAK;;IAGhB,8DAA8D;gBAClD,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;IAIlC,+DAA+D;IAC/D,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAStC,kFAAkF;IAClF,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAS3B;;;;;;OAMG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM;CAK9C;AAED,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAErF"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scopes, and the name each source name is written as.
|
|
3
|
+
*
|
|
4
|
+
* Two rules of the source dialect differ from OpenScript's, and both are about
|
|
5
|
+
* meaning rather than spelling. A declaration inside a block or a function
|
|
6
|
+
* always makes a new name there, hiding any outer name it shares a spelling
|
|
7
|
+
* with, where OpenScript updates the outer name instead and refuses to hide one
|
|
8
|
+
* (`language.md` 12.2 and 12.3). And the source dialect's built-ins live behind
|
|
9
|
+
* namespaces, so `rsi` or `step` is an ordinary name there and a library name or
|
|
10
|
+
* a reserved word here.
|
|
11
|
+
*
|
|
12
|
+
* So a declaration that would hide a visible name is renamed with a number, and
|
|
13
|
+
* a name OpenScript reserves or defines is renamed with `Value` after it. Every
|
|
14
|
+
* new spelling is checked against every name the source uses anywhere and every
|
|
15
|
+
* name OpenScript has, so a rename can never land on another name. Nothing
|
|
16
|
+
* else is renamed: a name that collides with neither keeps its spelling, and
|
|
17
|
+
* two sibling blocks may both declare it, as both languages allow.
|
|
18
|
+
*/
|
|
19
|
+
import { NAMESPACES, isLibraryName } from '../check/index.js';
|
|
20
|
+
import { canonicalNumber } from '../emit/index.js';
|
|
21
|
+
import { RESERVED_WORDS } from '../tokens/index.js';
|
|
22
|
+
/** Words OpenScript gives a meaning of its own outside the library. */
|
|
23
|
+
const DECLARATION_WORDS = ['study', 'strategy', 'limits', 'version'];
|
|
24
|
+
export class Scope {
|
|
25
|
+
names = new Map();
|
|
26
|
+
parent;
|
|
27
|
+
constructor(parent) {
|
|
28
|
+
this.parent = parent;
|
|
29
|
+
}
|
|
30
|
+
find(name) {
|
|
31
|
+
return this.names.get(name) ?? this.parent?.find(name);
|
|
32
|
+
}
|
|
33
|
+
get isGlobal() {
|
|
34
|
+
return this.parent === undefined;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class Namer {
|
|
38
|
+
#taken;
|
|
39
|
+
/** `used` is every identifier the source writes, anywhere. */
|
|
40
|
+
constructor(used) {
|
|
41
|
+
this.#taken = new Set(used);
|
|
42
|
+
}
|
|
43
|
+
/** Whether OpenScript already means something by this name. */
|
|
44
|
+
static reserved(name) {
|
|
45
|
+
return (RESERVED_WORDS.includes(name) ||
|
|
46
|
+
isLibraryName(name) ||
|
|
47
|
+
NAMESPACES.includes(name) ||
|
|
48
|
+
DECLARATION_WORDS.includes(name));
|
|
49
|
+
}
|
|
50
|
+
/** A spelling no source name and no OpenScript name has, starting from `base`. */
|
|
51
|
+
fresh(base) {
|
|
52
|
+
let candidate = base;
|
|
53
|
+
for (let n = 2; this.#taken.has(candidate) || Namer.reserved(candidate); n += 1) {
|
|
54
|
+
candidate = `${base}${canonicalNumber(n)}`;
|
|
55
|
+
}
|
|
56
|
+
this.#taken.add(candidate);
|
|
57
|
+
return candidate;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The spelling of a source name declared in `scope`.
|
|
61
|
+
*
|
|
62
|
+
* `hides` says whether an enclosing scope can already see the name, which is
|
|
63
|
+
* the case the source dialect reads as a new name and OpenScript would read
|
|
64
|
+
* as an update of the old one.
|
|
65
|
+
*/
|
|
66
|
+
declare(name, hides) {
|
|
67
|
+
if (Namer.reserved(name))
|
|
68
|
+
return this.fresh(`${name}Value`);
|
|
69
|
+
if (hides)
|
|
70
|
+
return this.fresh(name);
|
|
71
|
+
return name;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** A binding with the defaults a plain declaration has. */
|
|
75
|
+
export function binding(output, kind, topLevel) {
|
|
76
|
+
return { output, kind, topLevel, handle: undefined, present: false, whole: false, labels: undefined };
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../../src/core/importer/names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAkBpD,uEAAuE;AACvE,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAErE,MAAM,OAAO,KAAK;IACP,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IACnC,MAAM,CAAoB;IAEnC,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,IAAY;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,KAAK;IACP,MAAM,CAAc;IAE7B,8DAA8D;IAC9D,YAAY,IAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,+DAA+D;IAC/D,MAAM,CAAC,QAAQ,CAAC,IAAY;QAC1B,OAAO,CACJ,cAAoC,CAAC,QAAQ,CAAC,IAAI,CAAC;YACpD,aAAa,CAAC,IAAI,CAAC;YACnB,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;YACzB,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CACjC,CAAC;IACJ,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,IAAY;QAChB,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAChF,SAAS,GAAG,GAAG,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,IAAY,EAAE,KAAc;QAClC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC;QAC5D,IAAI,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,2DAA2D;AAC3D,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,IAAiB,EAAE,QAAiB;IAC1E,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACxG,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Context, OutLine } from './context.js';
|
|
2
|
+
import type { CallExpr } from './syntax.js';
|
|
3
|
+
/** The declaration line, with every option it can carry. */
|
|
4
|
+
export declare function declarationLine(ctx: Context, call: CallExpr, path: string): string;
|
|
5
|
+
export declare function entryLines(ctx: Context, call: CallExpr, path: string, depth: number): OutLine[];
|
|
6
|
+
export declare function closeLines(ctx: Context, call: CallExpr, path: string, depth: number): OutLine[];
|
|
7
|
+
export declare function exitLines(ctx: Context, call: CallExpr, path: string, depth: number): OutLine[];
|
|
8
|
+
//# sourceMappingURL=orders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orders.d.ts","sourceRoot":"","sources":["../../../src/core/importer/orders.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGrD,OAAO,KAAK,EAAO,QAAQ,EAAQ,MAAM,aAAa,CAAC;AA4CvD,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAsHlF;AAmCD,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CA4B/F;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAY/F;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAoC9F"}
|