functionalscript 0.44.0 → 0.46.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/README.md +5 -3
- package/fjs/asn.1/module.f.mjs +8 -1
- package/fjs/asn.1/proof.f.d.mts +15 -0
- package/fjs/asn.1/proof.f.mjs +31 -3
- package/fjs/asserts/module.f.d.mts +14 -0
- package/fjs/asserts/module.f.mjs +20 -0
- package/fjs/asserts/proof.f.d.mts +3 -0
- package/fjs/asserts/proof.f.mjs +15 -1
- package/fjs/basen/base128/module.f.mjs +22 -5
- package/fjs/basen/base128/proof.f.d.mts +3 -1
- package/fjs/basen/base128/proof.f.mjs +3 -1
- package/fjs/basen/base64/module.f.mjs +7 -3
- package/fjs/basen/base64/proof.f.d.mts +3 -1
- package/fjs/basen/base64/proof.f.mjs +7 -4
- package/fjs/basen/cbase32/proof.f.d.mts +3 -1
- package/fjs/basen/cbase32/proof.f.mjs +3 -1
- 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 -4
- package/fjs/bnf/data/types.d.ts +20 -2
- package/fjs/bnf/descent/module.f.d.mts +34 -5
- package/fjs/bnf/descent/module.f.mjs +176 -54
- package/fjs/bnf/descent/proof.f.d.mts +3 -0
- package/fjs/bnf/descent/proof.f.mjs +189 -27
- package/fjs/bnf/descent/types.d.ts +24 -18
- package/fjs/bnf/ll1/module.f.d.mts +74 -6
- package/fjs/bnf/ll1/module.f.mjs +297 -95
- package/fjs/bnf/ll1/proof.f.d.mts +17 -2
- package/fjs/bnf/ll1/proof.f.mjs +372 -137
- package/fjs/bnf/ll1/types.d.ts +25 -27
- 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/module.f.d.mts +15 -6
- package/fjs/bnf/module.f.mjs +52 -11
- package/fjs/bnf/proof.f.d.mts +2 -0
- package/fjs/bnf/proof.f.mjs +79 -3
- package/fjs/bnf/testlib.f.d.mts +31 -0
- package/fjs/bnf/testlib.f.mjs +80 -0
- package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
- package/fjs/bnf/token_symbol/module.f.mjs +7 -6
- package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
- package/fjs/bnf/token_symbol/types.d.ts +2 -2
- package/fjs/bnf/types.d.ts +10 -3
- 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 +4 -4
- package/fjs/cas/cli/proof.f.mjs +47 -34
- package/fjs/cas/evo/module.f.d.mts +71 -31
- package/fjs/cas/evo/module.f.mjs +223 -138
- package/fjs/cas/evo/proof.f.d.mts +10 -1
- package/fjs/cas/evo/proof.f.mjs +311 -226
- package/fjs/cas/evo/types.d.ts +45 -9
- package/fjs/cas/module.f.d.mts +18 -32
- package/fjs/cas/module.f.mjs +164 -176
- 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/common/module.f.d.mts +1 -1
- package/fjs/ci/common/module.f.mjs +1 -0
- package/fjs/ci/config/module.f.d.mts +3 -3
- package/fjs/ci/config/module.f.mjs +3 -3
- 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.d.mts +2 -0
- package/fjs/ci/nix/proof.f.mjs +4 -4
- package/fjs/ci/proof.f.d.mts +4 -2
- package/fjs/ci/proof.f.mjs +13 -8
- package/fjs/cli/module.f.d.mts +4 -6
- package/fjs/cli/module.f.mjs +4 -8
- package/fjs/cli/proof.f.d.mts +4 -2
- package/fjs/cli/proof.f.mjs +21 -18
- package/fjs/cli/types.d.ts +2 -3
- package/fjs/common/monoid/module.f.d.mts +70 -12
- package/fjs/common/monoid/module.f.mjs +177 -14
- package/fjs/common/monoid/proof.f.d.mts +12 -1
- package/fjs/common/monoid/proof.f.mjs +88 -4
- package/fjs/common/monoid/types.d.ts +23 -0
- package/fjs/crypto/hmac/module.f.mjs +2 -2
- package/fjs/crypto/secp/proof.f.d.mts +3 -1
- package/fjs/crypto/secp/proof.f.mjs +3 -1
- package/fjs/crypto/sha2/module.f.mjs +3 -1
- package/fjs/crypto/sha2/proof.f.d.mts +4 -1
- package/fjs/crypto/sha2/proof.f.mjs +27 -1
- package/fjs/crypto/sha2/types.d.ts +11 -0
- package/fjs/crypto/sign/module.f.mjs +2 -2
- package/fjs/crypto/vdf/module.f.d.mts +23 -4
- package/fjs/crypto/vdf/module.f.mjs +6 -4
- package/fjs/dev/module.f.d.mts +17 -5
- package/fjs/dev/module.f.mjs +60 -30
- package/fjs/dev/update/module.f.d.mts +11 -3
- package/fjs/dev/update/module.f.mjs +16 -11
- package/fjs/dev/update/proof.f.d.mts +4 -3
- package/fjs/dev/update/proof.f.mjs +11 -7
- 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 +16 -3
- package/fjs/djs/parser/module.f.mjs +135 -16
- package/fjs/djs/parser/proof.f.d.mts +8 -1
- package/fjs/djs/parser/proof.f.mjs +287 -13
- package/fjs/djs/parser/types.d.ts +7 -1
- package/fjs/djs/proof.f.d.mts +20 -1
- package/fjs/djs/proof.f.mjs +190 -12
- package/fjs/djs/serializer/module.f.d.mts +25 -8
- package/fjs/djs/serializer/module.f.mjs +66 -19
- 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 +120 -73
- package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
- package/fjs/djs/tokenizer/proof.f.mjs +86 -67
- package/fjs/djs/transpiler/module.f.d.mts +13 -19
- package/fjs/djs/transpiler/module.f.mjs +79 -72
- package/fjs/djs/transpiler/types.d.ts +29 -0
- package/fjs/djs/types.d.ts +7 -1
- package/fjs/effects/list/module.f.d.mts +23 -12
- package/fjs/effects/list/module.f.mjs +16 -12
- package/fjs/effects/list/types.d.ts +27 -7
- package/fjs/effects/memory/module.f.d.mts +6 -3
- package/fjs/effects/memory/module.f.mjs +7 -7
- package/fjs/effects/memory/proof.f.d.mts +4 -0
- package/fjs/effects/memory/proof.f.mjs +18 -9
- package/fjs/effects/memory/types.d.ts +4 -3
- package/fjs/effects/mock/module.f.d.mts +28 -4
- package/fjs/effects/mock/module.f.mjs +39 -5
- package/fjs/effects/mock/types.d.ts +10 -1
- package/fjs/effects/module.d.mts +12 -2
- package/fjs/effects/module.f.d.mts +469 -281
- package/fjs/effects/module.f.mjs +538 -299
- package/fjs/effects/module.mjs +11 -2
- package/fjs/effects/node/memory/module.d.mts +7 -2
- package/fjs/effects/node/memory/module.mjs +9 -5
- package/fjs/effects/node/memory/proof.d.mts +2 -0
- package/fjs/effects/node/memory/proof.mjs +12 -5
- package/fjs/effects/node/module.d.mts +8 -2
- package/fjs/effects/node/module.f.d.mts +183 -43
- package/fjs/effects/node/module.f.mjs +260 -62
- package/fjs/effects/node/module.mjs +61 -50
- 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 +21 -4
- package/fjs/effects/node/virtual/module.f.mjs +113 -70
- package/fjs/effects/node/virtual/proof.f.d.mts +31 -2
- package/fjs/effects/node/virtual/proof.f.mjs +201 -8
- package/fjs/effects/proof.f.d.mts +69 -34
- package/fjs/effects/proof.f.mjs +413 -130
- package/fjs/effects/types.d.ts +161 -33
- package/fjs/emergent_testing/all.test.d.mts +8 -0
- package/fjs/emergent_testing/all.test.mjs +14 -0
- package/fjs/emergent_testing/module.f.d.mts +22 -10
- package/fjs/emergent_testing/module.f.mjs +119 -85
- package/fjs/emergent_testing/proof.f.d.mts +21 -7
- package/fjs/emergent_testing/proof.f.mjs +169 -35
- package/fjs/emergent_testing/types.d.ts +22 -4
- package/fjs/fsc/bnf.f.d.mts +3 -0
- package/fjs/fsc/bnf.f.mjs +4 -1
- package/fjs/fsc/json.f.d.mts +3 -0
- package/fjs/fsc/json.f.mjs +4 -1
- package/fjs/fsc/module.f.d.mts +9 -0
- package/fjs/fsc/module.f.mjs +5 -3
- package/fjs/fsm/module.f.d.mts +14 -4
- package/fjs/fsm/module.f.mjs +54 -37
- package/fjs/fsm/proof.f.d.mts +5 -0
- package/fjs/fsm/proof.f.mjs +87 -115
- package/fjs/js/keywords/module.f.d.mts +52 -0
- package/fjs/js/keywords/module.f.mjs +72 -0
- package/fjs/{emergent_testing/scenarios/return-value.pass.d.ts → js/keywords/proof.f.d.mts} +1 -1
- package/fjs/js/keywords/proof.f.mjs +13 -0
- package/fjs/js/tokenizer/module.f.d.mts +30 -3
- package/fjs/js/tokenizer/module.f.mjs +161 -211
- 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 +39 -4
- package/fjs/mcp/module.f.mjs +14 -12
- package/fjs/mcp/proof.f.d.mts +13 -1
- package/fjs/mcp/proof.f.mjs +120 -61
- package/fjs/media/html/module.f.d.mts +12 -0
- package/fjs/media/html/module.f.mjs +7 -5
- package/fjs/media/html/proof.f.d.mts +3 -0
- package/fjs/media/html/proof.f.mjs +4 -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 +133 -72
- 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 +38 -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.d.mts +3 -0
- package/fjs/media/json/rtti/proof.f.mjs +12 -12
- package/fjs/media/json/schema/module.f.d.mts +61 -27
- package/fjs/media/json/schema/module.f.mjs +218 -63
- package/fjs/media/json/schema/proof.f.d.mts +41 -1
- package/fjs/media/json/schema/proof.f.mjs +220 -9
- package/fjs/media/json/serializer/module.f.d.mts +44 -0
- package/fjs/media/json/serializer/module.f.mjs +71 -9
- package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
- package/fjs/media/json/tokenizer/module.f.mjs +31 -8
- 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/nix/module.f.d.mts +13 -0
- package/fjs/media/nix/module.f.mjs +4 -2
- package/fjs/media/nix/proof.f.d.mts +3 -0
- package/fjs/media/nix/proof.f.mjs +4 -1
- 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 +83 -7
- package/fjs/media/revision/module.f.mjs +127 -23
- package/fjs/media/revision/proof.f.d.mts +14 -0
- package/fjs/media/revision/proof.f.mjs +93 -2
- package/fjs/media/revision/types.d.ts +34 -5
- package/fjs/media/type/module.f.d.mts +53 -18
- package/fjs/media/type/module.f.mjs +87 -97
- package/fjs/media/type/proof.f.d.mts +17 -0
- package/fjs/media/type/proof.f.mjs +73 -13
- package/fjs/module.d.mts +5 -0
- package/fjs/module.f.d.mts +8 -0
- package/fjs/module.f.mjs +33 -10
- package/fjs/module.mjs +6 -0
- 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/path/module.f.d.mts +8 -0
- package/fjs/path/module.f.mjs +4 -2
- package/fjs/proof.f.d.mts +7 -3
- package/fjs/proof.f.mjs +41 -12
- package/fjs/protocol/json_rpc/module.f.d.mts +3 -3
- package/fjs/protocol/json_rpc/module.f.mjs +10 -7
- package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
- package/fjs/protocol/json_rpc/proof.f.mjs +26 -5
- 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 +16 -3
- package/fjs/protocol/mcp/proof.f.mjs +224 -69
- package/fjs/protocol/mcp/stdio/module.f.d.mts +17 -11
- package/fjs/protocol/mcp/stdio/module.f.mjs +39 -33
- package/fjs/protocol/mcp/stdio/proof.f.d.mts +5 -3
- package/fjs/protocol/mcp/stdio/proof.f.mjs +46 -13
- package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
- package/fjs/protocol/mcp/types.d.ts +17 -6
- package/fjs/sul/id/module.f.d.mts +4 -0
- package/fjs/sul/id/module.f.mjs +6 -6
- package/fjs/sul/level/hash/module.f.d.mts +4 -1
- package/fjs/sul/level/hash/module.f.mjs +6 -4
- package/fjs/sul/level/hash/proof.f.d.mts +4 -0
- package/fjs/sul/level/hash/proof.f.mjs +7 -4
- package/fjs/sul/level/literal/module.f.d.mts +4 -1
- package/fjs/sul/level/literal/module.f.mjs +4 -3
- package/fjs/sul/level/literal/proof.f.d.mts +3 -0
- package/fjs/sul/level/literal/proof.f.mjs +4 -1
- package/fjs/sul/module.f.d.mts +5 -3
- package/fjs/sul/module.f.mjs +23 -17
- package/fjs/sul/proof.f.d.mts +4 -0
- package/fjs/sul/proof.f.mjs +5 -2
- package/fjs/text/ascii/module.f.d.mts +26 -0
- package/fjs/text/ascii/module.f.mjs +49 -1
- package/fjs/text/ascii/proof.f.d.mts +10 -0
- package/fjs/text/ascii/proof.f.mjs +33 -1
- package/fjs/text/code_point/module.f.d.mts +29 -3
- package/fjs/text/code_point/module.f.mjs +32 -9
- package/fjs/text/code_point/proof.f.d.mts +2 -0
- package/fjs/text/code_point/proof.f.mjs +39 -0
- package/fjs/text/module.f.d.mts +4 -2
- package/fjs/text/module.f.mjs +4 -3
- package/fjs/text/proof.f.d.mts +3 -0
- package/fjs/text/proof.f.mjs +4 -1
- package/fjs/text/sgr/module.f.d.mts +6 -5
- package/fjs/text/sgr/module.f.mjs +8 -8
- package/fjs/text/sgr/proof.f.d.mts +3 -0
- package/fjs/text/sgr/proof.f.mjs +4 -1
- package/fjs/text/utf16/module.f.d.mts +5 -1
- package/fjs/text/utf16/module.f.mjs +38 -35
- package/fjs/text/utf16/proof.f.d.mts +3 -1
- package/fjs/text/utf16/proof.f.mjs +19 -2
- package/fjs/text/utf8/module.f.d.mts +9 -5
- package/fjs/text/utf8/module.f.mjs +20 -20
- package/fjs/types/array/module.f.d.mts +2 -1
- package/fjs/types/array/module.f.mjs +16 -4
- package/fjs/types/bigfloat/module.f.d.mts +21 -1
- package/fjs/types/bigfloat/module.f.mjs +33 -7
- package/fjs/types/bigfloat/proof.f.d.mts +1 -0
- package/fjs/types/bigfloat/proof.f.mjs +46 -0
- package/fjs/types/bigint/module.f.d.mts +4 -0
- package/fjs/types/bigint/module.f.mjs +4 -3
- package/fjs/types/bit_vec/module.f.d.mts +10 -16
- package/fjs/types/bit_vec/module.f.mjs +99 -95
- package/fjs/types/bit_vec/proof.f.d.mts +6 -0
- package/fjs/types/bit_vec/proof.f.mjs +31 -5
- package/fjs/types/btree/find/module.f.d.mts +5 -1
- package/fjs/types/btree/find/module.f.mjs +5 -5
- package/fjs/types/btree/find/proof.f.d.mts +5 -1
- package/fjs/types/btree/find/proof.f.mjs +5 -3
- package/fjs/types/btree/module.f.d.mts +3 -0
- package/fjs/types/btree/module.f.mjs +3 -2
- package/fjs/types/btree/proof.f.d.mts +5 -1
- package/fjs/types/btree/proof.f.mjs +5 -3
- package/fjs/types/btree/remove/module.f.d.mts +11 -0
- package/fjs/types/btree/remove/module.f.mjs +10 -10
- package/fjs/types/btree/remove/proof.f.d.mts +3 -0
- package/fjs/types/btree/remove/proof.f.mjs +4 -1
- package/fjs/types/btree/set/module.f.d.mts +9 -0
- package/fjs/types/btree/set/module.f.mjs +14 -17
- package/fjs/types/btree/set/proof.f.d.mts +3 -0
- package/fjs/types/btree/set/proof.f.mjs +16 -1
- package/fjs/types/btree/types/module.f.d.mts +2 -1
- package/fjs/types/btree/types/module.f.mjs +2 -1
- package/fjs/types/byte_set/module.f.d.mts +20 -4
- package/fjs/types/byte_set/module.f.mjs +18 -8
- package/fjs/types/byte_set/proof.f.d.mts +3 -1
- package/fjs/types/byte_set/proof.f.mjs +10 -8
- package/fjs/types/function/compare/module.f.d.mts +3 -2
- package/fjs/types/function/compare/module.f.mjs +13 -5
- package/fjs/types/function/module.f.d.mts +8 -1
- package/fjs/types/function/module.f.mjs +8 -1
- package/fjs/types/function/operator/module.f.d.mts +2 -1
- package/fjs/types/function/operator/module.f.mjs +2 -2
- package/fjs/types/list/module.f.d.mts +10 -3
- package/fjs/types/list/module.f.mjs +6 -4
- package/fjs/types/list/proof.f.d.mts +4 -1
- package/fjs/types/list/proof.f.mjs +4 -2
- package/fjs/types/nibble_set/module.f.d.mts +2 -1
- package/fjs/types/nibble_set/module.f.mjs +2 -2
- package/fjs/types/nominal/module.f.d.mts +2 -1
- package/fjs/types/nominal/module.f.mjs +2 -1
- package/fjs/types/nullable/module.f.d.mts +26 -6
- package/fjs/types/nullable/module.f.mjs +25 -6
- package/fjs/types/nullable/proof.f.d.mts +4 -0
- package/fjs/types/nullable/proof.f.mjs +15 -0
- package/fjs/types/number/module.f.d.mts +4 -0
- package/fjs/types/number/module.f.mjs +4 -3
- package/fjs/types/object/module.f.d.mts +26 -4
- package/fjs/types/object/module.f.mjs +26 -7
- package/fjs/types/object/proof.f.d.mts +5 -2
- package/fjs/types/object/proof.f.mjs +6 -3
- package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
- package/fjs/types/object/structurally_same/module.f.mjs +59 -0
- package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
- package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
- package/fjs/types/ordered_map/module.f.d.mts +5 -0
- package/fjs/types/ordered_map/module.f.mjs +5 -4
- package/fjs/types/ordered_map/proof.f.d.mts +3 -0
- package/fjs/types/ordered_map/proof.f.mjs +4 -1
- package/fjs/types/patricia_trie/module.f.d.mts +2 -1
- package/fjs/types/patricia_trie/module.f.mjs +27 -12
- package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
- package/fjs/types/patricia_trie/proof.f.mjs +4 -1
- package/fjs/types/prime_field/module.f.d.mts +3 -1
- package/fjs/types/prime_field/module.f.mjs +3 -2
- package/fjs/types/range/module.f.d.mts +2 -1
- package/fjs/types/range/module.f.mjs +2 -2
- package/fjs/types/range_map/module.f.d.mts +6 -0
- package/fjs/types/range_map/module.f.mjs +6 -9
- package/fjs/types/range_map/proof.f.d.mts +5 -1
- package/fjs/types/range_map/proof.f.mjs +5 -3
- package/fjs/types/range_set/module.f.d.mts +5 -0
- package/fjs/types/range_set/module.f.mjs +1 -0
- package/fjs/types/range_set/proof.f.d.mts +3 -0
- package/fjs/types/range_set/proof.f.mjs +4 -1
- package/fjs/types/result/module.d.mts +8 -0
- package/fjs/types/result/module.f.d.mts +37 -7
- package/fjs/types/result/module.f.mjs +38 -8
- package/fjs/types/result/module.mjs +9 -1
- package/fjs/types/result/proof.f.d.mts +5 -0
- package/fjs/types/result/proof.f.mjs +22 -2
- package/fjs/types/rtti/common/module.f.d.mts +44 -14
- package/fjs/types/rtti/common/module.f.mjs +42 -36
- package/fjs/types/rtti/common/proof.f.d.mts +4 -0
- package/fjs/types/rtti/common/proof.f.mjs +10 -7
- package/fjs/types/rtti/data/module.f.d.mts +134 -0
- package/fjs/types/rtti/data/module.f.mjs +1053 -0
- package/fjs/types/rtti/data/proof.f.d.mts +76 -0
- package/fjs/types/rtti/data/proof.f.mjs +589 -0
- package/fjs/types/rtti/data/types.d.ts +83 -0
- package/fjs/types/rtti/module.f.d.mts +12 -5
- package/fjs/types/rtti/module.f.mjs +7 -5
- package/fjs/types/rtti/parse/module.f.d.mts +48 -0
- package/fjs/types/rtti/parse/module.f.mjs +45 -34
- package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
- package/fjs/types/rtti/parse/proof.f.mjs +51 -52
- package/fjs/types/rtti/proof.f.d.mts +3 -1
- package/fjs/types/rtti/proof.f.mjs +6 -2
- package/fjs/types/rtti/ts/module.f.d.mts +68 -9
- package/fjs/types/rtti/ts/module.f.mjs +258 -30
- package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
- package/fjs/types/rtti/ts/proof.f.mjs +152 -4
- package/fjs/types/rtti/ts/types.d.ts +25 -1
- package/fjs/types/rtti/types.d.ts +40 -0
- package/fjs/types/sorted_list/module.f.d.mts +4 -1
- package/fjs/types/sorted_list/module.f.mjs +21 -12
- package/fjs/types/sorted_list/proof.f.d.mts +3 -1
- package/fjs/types/sorted_list/proof.f.mjs +3 -1
- package/fjs/types/sorted_set/module.f.d.mts +49 -1
- package/fjs/types/sorted_set/module.f.mjs +26 -2
- package/fjs/types/sorted_set/proof.f.d.mts +4 -1
- package/fjs/types/sorted_set/proof.f.mjs +19 -2
- package/fjs/types/string/module.f.d.mts +4 -0
- package/fjs/types/string/module.f.mjs +4 -3
- package/fjs/types/string_set/module.f.d.mts +3 -1
- package/fjs/types/string_set/module.f.mjs +3 -2
- package/fjs/types/ts/module.f.d.mts +2 -0
- package/fjs/types/ts/module.f.mjs +3 -3
- package/fjs/types/ts/proof.f.d.mts +1 -0
- package/fjs/types/ts/proof.f.mjs +5 -0
- package/fjs/types/ts/types.d.ts +6 -1
- package/fjs/types/uint8array/module.f.d.mts +13 -2
- package/fjs/types/uint8array/module.f.mjs +20 -15
- package/fjs/website/module.f.d.mts +5 -2
- package/fjs/website/module.f.mjs +6 -8
- package/fjs/website/proof.f.mjs +2 -1
- package/package.json +3 -3
- package/fjs/asn.1/types.js +0 -6
- package/fjs/asserts/types.js +0 -6
- package/fjs/basen/types.js +0 -6
- package/fjs/bnf/data/types.js +0 -6
- package/fjs/bnf/descent/types.js +0 -6
- package/fjs/bnf/ll1/types.js +0 -6
- package/fjs/bnf/token_symbol/types.js +0 -6
- package/fjs/bnf/types.js +0 -6
- package/fjs/cas/evo/types.js +0 -7
- package/fjs/cas/types.js +0 -6
- package/fjs/ci/common/types.js +0 -1
- package/fjs/ci/nix/types.js +0 -6
- package/fjs/ci/types.js +0 -6
- package/fjs/cli/types.js +0 -6
- package/fjs/common/monoid/types.js +0 -6
- package/fjs/crypto/pow/types.js +0 -6
- package/fjs/crypto/secp/types.js +0 -6
- package/fjs/crypto/sha2/types.js +0 -6
- package/fjs/crypto/sign/types.js +0 -6
- package/fjs/crypto/vdf/types.js +0 -6
- package/fjs/dev/package_json/module.f.d.mts +0 -32
- package/fjs/dev/package_json/module.f.mjs +0 -37
- package/fjs/dev/package_json/proof.f.d.mts +0 -6
- package/fjs/dev/package_json/proof.f.mjs +0 -32
- package/fjs/dev/types.js +0 -6
- package/fjs/djs/ast/types.js +0 -8
- package/fjs/djs/parser/types.js +0 -7
- package/fjs/djs/tokenizer/types.js +0 -7
- package/fjs/djs/types.js +0 -7
- package/fjs/effects/eff/module.f.d.mts +0 -10
- package/fjs/effects/eff/module.f.mjs +0 -68
- package/fjs/effects/eff/proof.f.d.mts +0 -12
- package/fjs/effects/eff/proof.f.mjs +0 -66
- package/fjs/effects/eff/types.d.ts +0 -71
- package/fjs/effects/eff/types.js +0 -6
- package/fjs/effects/list/types.js +0 -6
- package/fjs/effects/memory/types.js +0 -6
- package/fjs/effects/mock/types.js +0 -6
- package/fjs/effects/node/types.js +0 -6
- package/fjs/effects/node/virtual/types.js +0 -7
- package/fjs/effects/types.js +0 -6
- package/fjs/emergent_testing/all.test.d.ts +0 -1
- package/fjs/emergent_testing/all.test.js +0 -5
- package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
- package/fjs/emergent_testing/scenarios/all.js +0 -1
- package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
- package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
- package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
- package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
- package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
- package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
- package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
- package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
- package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
- package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
- package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
- package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
- package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
- package/fjs/emergent_testing/types.js +0 -6
- package/fjs/js/tokenizer/types.js +0 -6
- package/fjs/media/html/types.js +0 -6
- package/fjs/media/json/parser/types.js +0 -6
- package/fjs/media/json/tokenizer/types.js +0 -6
- package/fjs/media/json/types.js +0 -13
- package/fjs/media/nix/types.js +0 -6
- package/fjs/media/revision/types.js +0 -8
- package/fjs/media/type/types.js +0 -6
- package/fjs/media/types.js +0 -7
- package/fjs/nanvm/types.js +0 -11
- package/fjs/protocol/json_rpc/types.js +0 -8
- package/fjs/protocol/mcp/types.js +0 -8
- package/fjs/sul/id/types.js +0 -6
- package/fjs/sul/level/hash/types.js +0 -6
- package/fjs/sul/level/literal/types.js +0 -6
- package/fjs/sul/types.js +0 -6
- package/fjs/text/sgr/types.js +0 -6
- package/fjs/text/types.js +0 -6
- package/fjs/text/utf16/types.js +0 -6
- package/fjs/text/utf8/types.js +0 -6
- package/fjs/types/array/types.js +0 -6
- package/fjs/types/bigfloat/types.js +0 -6
- package/fjs/types/bigint/types.js +0 -6
- package/fjs/types/bit_vec/types.js +0 -6
- package/fjs/types/btree/find/types.js +0 -6
- package/fjs/types/btree/types/types.js +0 -6
- package/fjs/types/byte_set/types.js +0 -6
- package/fjs/types/function/compare/types.js +0 -6
- package/fjs/types/function/operator/types.js +0 -6
- package/fjs/types/function/types.js +0 -6
- package/fjs/types/list/types.js +0 -6
- package/fjs/types/nibble_set/types.js +0 -6
- package/fjs/types/nominal/types.js +0 -6
- package/fjs/types/nullable/types.js +0 -6
- package/fjs/types/object/types.js +0 -8
- package/fjs/types/option/types.js +0 -6
- package/fjs/types/ordered_map/types.js +0 -6
- package/fjs/types/patricia_trie/types.js +0 -6
- package/fjs/types/phantom/types.js +0 -11
- package/fjs/types/prime_field/types.js +0 -6
- package/fjs/types/range/types.js +0 -6
- package/fjs/types/range_map/types.js +0 -6
- package/fjs/types/result/types.js +0 -6
- package/fjs/types/rtti/common/types.js +0 -1
- package/fjs/types/rtti/parse/types.js +0 -1
- package/fjs/types/rtti/ts/types.js +0 -1
- package/fjs/types/rtti/types.js +0 -1
- package/fjs/types/rtti/validate/module.f.d.mts +0 -6
- package/fjs/types/rtti/validate/module.f.mjs +0 -169
- package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
- package/fjs/types/rtti/validate/proof.f.mjs +0 -437
- package/fjs/types/rtti/validate/types.d.ts +0 -6
- package/fjs/types/rtti/validate/types.js +0 -1
- package/fjs/types/sorted_list/types.js +0 -6
- package/fjs/types/sorted_set/types.js +0 -6
- package/fjs/types/string_set/types.js +0 -6
- package/fjs/types/ts/types.js +0 -8
|
@@ -2,16 +2,17 @@
|
|
|
2
2
|
* @module
|
|
3
3
|
*
|
|
4
4
|
* @import { CodePoint } from '../../text/utf16/types.ts'
|
|
5
|
+
* @import { RuleSet } from '../data/types.ts'
|
|
5
6
|
* @import { DescentMatch, CodePointMeta, DescentMatchResult } from './types.ts'
|
|
6
7
|
*/
|
|
7
8
|
|
|
8
9
|
import { stringToCodePointList } from '../../text/utf16/module.f.mjs'
|
|
9
10
|
import { map, toArray } from '../../types/list/module.f.mjs'
|
|
10
|
-
import { commaJoin0Plus, option, range, repeat0Plus, set } from '../module.f.mjs'
|
|
11
|
+
import { commaJoin0Plus, eof, option, range, repeat0Plus, set } from '../module.f.mjs'
|
|
11
12
|
import { emptyTagMap, toData } from '../data/module.f.mjs'
|
|
12
|
-
import { descentParser } from './module.f.mjs'
|
|
13
|
+
import { descentParser, descentParserRuleSet } from './module.f.mjs'
|
|
13
14
|
import { assertEq, assertNotNullish } from '../../asserts/module.f.mjs'
|
|
14
|
-
import { deterministic } from '../testlib.f.mjs'
|
|
15
|
+
import { deterministic, showAst } from '../testlib.f.mjs'
|
|
15
16
|
|
|
16
17
|
/** @type {(cp: CodePoint) => CodePointMeta<unknown>} */
|
|
17
18
|
const mapCodePoint = cp => [cp, undefined]
|
|
@@ -77,11 +78,14 @@ export const proof = {
|
|
|
77
78
|
if (result !== '{"0":"none","3":true,"":true,"r":"none"}') { throw result }
|
|
78
79
|
},
|
|
79
80
|
() => {
|
|
81
|
+
// The whole repetition is one `repeat` rule, and a repetition always
|
|
82
|
+
// matches empty — with no tag, because it is a list of items rather
|
|
83
|
+
// than a choice between branches.
|
|
80
84
|
const repeatRule = repeat0Plus(set(' \n\r\t'))
|
|
81
85
|
const data = toData(repeatRule)
|
|
82
86
|
const emptyTags = emptyTagMap(data[0])
|
|
83
87
|
const result = JSON.stringify(emptyTags)
|
|
84
|
-
|
|
88
|
+
assertEq(result, '{"r":true}')
|
|
85
89
|
}
|
|
86
90
|
],
|
|
87
91
|
descentParser: [
|
|
@@ -254,33 +258,62 @@ export const proof = {
|
|
|
254
258
|
() => {
|
|
255
259
|
const m = descentParser(deterministic())
|
|
256
260
|
|
|
257
|
-
|
|
261
|
+
// A match is pinned by the AST it built, not just by the fact that it
|
|
262
|
+
// matched: the shape is what a repetition changes, and asserting it
|
|
263
|
+
// subsumes success — only a full match produces one. `showAst` writes
|
|
264
|
+
// a node as `tag(children)` with the code points it consumed as one
|
|
265
|
+
// quoted string, `*` for the tagless empty match.
|
|
266
|
+
//
|
|
267
|
+
// The leading three spaces are the `repeat` to read first: they are
|
|
268
|
+
// three siblings of one node here, and three levels of nesting in the
|
|
269
|
+
// LL(1) backend's copy of these expectations.
|
|
270
|
+
/** @type {(s: string, expected: string) => void} */
|
|
271
|
+
const expectAst = (s, expected) => {
|
|
258
272
|
const cp = toArray(stringToCodePointList(s))
|
|
259
273
|
const mr = descentParserCpOnly(m, '', cp)
|
|
260
|
-
|
|
261
|
-
assertEq(
|
|
274
|
+
assertEq(mr.success, true, s)
|
|
275
|
+
assertEq(mr.idx, cp.length, s)
|
|
276
|
+
assertEq(showAst(mr.ast), expected, s)
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/** @type {(s: string) => void} */
|
|
280
|
+
const expectNoMatch = s => {
|
|
281
|
+
const cp = toArray(stringToCodePointList(s))
|
|
282
|
+
const mr = descentParserCpOnly(m, '', cp)
|
|
283
|
+
assertEq(mr.success && mr.idx === cp.length, false, s)
|
|
262
284
|
}
|
|
263
285
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
286
|
+
expectAst(' true ', '((" "(" ") " "(" ") " "(" ")) "true"(("t") ("r") ("u") ("e")) (" "(" ") " "(" ") " "(" ")))')
|
|
287
|
+
expectAst(' "Hello" ', '((" "(" ") " "(" ") " "(" ")) "string"((("\\"")) ("0x2300005b"("H") "0x5d10ffff"("e") "0x5d10ffff"("l") "0x5d10ffff"("l") "0x5d10ffff"("o")) (("\\""))) (" "(" ") " "(" ") " "(" ")))')
|
|
288
|
+
expectAst(' "Hello\\n\\r\\"" ', '((" "(" ") " "(" ") " "(" ")) "string"((("\\"")) ("0x2300005b"("H") "0x5d10ffff"("e") "0x5d10ffff"("l") "0x5d10ffff"("l") "0x5d10ffff"("o") "escape"((("\\\\")) "n"("n")) "escape"((("\\\\")) "r"("r")) "escape"((("\\\\")) "\\""("\\""))) (("\\""))) (" "(" ") " "(" ") " "(" ")))')
|
|
289
|
+
expectAst(' -56.7e+5 ', '((" "(" ") " "(" ") " "(" ")) "number"("some"(("-")) "onenine"(("5") (("6"))) "some"(((".")) (("7") ())) "some"("e"("e") "+"("+") (("5") ()))) (" "(" ") " "(" ")))')
|
|
290
|
+
expectAst(' [] ', '((" "(" ") " "(" ") " "(" ")) "array"((("[")) () "none"() (("]"))) (" "(" ")))')
|
|
291
|
+
expectAst(' {} ', '((" "(" ") " "(" ") " "(" ")) "object"((("{")) () "none"() (("}"))) (" "(" ")))')
|
|
292
|
+
expectAst(' [[[]]] ', '((" "(" ") " "(" ") " "(" ")) "array"((("[")) () "some"(("array"((("[")) () "some"(("array"((("[")) () "none"() (("]"))) ()) "none"()) (("]"))) ()) "none"()) (("]"))) (" "(" ")))')
|
|
293
|
+
expectAst(' [1] ', '((" "(" ") " "(" ") " "(" ")) "array"((("[")) () "some"(("number"("none"() "onenine"(("1") ()) "none"() "none"()) ()) "none"()) (("]"))) (" "(" ")))')
|
|
294
|
+
expectAst(' [ 12, false, "a"] ', '((" "(" ") " "(" ") " "(" ")) "array"((("[")) (" "(" ")) "some"(("number"("none"() "onenine"(("1") (("2"))) "none"() "none"()) ()) "some"(((((",")) (" "(" "))) ("false"(("f") ("a") ("l") ("s") ("e")) ())) "some"(((((",")) (" "(" "))) ("string"((("\\"")) ("0x5d10ffff"("a")) (("\\""))) ())) "none"()))) (("]"))) (" "(" ") " "(" ")))')
|
|
295
|
+
expectAst(' { "q": [ 12, false, [{"b" : "c"}], "a"] } ', '((" "(" ") " "(" ") " "(" ")) "object"((("{")) (" "(" ")) "some"(((((("\\"")) ("0x5d10ffff"("q")) (("\\""))) () ((":")) (" "(" ")) "array"((("[")) (" "(" ")) "some"(("number"("none"() "onenine"(("1") (("2"))) "none"() "none"()) ()) "some"(((((",")) (" "(" "))) ("false"(("f") ("a") ("l") ("s") ("e")) ())) "some"(((((",")) (" "(" "))) ("array"((("[")) () "some"(("object"((("{")) () "some"(((((("\\"")) ("0x5d10ffff"("b")) (("\\""))) (" "(" ")) ((":")) (" "(" ")) "string"((("\\"")) ("0x5d10ffff"("c")) (("\\"")))) ()) "none"()) (("}"))) ()) "none"()) (("]"))) ())) "some"(((((",")) (" "(" "))) ("string"((("\\"")) ("0x5d10ffff"("a")) (("\\""))) ())) "none"())))) (("]")))) (" "(" "))) "none"()) (("}"))) (" "(" ") " "(" ")))')
|
|
296
|
+
expectAst(' { "q": [ 12, false, [{}], "a"] } ', '((" "(" ") " "(" ") " "(" ")) "object"((("{")) (" "(" ")) "some"(((((("\\"")) ("0x5d10ffff"("q")) (("\\""))) () ((":")) (" "(" ")) "array"((("[")) (" "(" ")) "some"(("number"("none"() "onenine"(("1") (("2"))) "none"() "none"()) ()) "some"(((((",")) (" "(" "))) ("false"(("f") ("a") ("l") ("s") ("e")) ())) "some"(((((",")) (" "(" "))) ("array"((("[")) () "some"(("object"((("{")) () "none"() (("}"))) ()) "none"()) (("]"))) ())) "some"(((((",")) (" "(" "))) ("string"((("\\"")) ("0x5d10ffff"("a")) (("\\""))) ())) "none"())))) (("]")))) (" "(" "))) "none"()) (("}"))) (" "(" ") " "(" ")))')
|
|
297
|
+
expectAst(' [{ "q": [ 12, false, [{}], "a"] }] ', '((" "(" ") " "(" ") " "(" ")) "array"((("[")) () "some"(("object"((("{")) (" "(" ")) "some"(((((("\\"")) ("0x5d10ffff"("q")) (("\\""))) () ((":")) (" "(" ")) "array"((("[")) (" "(" ")) "some"(("number"("none"() "onenine"(("1") (("2"))) "none"() "none"()) ()) "some"(((((",")) (" "(" "))) ("false"(("f") ("a") ("l") ("s") ("e")) ())) "some"(((((",")) (" "(" "))) ("array"((("[")) () "some"(("object"((("{")) () "none"() (("}"))) ()) "none"()) (("]"))) ())) "some"(((((",")) (" "(" "))) ("string"((("\\"")) ("0x5d10ffff"("a")) (("\\""))) ())) "none"())))) (("]")))) (" "(" "))) "none"()) (("}"))) ()) "none"()) (("]"))) (" "(" ") " "(" ")))')
|
|
298
|
+
|
|
299
|
+
expectNoMatch(' tr2ue ')
|
|
300
|
+
expectNoMatch(' true" ')
|
|
301
|
+
expectNoMatch(' "Hello ')
|
|
302
|
+
expectNoMatch(' h-56.7e+5 ')
|
|
303
|
+
expectNoMatch(' -56.7e+5 3')
|
|
304
|
+
expectNoMatch(' [ 12, false2, "a"] ')
|
|
305
|
+
expectNoMatch(' { "q": [ 12, false, [}], "a"] } ')
|
|
306
|
+
|
|
307
|
+
// The invalid input in detail. A failed match's own index rewound to
|
|
308
|
+
// the start and locates nothing; the furthest failure is the
|
|
309
|
+
// high-water mark, and it lands on the `}` that closes nothing.
|
|
310
|
+
const bad = ' [{ "q": [ 12, false, [}], "a"] }] '
|
|
311
|
+
const badMr = descentParserCpOnly(m, '', toArray(stringToCodePointList(bad)))
|
|
312
|
+
assertEq(badMr.success, false, bad)
|
|
313
|
+
assertEq(badMr.idx, 0, bad)
|
|
314
|
+
const failure = assertNotNullish(badMr.failure)
|
|
315
|
+
assertEq(failure.idx, 25, bad)
|
|
316
|
+
assertEq(bad[failure.idx], '}', bad)
|
|
284
317
|
}
|
|
285
318
|
],
|
|
286
319
|
// Regression for the stack-recursive matcher bug: the matcher used to recurse
|
|
@@ -323,6 +356,135 @@ export const proof = {
|
|
|
323
356
|
if (result !== `{"ast":{"sequence":[{"tag":"minus","sequence":[[${cp1('-')},"minus"]]},{"sequence":[[${cp1('2')},"two"]]}]},"success":true,"idx":2}`) { throw result }
|
|
324
357
|
},
|
|
325
358
|
],
|
|
359
|
+
logicalEof: [
|
|
360
|
+
() => {
|
|
361
|
+
// The matcher synthesizes one EOF after the physical input, so the
|
|
362
|
+
// `eof` terminal matches empty input. It contributes no AST leaf,
|
|
363
|
+
// and the public index stays physical.
|
|
364
|
+
const m = descentParser(eof)
|
|
365
|
+
const mr = m('', [])
|
|
366
|
+
assertEq(JSON.stringify(mr), '{"ast":{"sequence":[]},"success":true,"idx":0}')
|
|
367
|
+
},
|
|
368
|
+
() => {
|
|
369
|
+
// Callers pass physical symbols only, so EOF is not available
|
|
370
|
+
// before the end of the input.
|
|
371
|
+
const m = descentParser(eof)
|
|
372
|
+
const mr = descentParserCpOnly(m, '', toArray(stringToCodePointList('A')))
|
|
373
|
+
assertEq(mr.success, false)
|
|
374
|
+
const f = assertNotNullish(mr.failure)
|
|
375
|
+
assertEq(f.idx, 0)
|
|
376
|
+
assertEq(f.expected.length, 1)
|
|
377
|
+
assertEq(f.expected[0], eof)
|
|
378
|
+
},
|
|
379
|
+
() => {
|
|
380
|
+
// Non-empty input: the terminal consumes the synthesized EOF after
|
|
381
|
+
// the last code point, and `idx` still reports `input.length`.
|
|
382
|
+
const m = descentParser([range('AA'), eof])
|
|
383
|
+
const cp = toArray(stringToCodePointList('A'))
|
|
384
|
+
const mr = descentParserCpOnly(m, '', cp)
|
|
385
|
+
assertEq(mr.success, true)
|
|
386
|
+
assertEq(mr.idx, cp.length)
|
|
387
|
+
assertEq(JSON.stringify(mr.ast), `{"sequence":[{"sequence":[[${cp1('A')},null]]},{"sequence":[]}]}`)
|
|
388
|
+
},
|
|
389
|
+
() => {
|
|
390
|
+
// Exactly one EOF is synthesized: a second `eof` terminal has
|
|
391
|
+
// nothing left to consume, and its failure points at `input.length`.
|
|
392
|
+
const m = descentParser([eof, eof])
|
|
393
|
+
const mr = m('', [])
|
|
394
|
+
assertEq(mr.success, false)
|
|
395
|
+
const f = assertNotNullish(mr.failure)
|
|
396
|
+
assertEq(f.idx, 0)
|
|
397
|
+
assertEq(f.expected.length, 1)
|
|
398
|
+
assertEq(f.expected[0], eof)
|
|
399
|
+
},
|
|
400
|
+
() => {
|
|
401
|
+
// EOF as one alternative among ordinary terminals.
|
|
402
|
+
const m = descentParser({ a: range('AA'), e: eof })
|
|
403
|
+
assertEq(JSON.stringify(m('', [])), '{"ast":{"tag":"e","sequence":[]},"success":true,"idx":0}')
|
|
404
|
+
const mr = descentParserCpOnly(m, '', toArray(stringToCodePointList('A')))
|
|
405
|
+
assertEq(mr.success, true)
|
|
406
|
+
assertEq(mr.idx, 1)
|
|
407
|
+
},
|
|
408
|
+
() => {
|
|
409
|
+
// Repetition terminates on EOF: consuming it moves the complete
|
|
410
|
+
// cursor, so the repeat makes exactly one round and then stops —
|
|
411
|
+
// with `idx` alone this would never stop.
|
|
412
|
+
const rule = repeat0Plus(eof)
|
|
413
|
+
const m = descentParser(rule)
|
|
414
|
+
const mr = m(toData(rule)[1], [])
|
|
415
|
+
assertEq(JSON.stringify(mr), '{"ast":{"sequence":[{"sequence":[]}]},"success":true,"idx":0}')
|
|
416
|
+
},
|
|
417
|
+
() => {
|
|
418
|
+
// Backtracking restores the complete cursor: `x` consumes EOF and
|
|
419
|
+
// then fails, so `y` must still find EOF available.
|
|
420
|
+
const m = descentParser({ x: [eof, range('AA')], y: eof })
|
|
421
|
+
assertEq(JSON.stringify(m('', [])), '{"ast":{"tag":"y","sequence":[]},"success":true,"idx":0}')
|
|
422
|
+
},
|
|
423
|
+
() => {
|
|
424
|
+
// Diagnostic ordering by the complete cursor: `y` got further than
|
|
425
|
+
// `x` — the same physical index, but past the EOF it consumed — so
|
|
426
|
+
// only its expectation is reported, and at the physical end.
|
|
427
|
+
const m = descentParser({ x: range('AA'), y: [eof, range('BB')] })
|
|
428
|
+
const mr = m('', [])
|
|
429
|
+
assertEq(mr.success, false)
|
|
430
|
+
const f = assertNotNullish(mr.failure)
|
|
431
|
+
assertEq(f.idx, 0)
|
|
432
|
+
assertEq(f.expected.length, 1)
|
|
433
|
+
assertEq(f.expected[0], range('BB'))
|
|
434
|
+
},
|
|
435
|
+
],
|
|
436
|
+
repeat: [
|
|
437
|
+
() => {
|
|
438
|
+
// The whole repetition is one node holding a flat sequence of the
|
|
439
|
+
// items it matched — not the right-recursive chain of `some`/`none`
|
|
440
|
+
// nodes its functional spelling builds.
|
|
441
|
+
const rule = repeat0Plus(set(' \n\r\t'))
|
|
442
|
+
const m = descentParser(rule)
|
|
443
|
+
const name = toData(rule)[1]
|
|
444
|
+
const mr = descentParserCpOnly(m, name, toArray(stringToCodePointList(' ')))
|
|
445
|
+
assertEq(
|
|
446
|
+
JSON.stringify(mr),
|
|
447
|
+
`{"ast":{"sequence":[{"tag":" ","sequence":[[${cp1(' ')},null]]},{"tag":" ","sequence":[[${cp1(' ')},null]]}]},"success":true,"idx":2}`)
|
|
448
|
+
},
|
|
449
|
+
() => {
|
|
450
|
+
// Zero items is a match, and the node is empty rather than tagged.
|
|
451
|
+
const rule = repeat0Plus(set(' \n\r\t'))
|
|
452
|
+
const m = descentParser(rule)
|
|
453
|
+
const mr = m(toData(rule)[1], [])
|
|
454
|
+
assertEq(JSON.stringify(mr), '{"ast":{"sequence":[]},"success":true,"idx":0}')
|
|
455
|
+
},
|
|
456
|
+
() => {
|
|
457
|
+
// A round that fails ends the repetition rather than failing it: the
|
|
458
|
+
// rounds before it stand and the match stops where the failed one
|
|
459
|
+
// began.
|
|
460
|
+
const rule = repeat0Plus(set(' \n\r\t'))
|
|
461
|
+
const m = descentParser(rule)
|
|
462
|
+
const name = toData(rule)[1]
|
|
463
|
+
const mr = descentParserCpOnly(m, name, toArray(stringToCodePointList(' x')))
|
|
464
|
+
assertEq(
|
|
465
|
+
JSON.stringify(mr),
|
|
466
|
+
`{"ast":{"sequence":[{"tag":" ","sequence":[[${cp1(' ')},null]]}]},"success":true,"idx":1}`)
|
|
467
|
+
},
|
|
468
|
+
() => {
|
|
469
|
+
// `toData` never folds a nullable item into a `repeat`, but a
|
|
470
|
+
// hand-written rule set can hold one. A round that consumes nothing
|
|
471
|
+
// would repeat forever, so it is kept once and ends the repetition.
|
|
472
|
+
/** @type {RuleSet} */
|
|
473
|
+
const ruleSet = {
|
|
474
|
+
repeated: 'optionalA',
|
|
475
|
+
optionalA: { some: 'a', none: 'e' },
|
|
476
|
+
a: range('aa'),
|
|
477
|
+
e: [],
|
|
478
|
+
}
|
|
479
|
+
const m = descentParserRuleSet(ruleSet)
|
|
480
|
+
assertEq(
|
|
481
|
+
JSON.stringify(m('repeated', [])),
|
|
482
|
+
'{"ast":{"sequence":[{"tag":"none","sequence":[]}]},"success":true,"idx":0}')
|
|
483
|
+
assertEq(
|
|
484
|
+
JSON.stringify(m('repeated', [[cp1('a'), null]])),
|
|
485
|
+
`{"ast":{"sequence":[{"tag":"some","sequence":[[${cp1('a')},null]]},{"tag":"none","sequence":[]}]},"success":true,"idx":1}`)
|
|
486
|
+
},
|
|
487
|
+
],
|
|
326
488
|
furthestFailure: [
|
|
327
489
|
() => {
|
|
328
490
|
// A branch rejected *before* the high-water mark must not pull it back:
|
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Types for the recursive descent matcher backend.
|
|
3
3
|
*
|
|
4
|
+
* The AST it builds is the shared one, over leaves that carry metadata:
|
|
5
|
+
* `Ast<CodePointMeta<T>>` from [`../matcher`](../matcher). What is declared
|
|
6
|
+
* here is what belongs to *this* backend — the metadata-carrying leaf, the
|
|
7
|
+
* diagnostics a backtracking matcher can report, and its public result.
|
|
8
|
+
*
|
|
4
9
|
* @module
|
|
5
10
|
*/
|
|
6
11
|
import type { CodePoint } from '../../text/utf16/types.ts';
|
|
12
|
+
import type { Ast, AstTag } from '../matcher/types.ts';
|
|
7
13
|
import type { TerminalRange } from '../types.ts';
|
|
8
|
-
export type AstTag = string | true | undefined;
|
|
9
14
|
/**
|
|
10
|
-
* Recursive descent matcher for a single named rule
|
|
15
|
+
* Recursive descent matcher for a single named rule, starting from `startPos` —
|
|
16
|
+
* a position that counts the synthesized end-of-input symbol, unlike the public
|
|
17
|
+
* `idx` of the result.
|
|
11
18
|
*/
|
|
12
|
-
export type DescentMatchRule<T> = (name: string, tag: AstTag, s: readonly CodePointMeta<T>[],
|
|
19
|
+
export type DescentMatchRule<T> = (name: string, tag: AstTag, s: readonly CodePointMeta<T>[], startPos: number) => DescentMatchResult<T>;
|
|
13
20
|
/**
|
|
14
21
|
* Where a match ran out of road, for diagnostics.
|
|
15
22
|
*
|
|
@@ -24,6 +31,11 @@ export type DescentMatchRule<T> = (name: string, tag: AstTag, s: readonly CodePo
|
|
|
24
31
|
*
|
|
25
32
|
* `idx` is `0` with an empty `expected` when the match failed without ever
|
|
26
33
|
* rejecting a terminal, as an empty variant does.
|
|
34
|
+
*
|
|
35
|
+
* `idx` is physical, so a terminal rejected at — or past — the synthesized
|
|
36
|
+
* end-of-input symbol reports `input.length`. The high-water mark itself is
|
|
37
|
+
* kept on the complete cursor, so those two are still ordered against each
|
|
38
|
+
* other and their expected terminals do not merge.
|
|
27
39
|
*/
|
|
28
40
|
export type DescentFailure = {
|
|
29
41
|
readonly idx: number;
|
|
@@ -41,11 +53,12 @@ export type DescentFailure = {
|
|
|
41
53
|
* On failure `idx` has rewound to the start of the enclosing sequence and
|
|
42
54
|
* locates nothing; read `failure.idx` instead.
|
|
43
55
|
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
56
|
+
* `idx` is physical — `0 <= idx <= input.length` — so a match that consumed the
|
|
57
|
+
* synthesized end-of-input symbol reports `input.length`, the same as one that
|
|
58
|
+
* stopped just before it.
|
|
46
59
|
*/
|
|
47
60
|
export type DescentMatchResult<T> = {
|
|
48
|
-
readonly ast:
|
|
61
|
+
readonly ast: Ast<CodePointMeta<T>>;
|
|
49
62
|
readonly success: boolean;
|
|
50
63
|
readonly idx: number;
|
|
51
64
|
readonly failure?: DescentFailure;
|
|
@@ -55,17 +68,10 @@ export type DescentMatchResult<T> = {
|
|
|
55
68
|
*/
|
|
56
69
|
export type DescentMatch<T> = (name: string, s: readonly CodePointMeta<T>[]) => DescentMatchResult<T>;
|
|
57
70
|
/**
|
|
58
|
-
* Code point value paired with metadata.
|
|
71
|
+
* Code point value paired with metadata: this backend's AST leaf.
|
|
72
|
+
*
|
|
73
|
+
* Preserving metadata per consumed code point is what distinguishes this
|
|
74
|
+
* backend, so the leaf type stays here rather than moving to the shared layer,
|
|
75
|
+
* which is parameterized by it.
|
|
59
76
|
*/
|
|
60
77
|
export type CodePointMeta<T> = readonly [CodePoint, T];
|
|
61
|
-
/**
|
|
62
|
-
* AST sequence for the metadata-aware parser.
|
|
63
|
-
*/
|
|
64
|
-
export type AstSequenceMeta<T> = readonly (AstRuleMeta<T> | CodePointMeta<T>)[];
|
|
65
|
-
/**
|
|
66
|
-
* Metadata-aware AST node.
|
|
67
|
-
*/
|
|
68
|
-
export type AstRuleMeta<T> = {
|
|
69
|
-
readonly tag: AstTag;
|
|
70
|
-
readonly sequence: AstSequenceMeta<T>;
|
|
71
|
-
};
|
|
@@ -4,26 +4,59 @@
|
|
|
4
4
|
* Built from the serializable IR in `fjs/bnf/data`, this is one member of the
|
|
5
5
|
* family of automaton builders that consume a {@link RuleSet}: it compiles the
|
|
6
6
|
* grammar into a predictive {@link dispatchMap} and matches input into an AST
|
|
7
|
-
* ({@link MatchResult}). It throws at build time
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* ({@link MatchResult}). It throws at build time when the grammar is not
|
|
8
|
+
* LL(1): `can not merge …` for a first/first conflict, `left recursion …` for
|
|
9
|
+
* a rule reachable from itself in first position. Nullability is looked up
|
|
10
|
+
* from {@link emptyTagMap} in `fjs/bnf/data` rather than re-derived here.
|
|
11
|
+
*
|
|
12
|
+
* A rule is entered *before* its first symbol is consumed: the dispatch map
|
|
13
|
+
* only selects — a variant's branch, a repetition's next round — and every
|
|
14
|
+
* rule invocation builds a node of its own, so the AST is the one
|
|
15
|
+
* `fjs/bnf/descent` builds for the same grammar (see ./README.md). A `Repeat`
|
|
16
|
+
* rule is matched iteratively and produces one node holding a flat sequence
|
|
17
|
+
* of the items it matched.
|
|
18
|
+
*
|
|
19
|
+
* The caller passes physical symbols only; the matcher synthesizes the one
|
|
20
|
+
* logical EOF after them, so a grammar can dispatch on the end of input with
|
|
21
|
+
* the `eof` terminal. The position it does that at, the AST it builds, and the
|
|
22
|
+
* constructors that pair them are the shared layer in `fjs/bnf/matcher`.
|
|
10
23
|
*
|
|
11
24
|
* See `./types.ts` for the type-level API.
|
|
12
25
|
*
|
|
13
26
|
* @module
|
|
14
27
|
*
|
|
28
|
+
* @import { CodePoint } from '../../text/utf16/types.ts'
|
|
15
29
|
* @import { Properties } from '../../types/range_map/types.ts'
|
|
16
30
|
* @import { StringSet } from '../../types/string_set/types.ts'
|
|
17
|
-
* @import {
|
|
31
|
+
* @import { List } from '../../types/list/types.ts'
|
|
32
|
+
* @import { RuleSet, Sequence } from '../data/types.ts'
|
|
33
|
+
* @import { Ast, AstResult, AstSequence, AstTag, Cursor } from '../matcher/types.ts'
|
|
18
34
|
* @import { Rule as FRule } from '../types.ts'
|
|
19
|
-
* @import {
|
|
35
|
+
* @import { Match, MatchResult, Remainder, _Dispatch, _DispatchBranch, _DispatchMap, _DispatchResult, _DispatchRule } from './types.ts'
|
|
20
36
|
*/
|
|
21
|
-
import type {
|
|
37
|
+
import type { CodePoint } from '../../text/utf16/types.ts';
|
|
38
|
+
import type { List } from '../../types/list/types.ts';
|
|
39
|
+
import type { RuleSet, Sequence } from '../data/types.ts';
|
|
40
|
+
import type { Ast, AstResult, AstSequence, AstTag, Cursor } from '../matcher/types.ts';
|
|
22
41
|
import type { Rule as FRule } from '../types.ts';
|
|
23
42
|
import type { Match, _DispatchMap } from './types.ts';
|
|
24
43
|
/**
|
|
25
44
|
* Builds a dispatch map for a {@link RuleSet} to enable predictive parsing.
|
|
26
45
|
*
|
|
46
|
+
* Each rule's entry holds the rule's first set as a range map. Only a variant
|
|
47
|
+
* reads the value under a symbol — the branch that lookahead selects; every
|
|
48
|
+
* other reader asks whether a symbol is in the set at all, which is how a
|
|
49
|
+
* repetition decides to start another round. `empty` is the branch a variant
|
|
50
|
+
* takes when no entry matches the lookahead — its nullable branch, absent
|
|
51
|
+
* when the variant cannot match empty.
|
|
52
|
+
*
|
|
53
|
+
* A rule referenced in first position while its own first set is still being
|
|
54
|
+
* computed is left recursion — a grammar no lookahead can decide, whose match
|
|
55
|
+
* would loop at the same position forever — so building throws
|
|
56
|
+
* (`left recursion …`) rather than letting the matcher diverge. The one
|
|
57
|
+
* self-reference with a sound reading is a repetition of itself: zero rounds
|
|
58
|
+
* match whatever the item does, so it dispatches on nothing and matches empty.
|
|
59
|
+
*
|
|
27
60
|
* @type {(ruleSet: RuleSet) => _DispatchMap}
|
|
28
61
|
*/
|
|
29
62
|
export declare const dispatchMap: (ruleSet: RuleSet) => _DispatchMap;
|
|
@@ -33,6 +66,41 @@ export declare const dispatchMap: (ruleSet: RuleSet) => _DispatchMap;
|
|
|
33
66
|
* @type {(fr: FRule) => Match}
|
|
34
67
|
*/
|
|
35
68
|
export declare const parser: (fr: FRule) => Match;
|
|
69
|
+
export type _Position = Cursor | null;
|
|
70
|
+
export type _Result = AstResult<CodePoint, _Position>;
|
|
71
|
+
export type _SeqFrame = {
|
|
72
|
+
readonly kind: 'seq';
|
|
73
|
+
readonly tag: AstTag;
|
|
74
|
+
readonly items: Sequence;
|
|
75
|
+
readonly itemIndex: number;
|
|
76
|
+
readonly seq: AstSequence<CodePoint>;
|
|
77
|
+
};
|
|
78
|
+
export type _RepeatFrame = {
|
|
79
|
+
readonly kind: 'repeat';
|
|
80
|
+
readonly tag: AstTag;
|
|
81
|
+
readonly item: string;
|
|
82
|
+
readonly items: _Items;
|
|
83
|
+
};
|
|
84
|
+
export type _Items = List<Ast<CodePoint>>;
|
|
85
|
+
export type _Frame = _SeqFrame | _RepeatFrame;
|
|
86
|
+
export type _Stack = null | {
|
|
87
|
+
readonly top: _Frame;
|
|
88
|
+
readonly rest: _Stack;
|
|
89
|
+
};
|
|
90
|
+
export type _RuleTask = {
|
|
91
|
+
readonly kind: 'rule';
|
|
92
|
+
readonly name: string;
|
|
93
|
+
readonly tag: AstTag;
|
|
94
|
+
readonly pos: Cursor;
|
|
95
|
+
};
|
|
96
|
+
export type _RepeatTask = {
|
|
97
|
+
readonly kind: 'repeat';
|
|
98
|
+
readonly tag: AstTag;
|
|
99
|
+
readonly item: string;
|
|
100
|
+
readonly items: _Items;
|
|
101
|
+
readonly pos: Cursor;
|
|
102
|
+
};
|
|
103
|
+
export type _Task = _RuleTask | _RepeatTask;
|
|
36
104
|
/**
|
|
37
105
|
* Creates an LL(1) parser from an already materialized {@link RuleSet}.
|
|
38
106
|
*
|