functionalscript 0.45.0 → 0.46.1
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 +5 -3
- package/fjs/asn.1/module.f.mjs +8 -1
- package/fjs/asn.1/proof.f.d.mts +10 -0
- package/fjs/asn.1/proof.f.mjs +16 -0
- package/fjs/basen/base128/module.f.mjs +22 -5
- package/fjs/bnf/data/module.f.d.mts +32 -6
- package/fjs/bnf/data/module.f.mjs +112 -7
- package/fjs/bnf/data/proof.f.d.mts +2 -0
- package/fjs/bnf/data/proof.f.mjs +74 -3
- package/fjs/bnf/data/types.d.ts +20 -2
- package/fjs/bnf/descent/module.f.d.mts +28 -14
- package/fjs/bnf/descent/module.f.mjs +122 -77
- package/fjs/bnf/descent/proof.f.d.mts +2 -0
- package/fjs/bnf/descent/proof.f.mjs +117 -31
- package/fjs/bnf/descent/types.d.ts +12 -14
- package/fjs/bnf/ll1/module.f.d.mts +64 -22
- package/fjs/bnf/ll1/module.f.mjs +214 -154
- package/fjs/bnf/ll1/proof.f.d.mts +15 -2
- package/fjs/bnf/ll1/proof.f.mjs +323 -149
- package/fjs/bnf/ll1/types.d.ts +16 -24
- package/fjs/bnf/matcher/module.f.d.mts +66 -0
- package/fjs/bnf/matcher/module.f.mjs +81 -0
- package/fjs/bnf/matcher/proof.f.d.mts +10 -0
- package/fjs/bnf/matcher/proof.f.mjs +79 -0
- package/fjs/bnf/matcher/types.d.ts +54 -0
- package/fjs/bnf/testlib.f.d.mts +31 -0
- package/fjs/bnf/testlib.f.mjs +80 -0
- package/fjs/cas/cli/module.f.d.mts +1 -1
- package/fjs/cas/cli/module.f.mjs +14 -20
- package/fjs/cas/cli/proof.f.d.mts +1 -3
- package/fjs/cas/cli/proof.f.mjs +44 -33
- package/fjs/cas/evo/module.f.d.mts +64 -18
- package/fjs/cas/evo/module.f.mjs +148 -70
- package/fjs/cas/evo/proof.f.d.mts +10 -1
- package/fjs/cas/evo/proof.f.mjs +305 -223
- package/fjs/cas/evo/types.d.ts +45 -9
- package/fjs/cas/module.f.d.mts +18 -32
- package/fjs/cas/module.f.mjs +129 -128
- package/fjs/cas/proof.f.d.mts +11 -8
- package/fjs/cas/proof.f.mjs +259 -147
- package/fjs/cas/types.d.ts +24 -10
- package/fjs/ci/config/module.f.d.mts +2 -2
- package/fjs/ci/config/module.f.mjs +2 -2
- package/fjs/ci/module.f.d.mts +5 -5
- package/fjs/ci/module.f.mjs +8 -7
- package/fjs/ci/nix/module.f.d.mts +7 -5
- package/fjs/ci/nix/module.f.mjs +13 -12
- package/fjs/ci/nix/proof.f.mjs +2 -2
- package/fjs/ci/proof.f.mjs +9 -5
- package/fjs/cli/module.f.d.mts +4 -6
- package/fjs/cli/module.f.mjs +4 -8
- package/fjs/cli/proof.f.mjs +17 -16
- package/fjs/cli/types.d.ts +2 -3
- package/fjs/common/monoid/types.d.ts +1 -1
- package/fjs/crypto/hmac/module.f.mjs +2 -2
- package/fjs/crypto/sha2/module.f.mjs +3 -1
- package/fjs/crypto/sha2/proof.f.d.mts +1 -0
- package/fjs/crypto/sha2/proof.f.mjs +24 -0
- package/fjs/crypto/sha2/types.d.ts +11 -0
- package/fjs/crypto/sign/module.f.mjs +2 -2
- package/fjs/dev/module.f.d.mts +13 -4
- package/fjs/dev/module.f.mjs +56 -27
- package/fjs/dev/update/module.f.d.mts +9 -4
- package/fjs/dev/update/module.f.mjs +14 -10
- package/fjs/dev/update/proof.f.d.mts +1 -3
- package/fjs/dev/update/proof.f.mjs +10 -5
- package/fjs/djs/module.f.d.mts +13 -5
- package/fjs/djs/module.f.mjs +31 -16
- package/fjs/djs/parser/module.f.d.mts +13 -3
- package/fjs/djs/parser/module.f.mjs +117 -16
- package/fjs/djs/parser/proof.f.d.mts +5 -1
- package/fjs/djs/parser/proof.f.mjs +274 -12
- package/fjs/djs/parser/types.d.ts +7 -1
- package/fjs/djs/proof.f.d.mts +18 -2
- package/fjs/djs/proof.f.mjs +187 -12
- package/fjs/djs/serializer/module.f.d.mts +25 -8
- package/fjs/djs/serializer/module.f.mjs +61 -15
- package/fjs/djs/serializer/proof.f.d.mts +5 -0
- package/fjs/djs/serializer/proof.f.mjs +23 -1
- package/fjs/djs/tokenizer/module.f.d.mts +17 -5
- package/fjs/djs/tokenizer/module.f.mjs +99 -60
- package/fjs/djs/tokenizer/proof.f.d.mts +1 -1
- package/fjs/djs/tokenizer/proof.f.mjs +74 -67
- package/fjs/djs/transpiler/module.f.d.mts +12 -7
- package/fjs/djs/transpiler/module.f.mjs +82 -56
- package/fjs/djs/transpiler/types.d.ts +7 -3
- package/fjs/djs/types.d.ts +7 -1
- package/fjs/effects/list/module.f.d.mts +14 -11
- package/fjs/effects/list/module.f.mjs +13 -11
- package/fjs/effects/list/types.d.ts +27 -7
- package/fjs/effects/memory/module.f.d.mts +2 -1
- package/fjs/effects/memory/module.f.mjs +3 -4
- package/fjs/effects/memory/proof.f.mjs +13 -7
- package/fjs/effects/memory/types.d.ts +4 -3
- package/fjs/effects/mock/module.f.d.mts +20 -4
- package/fjs/effects/mock/module.f.mjs +37 -5
- package/fjs/effects/mock/types.d.ts +10 -1
- package/fjs/effects/module.d.mts +4 -2
- package/fjs/effects/module.f.d.mts +466 -280
- package/fjs/effects/module.f.mjs +537 -299
- package/fjs/effects/module.mjs +2 -1
- package/fjs/effects/node/memory/module.d.mts +4 -2
- package/fjs/effects/node/memory/module.mjs +6 -3
- package/fjs/effects/node/memory/proof.mjs +10 -4
- package/fjs/effects/node/module.d.mts +4 -3
- package/fjs/effects/node/module.f.d.mts +168 -33
- package/fjs/effects/node/module.f.mjs +256 -52
- package/fjs/effects/node/module.mjs +57 -34
- package/fjs/effects/node/proof.f.d.mts +28 -2
- package/fjs/effects/node/proof.f.mjs +161 -42
- package/fjs/effects/node/types.d.ts +106 -18
- package/fjs/effects/node/virtual/module.f.d.mts +18 -4
- package/fjs/effects/node/virtual/module.f.mjs +110 -68
- package/fjs/effects/node/virtual/proof.f.d.mts +28 -2
- package/fjs/effects/node/virtual/proof.f.mjs +190 -9
- package/fjs/effects/proof.f.d.mts +69 -37
- package/fjs/effects/proof.f.mjs +410 -130
- package/fjs/effects/types.d.ts +161 -33
- package/fjs/emergent_testing/module.f.d.mts +19 -12
- package/fjs/emergent_testing/module.f.mjs +93 -33
- package/fjs/emergent_testing/proof.f.d.mts +21 -7
- package/fjs/emergent_testing/proof.f.mjs +166 -32
- package/fjs/emergent_testing/types.d.ts +22 -4
- package/fjs/fsm/module.f.d.mts +14 -4
- package/fjs/fsm/module.f.mjs +54 -37
- package/fjs/fsm/proof.f.d.mts +2 -0
- package/fjs/fsm/proof.f.mjs +83 -114
- package/fjs/js/keywords/module.f.d.mts +52 -0
- package/fjs/js/keywords/module.f.mjs +72 -0
- package/fjs/js/keywords/proof.f.d.mts +3 -0
- package/fjs/js/keywords/proof.f.mjs +13 -0
- package/fjs/js/tokenizer/module.f.d.mts +26 -6
- package/fjs/js/tokenizer/module.f.mjs +145 -159
- package/fjs/js/tokenizer/proof.f.d.mts +1 -0
- package/fjs/js/tokenizer/proof.f.mjs +54 -24
- package/fjs/js/tokenizer/types.d.ts +33 -24
- package/fjs/mcp/cas/module.f.d.mts +1 -6
- package/fjs/mcp/cas/module.f.mjs +55 -51
- package/fjs/mcp/cas/proof.f.d.mts +15 -0
- package/fjs/mcp/cas/proof.f.mjs +174 -0
- package/fjs/mcp/evo/module.f.d.mts +19 -10
- package/fjs/mcp/evo/module.f.mjs +48 -27
- package/fjs/mcp/evo/proof.f.d.mts +6 -1
- package/fjs/mcp/evo/proof.f.mjs +115 -31
- package/fjs/mcp/module.f.d.mts +4 -4
- package/fjs/mcp/module.f.mjs +6 -6
- package/fjs/mcp/proof.f.d.mts +5 -3
- package/fjs/mcp/proof.f.mjs +112 -46
- package/fjs/media/html/module.f.mjs +1 -1
- package/fjs/media/json/extended/module.f.d.mts +82 -0
- package/fjs/media/json/extended/module.f.mjs +153 -0
- package/fjs/media/json/extended/proof.f.d.mts +42 -0
- package/fjs/media/json/extended/proof.f.mjs +127 -0
- package/fjs/media/json/extended/types.d.ts +23 -0
- package/fjs/media/json/module.f.d.mts +8 -2
- package/fjs/media/json/module.f.mjs +43 -41
- package/fjs/media/json/number/module.f.d.mts +59 -0
- package/fjs/media/json/number/module.f.mjs +136 -0
- package/fjs/media/json/number/proof.f.d.mts +24 -0
- package/fjs/media/json/number/proof.f.mjs +86 -0
- package/fjs/media/json/number/types.d.ts +28 -0
- package/fjs/media/json/parser/module.f.d.mts +25 -13
- package/fjs/media/json/parser/module.f.mjs +114 -70
- package/fjs/media/json/parser/proof.f.d.mts +5 -0
- package/fjs/media/json/parser/proof.f.mjs +31 -1
- package/fjs/media/json/parser/types.d.ts +33 -14
- package/fjs/media/json/rtti/module.f.d.mts +1 -1
- package/fjs/media/json/rtti/module.f.mjs +1 -1
- package/fjs/media/json/rtti/proof.f.mjs +9 -9
- package/fjs/media/json/schema/module.f.mjs +3 -13
- package/fjs/media/json/schema/proof.f.d.mts +0 -1
- package/fjs/media/json/schema/proof.f.mjs +1 -2
- package/fjs/media/json/serializer/module.f.d.mts +32 -1
- package/fjs/media/json/serializer/module.f.mjs +64 -2
- package/fjs/media/json/tokenizer/module.f.mjs +7 -3
- package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
- package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
- package/fjs/media/json/types.d.ts +36 -10
- package/fjs/media/lock/module.f.d.mts +100 -0
- package/fjs/media/lock/module.f.mjs +125 -0
- package/fjs/media/lock/proof.f.d.mts +33 -0
- package/fjs/media/lock/proof.f.mjs +196 -0
- package/fjs/media/lock/types.d.ts +15 -0
- package/fjs/media/module.f.d.mts +6 -5
- package/fjs/media/module.f.mjs +8 -7
- package/fjs/media/note/module.f.d.mts +121 -0
- package/fjs/media/note/module.f.mjs +131 -0
- package/fjs/media/note/proof.f.d.mts +29 -0
- package/fjs/media/note/proof.f.mjs +150 -0
- package/fjs/media/note/types.d.ts +10 -0
- package/fjs/media/proof.f.d.mts +4 -1
- package/fjs/media/proof.f.mjs +40 -21
- package/fjs/media/revision/module.f.d.mts +78 -7
- package/fjs/media/revision/module.f.mjs +119 -12
- package/fjs/media/revision/proof.f.d.mts +10 -0
- package/fjs/media/revision/proof.f.mjs +88 -0
- package/fjs/media/revision/types.d.ts +34 -5
- package/fjs/media/type/module.f.d.mts +33 -15
- package/fjs/media/type/module.f.mjs +35 -29
- package/fjs/media/type/proof.f.d.mts +2 -1
- package/fjs/media/type/proof.f.mjs +30 -10
- package/fjs/module.f.mjs +29 -8
- package/fjs/nanvm/proof.f.mjs +3 -3
- package/fjs/nanvm/rust/module.f.mjs +1 -1
- package/fjs/nanvm/update/module.f.d.mts +4 -4
- package/fjs/nanvm/update/module.f.mjs +8 -9
- package/fjs/nanvm/update/proof.f.mjs +4 -3
- package/fjs/proof.f.d.mts +3 -3
- package/fjs/proof.f.mjs +36 -10
- package/fjs/protocol/json_rpc/module.f.d.mts +2 -2
- package/fjs/protocol/json_rpc/module.f.mjs +3 -3
- package/fjs/protocol/json_rpc/proof.f.mjs +4 -4
- package/fjs/protocol/mcp/module.f.d.mts +10 -13
- package/fjs/protocol/mcp/module.f.mjs +74 -58
- package/fjs/protocol/mcp/proof.f.d.mts +13 -4
- package/fjs/protocol/mcp/proof.f.mjs +193 -61
- package/fjs/protocol/mcp/stdio/module.f.d.mts +15 -7
- package/fjs/protocol/mcp/stdio/module.f.mjs +38 -25
- package/fjs/protocol/mcp/stdio/proof.f.d.mts +4 -2
- package/fjs/protocol/mcp/stdio/proof.f.mjs +45 -12
- package/fjs/protocol/mcp/stdio/types.d.ts +1 -1
- package/fjs/protocol/mcp/types.d.ts +17 -6
- package/fjs/sul/id/module.f.d.mts +0 -1
- package/fjs/sul/id/module.f.mjs +2 -3
- package/fjs/sul/level/hash/module.f.mjs +2 -1
- package/fjs/sul/level/hash/proof.f.mjs +2 -2
- package/fjs/sul/module.f.mjs +18 -13
- package/fjs/text/code_point/module.f.d.mts +8 -0
- package/fjs/text/code_point/module.f.mjs +8 -1
- package/fjs/text/code_point/proof.f.d.mts +1 -0
- package/fjs/text/code_point/proof.f.mjs +11 -0
- package/fjs/text/sgr/module.f.d.mts +4 -6
- package/fjs/text/sgr/module.f.mjs +6 -7
- package/fjs/text/utf16/module.f.mjs +7 -2
- package/fjs/text/utf16/proof.f.mjs +3 -3
- package/fjs/text/utf8/module.f.mjs +4 -2
- package/fjs/types/array/module.f.mjs +14 -2
- package/fjs/types/bit_vec/module.f.d.mts +0 -2
- package/fjs/types/bit_vec/module.f.mjs +46 -32
- package/fjs/types/bit_vec/proof.f.mjs +2 -2
- package/fjs/types/btree/remove/module.f.mjs +1 -1
- package/fjs/types/btree/set/module.f.mjs +9 -11
- package/fjs/types/btree/set/proof.f.mjs +12 -0
- package/fjs/types/byte_set/module.f.d.mts +11 -4
- package/fjs/types/byte_set/module.f.mjs +14 -6
- package/fjs/types/byte_set/proof.f.mjs +7 -7
- package/fjs/types/function/compare/module.f.mjs +10 -3
- package/fjs/types/list/module.f.d.mts +1 -1
- package/fjs/types/list/module.f.mjs +1 -1
- package/fjs/types/nullable/module.f.d.mts +18 -4
- package/fjs/types/nullable/module.f.mjs +21 -4
- package/fjs/types/nullable/proof.f.d.mts +4 -0
- package/fjs/types/nullable/proof.f.mjs +15 -0
- package/fjs/types/object/module.f.d.mts +12 -2
- package/fjs/types/object/module.f.mjs +11 -1
- package/fjs/types/patricia_trie/module.f.mjs +26 -11
- package/fjs/types/result/module.f.d.mts +3 -3
- package/fjs/types/result/module.f.mjs +3 -3
- package/fjs/types/rtti/common/module.f.d.mts +25 -28
- package/fjs/types/rtti/common/module.f.mjs +36 -32
- package/fjs/types/rtti/common/proof.f.mjs +5 -5
- package/fjs/types/rtti/data/module.f.d.mts +14 -0
- package/fjs/types/rtti/data/module.f.mjs +25 -2
- package/fjs/types/rtti/data/proof.f.d.mts +1 -0
- package/fjs/types/rtti/data/proof.f.mjs +25 -2
- package/fjs/types/rtti/parse/module.f.d.mts +24 -14
- package/fjs/types/rtti/parse/module.f.mjs +37 -28
- package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
- package/fjs/types/rtti/parse/proof.f.mjs +33 -14
- package/fjs/types/rtti/proof.f.mjs +3 -1
- package/fjs/types/rtti/ts/module.f.mjs +13 -17
- package/fjs/types/rtti/ts/types.d.ts +14 -1
- package/fjs/types/rtti/validate/module.f.d.mts +81 -19
- package/fjs/types/rtti/validate/module.f.mjs +107 -61
- package/fjs/types/rtti/validate/proof.f.d.mts +13 -10
- package/fjs/types/rtti/validate/proof.f.mjs +186 -197
- package/fjs/types/sorted_set/module.f.d.mts +18 -0
- package/fjs/types/sorted_set/module.f.mjs +22 -0
- package/fjs/types/sorted_set/proof.f.d.mts +1 -0
- package/fjs/types/sorted_set/proof.f.mjs +16 -1
- package/fjs/types/uint8array/module.f.d.mts +1 -1
- package/fjs/types/uint8array/module.f.mjs +1 -1
- package/fjs/website/module.f.d.mts +3 -3
- package/fjs/website/module.f.mjs +4 -7
- package/fjs/website/proof.f.mjs +2 -1
- package/package.json +2 -2
- package/fjs/dev/package_json/module.f.d.mts +0 -39
- package/fjs/dev/package_json/module.f.mjs +0 -40
- package/fjs/dev/package_json/proof.f.d.mts +0 -6
- package/fjs/dev/package_json/proof.f.mjs +0 -32
- package/fjs/effects/eff/module.f.d.mts +0 -20
- package/fjs/effects/eff/module.f.mjs +0 -70
- package/fjs/effects/eff/proof.f.d.mts +0 -15
- package/fjs/effects/eff/proof.f.mjs +0 -69
- package/fjs/effects/eff/types.d.ts +0 -71
- package/fjs/types/rtti/validate/types.d.ts +0 -6
package/fjs/fsm/proof.f.mjs
CHANGED
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @import { Grammar } from './module.f.mjs'
|
|
3
|
+
* @import { ByteSet } from '../types/byte_set/types.ts'
|
|
3
4
|
*/
|
|
4
5
|
|
|
5
|
-
import { dfa, run, toRange
|
|
6
|
-
import { union } from '../types/byte_set/module.f.mjs'
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { identity } from '../types/function/module.f.mjs'
|
|
10
|
-
import { toArray } from '../types/list/module.f.mjs'
|
|
6
|
+
import { dfa, run, toRange } from './module.f.mjs'
|
|
7
|
+
import { one, union, empty, range as byteSetRange } from '../types/byte_set/module.f.mjs'
|
|
8
|
+
import { toKey } from '../types/sorted_set/module.f.mjs'
|
|
9
|
+
import { fold, toArray } from '../types/list/module.f.mjs'
|
|
11
10
|
import { stringToList } from '../text/utf16/module.f.mjs'
|
|
12
|
-
import { assertEq } from '../asserts/module.f.mjs'
|
|
11
|
+
import { assertEq, assertStructurallySame } from '../asserts/module.f.mjs'
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The byte set of a string's characters, used to spell a grammar's punctuation
|
|
16
|
+
* alphabets below. It lives here rather than in `fjs/fsm` or `types/byte_set`:
|
|
17
|
+
* `fjs/fsm` has no use for it, and a `types` leaf taking a *string* would have
|
|
18
|
+
* to depend on `fjs/text` to read one.
|
|
19
|
+
*
|
|
20
|
+
* @type {(s: string) => ByteSet}
|
|
21
|
+
*/
|
|
22
|
+
const toUnion = s =>
|
|
23
|
+
fold((/** @type {number} */i) => (/** @type {ByteSet} */bs) => union(bs)(one(i)))(empty)(stringToList(s))
|
|
15
24
|
|
|
16
25
|
const buildDfa = () => {
|
|
17
26
|
const lowercaseAlpha = toRange('az')
|
|
@@ -39,111 +48,71 @@ const buildDfa = () => {
|
|
|
39
48
|
}
|
|
40
49
|
|
|
41
50
|
export const proof = {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
],
|
|
62
|
-
|
|
63
|
-
'
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
'
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
],
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
51
|
+
toRange: [
|
|
52
|
+
// Two characters name the inclusive range's endpoints.
|
|
53
|
+
() => assertEq(toRange('az'), byteSetRange([0x61, 0x7a])),
|
|
54
|
+
// One character is the singleton range. This threw `RangeError: The
|
|
55
|
+
// number NaN cannot be converted to a BigInt` while `toRange` read a
|
|
56
|
+
// second character that was not there.
|
|
57
|
+
() => assertEq(toRange('a'), byteSetRange([0x61, 0x61])),
|
|
58
|
+
() => assertEq(toRange('a'), one(0x61)),
|
|
59
|
+
() => assertEq(toRange('\0'), one(0)),
|
|
60
|
+
],
|
|
61
|
+
// The expected states are written as the sets they are, keyed through
|
|
62
|
+
// `toKey`, so this proof asserts the automaton and not the key encoding.
|
|
63
|
+
dfa: () => assertStructurallySame(buildDfa(), {
|
|
64
|
+
[toKey([''])]: [
|
|
65
|
+
[toKey([]), 35],
|
|
66
|
+
[toKey(['id']), 36],
|
|
67
|
+
[toKey([]), 47],
|
|
68
|
+
[toKey(['floatBegin', 'int']), 57],
|
|
69
|
+
[toKey([]), 64],
|
|
70
|
+
[toKey(['id']), 90],
|
|
71
|
+
[toKey([]), 94],
|
|
72
|
+
[toKey(['id']), 95],
|
|
73
|
+
[toKey([]), 96],
|
|
74
|
+
[toKey(['id']), 122],
|
|
75
|
+
],
|
|
76
|
+
[toKey(['float'])]: [[toKey([]), 47], [toKey(['float']), 57]],
|
|
77
|
+
[toKey(['floatBegin', 'int'])]: [
|
|
78
|
+
[toKey([]), 45],
|
|
79
|
+
[toKey(['floatDot']), 46],
|
|
80
|
+
[toKey([]), 47],
|
|
81
|
+
[toKey(['floatBegin', 'int']), 57],
|
|
82
|
+
],
|
|
83
|
+
[toKey(['floatDot'])]: [[toKey([]), 47], [toKey(['float']), 57]],
|
|
84
|
+
[toKey(['id'])]: [
|
|
85
|
+
[toKey([]), 35],
|
|
86
|
+
[toKey(['id']), 36],
|
|
87
|
+
[toKey([]), 47],
|
|
88
|
+
[toKey(['id']), 57],
|
|
89
|
+
[toKey([]), 64],
|
|
90
|
+
[toKey(['id']), 90],
|
|
91
|
+
[toKey([]), 94],
|
|
92
|
+
[toKey(['id']), 95],
|
|
93
|
+
[toKey([]), 96],
|
|
94
|
+
[toKey(['id']), 122],
|
|
95
|
+
],
|
|
96
|
+
[toKey([])]: [],
|
|
97
|
+
}),
|
|
88
98
|
run: [
|
|
89
|
-
() =>
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
]
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
'["floatDot"]',
|
|
109
|
-
'["float"]'
|
|
110
|
-
]
|
|
111
|
-
const expectedResult = stringifyIdentity(expectedOutput)
|
|
112
|
-
assertEq(result, expectedResult)
|
|
113
|
-
},
|
|
114
|
-
() => {
|
|
115
|
-
const dfa = buildDfa()
|
|
116
|
-
const input = stringToList('//')
|
|
117
|
-
const result = stringifyIdentity(toArray(run(dfa)(input)))
|
|
118
|
-
|
|
119
|
-
const expectedOutput = [
|
|
120
|
-
'[]',
|
|
121
|
-
'[]'
|
|
122
|
-
]
|
|
123
|
-
const expectedResult = stringifyIdentity(expectedOutput)
|
|
124
|
-
assertEq(result, expectedResult)
|
|
125
|
-
},
|
|
126
|
-
() => {
|
|
127
|
-
const dfa = buildDfa()
|
|
128
|
-
const input = stringToList('::')
|
|
129
|
-
const result = stringifyIdentity(toArray(run(dfa)(input)))
|
|
130
|
-
|
|
131
|
-
const expectedOutput = [
|
|
132
|
-
'[]',
|
|
133
|
-
'[]'
|
|
134
|
-
]
|
|
135
|
-
const expectedResult = stringifyIdentity(expectedOutput)
|
|
136
|
-
assertEq(result, expectedResult)
|
|
137
|
-
},
|
|
138
|
-
() => {
|
|
139
|
-
// `run` accepts any `Dfa` (a `StringMap`, so entries may be
|
|
140
|
-
// missing), not only one built by `dfa()`. A state absent from
|
|
141
|
-
// the map falls back to the empty transition table.
|
|
142
|
-
const result = stringifyIdentity(toArray(run({})(stringToList('a'))))
|
|
143
|
-
|
|
144
|
-
const expectedOutput = ['[]']
|
|
145
|
-
const expectedResult = stringifyIdentity(expectedOutput)
|
|
146
|
-
assertEq(result, expectedResult)
|
|
147
|
-
}
|
|
148
|
-
]
|
|
99
|
+
() => assertStructurallySame(
|
|
100
|
+
toArray(run(buildDfa())(stringToList('a1'))),
|
|
101
|
+
[toKey(['id']), toKey(['id'])]),
|
|
102
|
+
() => assertStructurallySame(
|
|
103
|
+
toArray(run(buildDfa())(stringToList('0.1'))),
|
|
104
|
+
[toKey(['floatBegin', 'int']), toKey(['floatDot']), toKey(['float'])]),
|
|
105
|
+
() => assertStructurallySame(
|
|
106
|
+
toArray(run(buildDfa())(stringToList('//'))),
|
|
107
|
+
[toKey([]), toKey([])]),
|
|
108
|
+
() => assertStructurallySame(
|
|
109
|
+
toArray(run(buildDfa())(stringToList('::'))),
|
|
110
|
+
[toKey([]), toKey([])]),
|
|
111
|
+
// `run` accepts any `Dfa` (a `StringMap`, so entries may be missing),
|
|
112
|
+
// not only one built by `dfa()`. A state absent from the map falls
|
|
113
|
+
// back to the empty transition table.
|
|
114
|
+
() => assertStructurallySame(
|
|
115
|
+
toArray(run({})(stringToList('a'))),
|
|
116
|
+
[toKey([])]),
|
|
117
|
+
],
|
|
149
118
|
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The JavaScript keywords — one source of truth.
|
|
3
|
+
*
|
|
4
|
+
* FunctionalScript is a strict subset of JavaScript: any FunctionalScript
|
|
5
|
+
* program must run the same on JavaScript. Every consumer that decides
|
|
6
|
+
* whether a name is a keyword — the JavaScript and DJS tokenizers, printers
|
|
7
|
+
* that emit identifiers — derives its set from this module instead of
|
|
8
|
+
* keeping a copy, so the sets cannot drift apart.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*
|
|
12
|
+
* @import { Assert } from '../../asserts/types.ts'
|
|
13
|
+
* @import { Equal } from '../../types/ts/types.ts'
|
|
14
|
+
*/
|
|
15
|
+
import type { Assert } from '../../asserts/types.ts';
|
|
16
|
+
import type { Equal } from '../../types/ts/types.ts';
|
|
17
|
+
/**
|
|
18
|
+
* The ECMAScript `ReservedWord` production
|
|
19
|
+
* ([ECMA-262 §12.7.2](https://tc39.es/ecma262/#prod-ReservedWord)) — never
|
|
20
|
+
* usable as identifiers.
|
|
21
|
+
*/
|
|
22
|
+
export declare const reservedWords: readonly ['await', 'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'else', 'enum', 'export', 'extends', 'false', 'finally', 'for', 'function', 'if', 'import', 'in', 'instanceof', 'new', 'null', 'return', 'super', 'switch', 'this', 'throw', 'true', 'try', 'typeof', 'var', 'void', 'while', 'with', 'yield'];
|
|
23
|
+
/**
|
|
24
|
+
* Reserved only in strict-mode code — and every module is strict-mode code,
|
|
25
|
+
* so FunctionalScript treats them exactly like {@link reservedWords}.
|
|
26
|
+
*/
|
|
27
|
+
export declare const strictModeReservedWords: readonly ['implements', 'interface', 'let', 'package', 'private', 'protected', 'public', 'static'];
|
|
28
|
+
/**
|
|
29
|
+
* Not reserved words, but strict-mode code cannot bind, assign, or shadow
|
|
30
|
+
* them.
|
|
31
|
+
*/
|
|
32
|
+
export declare const restrictedNames: readonly ['arguments', 'eval'];
|
|
33
|
+
/**
|
|
34
|
+
* Every name FunctionalScript treats as a keyword, alphabetically: the
|
|
35
|
+
* {@link reservedWords}, the {@link strictModeReservedWords}, the
|
|
36
|
+
* {@link restrictedNames}, and `undefined` — an ordinary global in
|
|
37
|
+
* JavaScript that FunctionalScript keeps as a literal keyword.
|
|
38
|
+
*
|
|
39
|
+
* The proof verifies this list is exactly the sorted union of the groups,
|
|
40
|
+
* and `_KeywordsPinned` ties the two type-level unions together.
|
|
41
|
+
*/
|
|
42
|
+
export declare const keywords: readonly ['arguments', 'await', 'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do', 'else', 'enum', 'eval', 'export', 'extends', 'false', 'finally', 'for', 'function', 'if', 'implements', 'import', 'in', 'instanceof', 'interface', 'let', 'new', 'null', 'package', 'private', 'protected', 'public', 'return', 'static', 'super', 'switch', 'this', 'throw', 'true', 'try', 'typeof', 'undefined', 'var', 'void', 'while', 'with', 'yield'];
|
|
43
|
+
export type _KeywordsPinned = Assert<Equal<typeof keywords[number], typeof reservedWords[number] | typeof strictModeReservedWords[number] | typeof restrictedNames[number] | 'undefined'>>;
|
|
44
|
+
/**
|
|
45
|
+
* @typedef {Assert<Equal<
|
|
46
|
+
* typeof keywords[number],
|
|
47
|
+
* | typeof reservedWords[number]
|
|
48
|
+
* | typeof strictModeReservedWords[number]
|
|
49
|
+
* | typeof restrictedNames[number]
|
|
50
|
+
* | 'undefined'
|
|
51
|
+
* >>} _KeywordsPinned
|
|
52
|
+
*/
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The JavaScript keywords — one source of truth.
|
|
3
|
+
*
|
|
4
|
+
* FunctionalScript is a strict subset of JavaScript: any FunctionalScript
|
|
5
|
+
* program must run the same on JavaScript. Every consumer that decides
|
|
6
|
+
* whether a name is a keyword — the JavaScript and DJS tokenizers, printers
|
|
7
|
+
* that emit identifiers — derives its set from this module instead of
|
|
8
|
+
* keeping a copy, so the sets cannot drift apart.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*
|
|
12
|
+
* @import { Assert } from '../../asserts/types.ts'
|
|
13
|
+
* @import { Equal } from '../../types/ts/types.ts'
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The ECMAScript `ReservedWord` production
|
|
18
|
+
* ([ECMA-262 §12.7.2](https://tc39.es/ecma262/#prod-ReservedWord)) — never
|
|
19
|
+
* usable as identifiers.
|
|
20
|
+
*/
|
|
21
|
+
export const reservedWords = /** @type {const} */ ([
|
|
22
|
+
'await', 'break', 'case', 'catch', 'class', 'const', 'continue',
|
|
23
|
+
'debugger', 'default', 'delete', 'do', 'else', 'enum', 'export',
|
|
24
|
+
'extends', 'false', 'finally', 'for', 'function', 'if', 'import', 'in',
|
|
25
|
+
'instanceof', 'new', 'null', 'return', 'super', 'switch', 'this',
|
|
26
|
+
'throw', 'true', 'try', 'typeof', 'var', 'void', 'while', 'with',
|
|
27
|
+
'yield',
|
|
28
|
+
])
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Reserved only in strict-mode code — and every module is strict-mode code,
|
|
32
|
+
* so FunctionalScript treats them exactly like {@link reservedWords}.
|
|
33
|
+
*/
|
|
34
|
+
export const strictModeReservedWords = /** @type {const} */ ([
|
|
35
|
+
'implements', 'interface', 'let', 'package', 'private', 'protected',
|
|
36
|
+
'public', 'static',
|
|
37
|
+
])
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Not reserved words, but strict-mode code cannot bind, assign, or shadow
|
|
41
|
+
* them.
|
|
42
|
+
*/
|
|
43
|
+
export const restrictedNames = /** @type {const} */ (['arguments', 'eval'])
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Every name FunctionalScript treats as a keyword, alphabetically: the
|
|
47
|
+
* {@link reservedWords}, the {@link strictModeReservedWords}, the
|
|
48
|
+
* {@link restrictedNames}, and `undefined` — an ordinary global in
|
|
49
|
+
* JavaScript that FunctionalScript keeps as a literal keyword.
|
|
50
|
+
*
|
|
51
|
+
* The proof verifies this list is exactly the sorted union of the groups,
|
|
52
|
+
* and `_KeywordsPinned` ties the two type-level unions together.
|
|
53
|
+
*/
|
|
54
|
+
export const keywords = /** @type {const} */ ([
|
|
55
|
+
'arguments', 'await', 'break', 'case', 'catch', 'class', 'const',
|
|
56
|
+
'continue', 'debugger', 'default', 'delete', 'do', 'else', 'enum',
|
|
57
|
+
'eval', 'export', 'extends', 'false', 'finally', 'for', 'function',
|
|
58
|
+
'if', 'implements', 'import', 'in', 'instanceof', 'interface', 'let',
|
|
59
|
+
'new', 'null', 'package', 'private', 'protected', 'public', 'return',
|
|
60
|
+
'static', 'super', 'switch', 'this', 'throw', 'true', 'try', 'typeof',
|
|
61
|
+
'undefined', 'var', 'void', 'while', 'with', 'yield',
|
|
62
|
+
])
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @typedef {Assert<Equal<
|
|
66
|
+
* typeof keywords[number],
|
|
67
|
+
* | typeof reservedWords[number]
|
|
68
|
+
* | typeof strictModeReservedWords[number]
|
|
69
|
+
* | typeof restrictedNames[number]
|
|
70
|
+
* | 'undefined'
|
|
71
|
+
* >>} _KeywordsPinned
|
|
72
|
+
*/
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { assertEq } from '../../asserts/module.f.mjs'
|
|
2
|
+
import { keywords, reservedWords, restrictedNames, strictModeReservedWords } from './module.f.mjs'
|
|
3
|
+
|
|
4
|
+
export const proof = {
|
|
5
|
+
// `keywords` is exactly the sorted union of the groups plus `undefined`
|
|
6
|
+
aggregate: () => {
|
|
7
|
+
/** @type {readonly string[]} */
|
|
8
|
+
const union = [...reservedWords, ...strictModeReservedWords, ...restrictedNames, 'undefined']
|
|
9
|
+
// the names are unique, so the comparator never sees an equal pair
|
|
10
|
+
assertEq(keywords.join(), union.toSorted((a, b) => a < b ? -1 : 1).join())
|
|
11
|
+
assertEq(keywords.length, new Set(keywords).size)
|
|
12
|
+
},
|
|
13
|
+
}
|
|
@@ -1,26 +1,46 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* JavaScript tokenizer built as a range-map state machine over code points,
|
|
3
3
|
* producing tokens for keywords, identifiers, punctuators, comments, strings,
|
|
4
|
-
* and numeric literals
|
|
4
|
+
* and numeric literals.
|
|
5
|
+
*
|
|
6
|
+
* Numeric scanning is lexeme-first: a `number` token carries the exact source
|
|
7
|
+
* text and no derived numeric value, so tokenization stays bounded by the
|
|
8
|
+
* input and never fails because a coefficient or exponent is too large for a
|
|
9
|
+
* runtime numeric type.
|
|
5
10
|
*
|
|
6
11
|
* @module
|
|
7
12
|
*
|
|
8
|
-
* @import { Scan, StateScan } from '../../types/function/operator/types.ts'
|
|
9
|
-
* @import {
|
|
13
|
+
* @import { Reduce, Scan, StateScan } from '../../types/function/operator/types.ts'
|
|
14
|
+
* @import { RangeMerge } from '../../types/range_map/types.ts'
|
|
10
15
|
* @import { List } from '../../types/list/types.ts'
|
|
11
16
|
* @import { Entry } from '../../types/ordered_map/types.ts'
|
|
12
17
|
* @import { Range as NumberRange } from '../../types/range/types.ts'
|
|
13
|
-
* @import {
|
|
18
|
+
* @import { JsToken, TokenMetadata, JsTokenWithMetadata, _TokenizerStateWithMetadata, _TokenizerState, _ErrorMessage, _InitialState, _ParseIdState, _ParseWhitespaceState, _ParseNewLineState, _ParseStringState, _ParseEscapeCharState, _ParseOperatorState, _ParseCommentState, _ParseUnicodeCharState, _ParseNumberState, _InvalidNumberState, _EofState, _CharCodeOrEof, _ToToken, _CreateToToken, _RangeFunc, _RangeMapToToken, TriviaKind, } from './types.ts'
|
|
14
19
|
*/
|
|
15
20
|
import type { List } from '../../types/list/types.ts';
|
|
16
|
-
import type { JsToken, JsTokenWithMetadata } from './types.ts';
|
|
21
|
+
import type { JsToken, JsTokenWithMetadata, TriviaKind } from './types.ts';
|
|
17
22
|
/** @type {(token: JsToken) => boolean} */
|
|
18
23
|
export declare const isKeywordToken: (token: JsToken) => boolean;
|
|
24
|
+
/**
|
|
25
|
+
* The coalescing rule for whitespace/newline trivia: a maximal run collapses
|
|
26
|
+
* to a single token, and a run containing any newline is an `nl`. Equal kinds
|
|
27
|
+
* coalesce; `nl` absorbs `ws`.
|
|
28
|
+
*
|
|
29
|
+
* Exported because `fjs/djs/tokenizer` produces the same token stream and must
|
|
30
|
+
* agree byte for byte — its scanner reaches the same four decisions from
|
|
31
|
+
* grammar tags. This module defines `JsToken`, so the rule is stated here once
|
|
32
|
+
* rather than re-derived on each side with only the proofs to catch a drift.
|
|
33
|
+
*
|
|
34
|
+
* @type {(a: TriviaKind, b: TriviaKind) => TriviaKind}
|
|
35
|
+
*/
|
|
36
|
+
export declare const mergeTrivia: (a: TriviaKind, b: TriviaKind) => TriviaKind;
|
|
19
37
|
/** @type {(input: List<number>) => (path: string) => List<JsTokenWithMetadata>} */
|
|
20
38
|
export declare const tokenize: (input: List<number>) => (path: string) => List<JsTokenWithMetadata>;
|
|
21
39
|
export declare const proof: {
|
|
22
40
|
getOperatorTokenInvalid: () => void;
|
|
41
|
+
tokenizeCharCodeOpAfterEof: () => void;
|
|
42
|
+
tokenizeEofOpAfterEof: () => void;
|
|
23
43
|
throw: {
|
|
24
|
-
unionConflict: () =>
|
|
44
|
+
unionConflict: () => number;
|
|
25
45
|
};
|
|
26
46
|
};
|