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
package/fjs/bnf/data/proof.f.mjs
CHANGED
|
@@ -6,10 +6,9 @@
|
|
|
6
6
|
|
|
7
7
|
import { identity } from '../../types/function/module.f.mjs'
|
|
8
8
|
import { sort } from '../../types/object/module.f.mjs'
|
|
9
|
-
import { oneEncode, option, range, rangeDecode, repeat0Plus, set } from '../module.f.mjs'
|
|
10
|
-
import { emptyTagMap, toData } from './module.f.mjs'
|
|
9
|
+
import { none, oneEncode, option, range, rangeDecode, repeat0Plus, set } from '../module.f.mjs'
|
|
10
|
+
import { detectRepeat, emptyTagMap, isRepeat, toData } from './module.f.mjs'
|
|
11
11
|
import { assertEq } from '../../asserts/module.f.mjs'
|
|
12
|
-
|
|
13
12
|
import { stringify } from '../../media/json/module.f.mjs'
|
|
14
13
|
import { classic, deterministic } from '../testlib.f.mjs'
|
|
15
14
|
|
|
@@ -89,11 +88,82 @@ export const proof = {
|
|
|
89
88
|
if (result !== '[{"0":{"some":"1","none":"3"},"1":["2"],"2":1627390049,"3":[],"":["0","r"],"r":{"some":"","none":"3"}},"r"]') { throw result }
|
|
90
89
|
},
|
|
91
90
|
() => {
|
|
91
|
+
// The item is not nullable, so this one folds into a `repeat`, and
|
|
92
|
+
// the recursive and empty branches it replaced are pruned.
|
|
92
93
|
const repeatRule = repeat0Plus(set(' \n\r\t'))
|
|
93
94
|
const result = stringify(identity)(toData(repeatRule))
|
|
94
|
-
|
|
95
|
+
const expected = '[{"0":{" ":"1","\\n":"2","\\r":"3","\\t":"4"},"1":536870944,"2":167772170,"3":218103821,"4":150994953,"r":"0"},"r"]'
|
|
96
|
+
assertEq(result, expected, [result, expected])
|
|
95
97
|
}
|
|
96
98
|
],
|
|
99
|
+
isRepeat: () => {
|
|
100
|
+
assertEq(isRepeat('a'), true)
|
|
101
|
+
// Nothing else in a rule set is a string, so the four rule kinds are
|
|
102
|
+
// told apart by JavaScript type alone — no shape has to be probed.
|
|
103
|
+
assertEq(isRepeat(['a', 'b']), false)
|
|
104
|
+
assertEq(isRepeat({ some: 'a' }), false)
|
|
105
|
+
assertEq(isRepeat(oneEncode(0x41)), false)
|
|
106
|
+
},
|
|
107
|
+
detectRepeat: [
|
|
108
|
+
() => {
|
|
109
|
+
const result = stringify(identity)(toData(repeat0Plus(range('AF'))))
|
|
110
|
+
const expected = '[{"0":1090519110,"r":"0"},"r"]'
|
|
111
|
+
assertEq(result, expected, [result, expected])
|
|
112
|
+
},
|
|
113
|
+
() => {
|
|
114
|
+
// Nothing about the fold depends on `repeat0Plus`: a hand-written
|
|
115
|
+
// 0-or-more list is the same shape and folds the same way. `classic`
|
|
116
|
+
// spells one out as `characters`.
|
|
117
|
+
const [ruleSet] = toData(classic())
|
|
118
|
+
const repeats = Object.entries(ruleSet).filter(([, v]) => isRepeat(v))
|
|
119
|
+
assertEq(JSON.stringify(repeats), '[["characters","character"]]')
|
|
120
|
+
},
|
|
121
|
+
() => {
|
|
122
|
+
// Already folded: a `repeat` is not itself a variant to fold again.
|
|
123
|
+
const [ruleSet, entry] = toData(repeat0Plus(range('AF')))
|
|
124
|
+
assertEq(
|
|
125
|
+
stringify(identity)(detectRepeat(ruleSet, entry)),
|
|
126
|
+
stringify(identity)(ruleSet))
|
|
127
|
+
},
|
|
128
|
+
() => {
|
|
129
|
+
// 1-or-more: the base branch is the item, not the empty rule.
|
|
130
|
+
const digit = range('09')
|
|
131
|
+
const digits = () => ({ digit, digits: [digit, digits] })
|
|
132
|
+
const result = stringify(identity)(toData(digits))
|
|
133
|
+
const expected = '[{"0":["","digits"],"":805306425,"digits":{"digit":"","digits":"0"}},"digits"]'
|
|
134
|
+
assertEq(result, expected, [result, expected])
|
|
135
|
+
},
|
|
136
|
+
() => {
|
|
137
|
+
// A separated list repeats `[item, separator, self]`; which of the
|
|
138
|
+
// three items are the list's elements is not something the shape
|
|
139
|
+
// says, so it stays a variant.
|
|
140
|
+
const sep = () => ({ none, list: [range('09'), ',', sep] })
|
|
141
|
+
const result = stringify(identity)(toData(sep))
|
|
142
|
+
const expected = '[{"0":["1","2","sep"],"1":805306425,"2":["3"],"3":738197548,"":[],"sep":{"none":"","list":"0"}},"sep"]'
|
|
143
|
+
assertEq(result, expected, [result, expected])
|
|
144
|
+
},
|
|
145
|
+
() => {
|
|
146
|
+
// The tail is not the rule's only self-reference: the item leads back
|
|
147
|
+
// into it, so the recursion is a tree rather than a list.
|
|
148
|
+
const nested = () => ({ none, some: [inner, nested] })
|
|
149
|
+
const inner = () => ({ leaf: range('AA'), group: ['(', nested, ')'] })
|
|
150
|
+
const [ruleSet] = toData(nested)
|
|
151
|
+
assertEq(JSON.stringify(ruleSet.nested), '{"none":"","some":"0"}')
|
|
152
|
+
},
|
|
153
|
+
() => {
|
|
154
|
+
// A nullable item gives the same input infinitely many parses, so
|
|
155
|
+
// the repetition is not the unambiguous one this fold is limited to.
|
|
156
|
+
const [ruleSet, entry] = toData(repeat0Plus(option('a')))
|
|
157
|
+
assertEq(JSON.stringify(ruleSet[entry]), '{"some":"","none":"3"}')
|
|
158
|
+
},
|
|
159
|
+
() => {
|
|
160
|
+
// Two branches, an empty one and a terminal: the non-empty branch is
|
|
161
|
+
// not a sequence at all.
|
|
162
|
+
const result = stringify(identity)(toData({ e: '', a: range('AA') }))
|
|
163
|
+
const expected = '[{"0":[],"1":1090519105,"":{"e":"0","a":"1"}},""]'
|
|
164
|
+
assertEq(result, expected, [result, expected])
|
|
165
|
+
},
|
|
166
|
+
],
|
|
97
167
|
variantTest: () => {
|
|
98
168
|
const varintRule = { a: 'a', b: 'b'}
|
|
99
169
|
const result = stringify(sort)(toData(varintRule))
|
package/fjs/bnf/data/types.d.ts
CHANGED
|
@@ -16,15 +16,33 @@ export type TerminalRange = number;
|
|
|
16
16
|
export type Sequence = readonly string[];
|
|
17
17
|
/** A variant of rule names. */
|
|
18
18
|
export type Variant = StringMap<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Zero or more repetitions of the named rule.
|
|
21
|
+
*
|
|
22
|
+
* The functional grammar has no repetition primitive — `repeat0Plus(x)` expands
|
|
23
|
+
* to a right-recursive variant — so this is the one rule kind `toData` derives
|
|
24
|
+
* rather than transcribes: it recognizes the unambiguous 0-or-more shape and
|
|
25
|
+
* emits this instead, which is what lets a parser backend match the body
|
|
26
|
+
* iteratively and produce one flat node for the whole repetition.
|
|
27
|
+
*
|
|
28
|
+
* A bare rule name keeps the four rule kinds disjoint by JavaScript type alone:
|
|
29
|
+
* a number is a {@link TerminalRange}, an array a {@link Sequence}, an object a
|
|
30
|
+
* {@link Variant}, and a string this. Nothing else in a {@link RuleSet} is a
|
|
31
|
+
* string, so no shape has to be probed to tell one kind from another. (The
|
|
32
|
+
* *functional* `DataRule` does have a string case — a Unicode literal — but
|
|
33
|
+
* that one never reaches here: `toData` expands it to terminals.)
|
|
34
|
+
*/
|
|
35
|
+
export type Repeat = string;
|
|
19
36
|
/**
|
|
20
37
|
* Grammar rule definition.
|
|
21
38
|
*
|
|
22
39
|
* It can be one of:
|
|
23
40
|
* - a tagged variant map,
|
|
24
41
|
* - a sequence of referenced rule names,
|
|
25
|
-
* - an encoded terminal range
|
|
42
|
+
* - an encoded terminal range,
|
|
43
|
+
* - the name of a rule to repeat zero or more times.
|
|
26
44
|
*/
|
|
27
|
-
export type Rule = Variant | Sequence | TerminalRange;
|
|
45
|
+
export type Rule = Variant | Sequence | TerminalRange | Repeat;
|
|
28
46
|
/** The full grammar */
|
|
29
47
|
export type RuleSet = Readonly<Record<string, Rule>>;
|
|
30
48
|
/**
|
|
@@ -4,24 +4,53 @@
|
|
|
4
4
|
* Built from the serializable IR in `fjs/bnf/data`, this is a sibling of the
|
|
5
5
|
* LL(1) dispatch builder (`fjs/bnf/ll1`). It walks the grammar by recursive
|
|
6
6
|
* descent and preserves per-code-point metadata, producing a metadata-aware
|
|
7
|
-
* AST
|
|
8
|
-
*
|
|
7
|
+
* AST over leaves that carry it — `Ast<CodePointMeta<T>>`, built with the
|
|
8
|
+
* shared layer in `fjs/bnf/matcher`. Nullability (which rule can match empty
|
|
9
|
+
* input) is computed once by {@link emptyTagMap} in `fjs/bnf/data`.
|
|
10
|
+
*
|
|
11
|
+
* The caller passes physical symbols only; the matcher synthesizes the one
|
|
12
|
+
* logical EOF after them, so a grammar can require the end of input with the
|
|
13
|
+
* `eof` terminal.
|
|
9
14
|
*
|
|
10
15
|
* A failed result also carries a {@link DescentFailure}: the furthest position a
|
|
11
16
|
* terminal was rejected at, which — unlike the result's own index — never
|
|
12
17
|
* rewinds and is what diagnostics should be built from.
|
|
13
18
|
*
|
|
19
|
+
* A `Repeat` rule is matched iteratively rather than by descending into itself
|
|
20
|
+
* once per item, so a repetition produces one AST node holding a flat sequence
|
|
21
|
+
* of the items it matched instead of the right-recursive chain its functional
|
|
22
|
+
* spelling would otherwise build.
|
|
23
|
+
*
|
|
14
24
|
* See `./types.ts` for the type-level API.
|
|
15
25
|
*
|
|
16
26
|
* @module
|
|
17
27
|
*
|
|
18
28
|
* @import { TerminalRange } from '../types.ts'
|
|
19
|
-
* @import { Rule as DataRule, Sequence } from '../data/types.ts'
|
|
29
|
+
* @import { Rule as DataRule, RuleSet, Sequence } from '../data/types.ts'
|
|
20
30
|
* @import { Rule as FRule } from '../types.ts'
|
|
21
|
-
* @import {
|
|
31
|
+
* @import { List } from '../../types/list/types.ts'
|
|
32
|
+
* @import { Ast, AstResult, AstSequence, AstTag, Cursor } from '../matcher/types.ts'
|
|
33
|
+
* @import { CodePointMeta, DescentFailure, DescentMatch, DescentMatchResult, DescentMatchRule } from './types.ts'
|
|
22
34
|
*/
|
|
35
|
+
import type { TerminalRange } from '../types.ts';
|
|
36
|
+
import type { RuleSet } from '../data/types.ts';
|
|
23
37
|
import type { Rule as FRule } from '../types.ts';
|
|
24
|
-
import type {
|
|
38
|
+
import type { AstResult, Cursor } from '../matcher/types.ts';
|
|
39
|
+
import type { CodePointMeta, DescentMatch } from './types.ts';
|
|
40
|
+
export type _Failure = {
|
|
41
|
+
readonly pos: Cursor;
|
|
42
|
+
readonly expected: readonly TerminalRange[];
|
|
43
|
+
};
|
|
44
|
+
export type _Result<T> = AstResult<CodePointMeta<T>, Cursor>;
|
|
45
|
+
/**
|
|
46
|
+
* Creates a recursive descent parser from an already materialized
|
|
47
|
+
* {@link RuleSet}, preserving metadata for each consumed code point.
|
|
48
|
+
*
|
|
49
|
+
* @template T
|
|
50
|
+
* @param {RuleSet} ruleSet
|
|
51
|
+
* @returns {DescentMatch<T>}
|
|
52
|
+
*/
|
|
53
|
+
export declare const descentParserRuleSet: <T>(ruleSet: RuleSet) => DescentMatch<T>;
|
|
25
54
|
/**
|
|
26
55
|
* Creates a recursive descent parser that preserves metadata for each consumed
|
|
27
56
|
* code point.
|
|
@@ -4,52 +4,97 @@
|
|
|
4
4
|
* Built from the serializable IR in `fjs/bnf/data`, this is a sibling of the
|
|
5
5
|
* LL(1) dispatch builder (`fjs/bnf/ll1`). It walks the grammar by recursive
|
|
6
6
|
* descent and preserves per-code-point metadata, producing a metadata-aware
|
|
7
|
-
* AST
|
|
8
|
-
*
|
|
7
|
+
* AST over leaves that carry it — `Ast<CodePointMeta<T>>`, built with the
|
|
8
|
+
* shared layer in `fjs/bnf/matcher`. Nullability (which rule can match empty
|
|
9
|
+
* input) is computed once by {@link emptyTagMap} in `fjs/bnf/data`.
|
|
10
|
+
*
|
|
11
|
+
* The caller passes physical symbols only; the matcher synthesizes the one
|
|
12
|
+
* logical EOF after them, so a grammar can require the end of input with the
|
|
13
|
+
* `eof` terminal.
|
|
9
14
|
*
|
|
10
15
|
* A failed result also carries a {@link DescentFailure}: the furthest position a
|
|
11
16
|
* terminal was rejected at, which — unlike the result's own index — never
|
|
12
17
|
* rewinds and is what diagnostics should be built from.
|
|
13
18
|
*
|
|
19
|
+
* A `Repeat` rule is matched iteratively rather than by descending into itself
|
|
20
|
+
* once per item, so a repetition produces one AST node holding a flat sequence
|
|
21
|
+
* of the items it matched instead of the right-recursive chain its functional
|
|
22
|
+
* spelling would otherwise build.
|
|
23
|
+
*
|
|
14
24
|
* See `./types.ts` for the type-level API.
|
|
15
25
|
*
|
|
16
26
|
* @module
|
|
17
27
|
*
|
|
18
28
|
* @import { TerminalRange } from '../types.ts'
|
|
19
|
-
* @import { Rule as DataRule, Sequence } from '../data/types.ts'
|
|
29
|
+
* @import { Rule as DataRule, RuleSet, Sequence } from '../data/types.ts'
|
|
20
30
|
* @import { Rule as FRule } from '../types.ts'
|
|
21
|
-
* @import {
|
|
31
|
+
* @import { List } from '../../types/list/types.ts'
|
|
32
|
+
* @import { Ast, AstResult, AstSequence, AstTag, Cursor } from '../matcher/types.ts'
|
|
33
|
+
* @import { CodePointMeta, DescentFailure, DescentMatch, DescentMatchResult, DescentMatchRule } from './types.ts'
|
|
22
34
|
*/
|
|
23
35
|
|
|
24
36
|
import { rangeDecode } from '../module.f.mjs'
|
|
25
37
|
import { contains as rangeContains } from '../../types/range/module.f.mjs'
|
|
38
|
+
import { concat, toArray } from '../../types/list/module.f.mjs'
|
|
26
39
|
import { definedEntries } from '../../types/object/module.f.mjs'
|
|
27
|
-
import { emptyTagMap, toData } from '../data/module.f.mjs'
|
|
40
|
+
import { emptyTagMap, isRepeat, toData } from '../data/module.f.mjs'
|
|
41
|
+
import { leafAt, mrFail, mrSuccess, physicalIdx, symbolAt } from '../matcher/module.f.mjs'
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The furthest-failure record while matching, positioned by the complete
|
|
45
|
+
* {@link Cursor}. {@link DescentFailure} is its public, physically-positioned
|
|
46
|
+
* form.
|
|
47
|
+
*
|
|
48
|
+
* @typedef {{
|
|
49
|
+
* readonly pos: Cursor
|
|
50
|
+
* readonly expected: readonly TerminalRange[]
|
|
51
|
+
* }} _Failure
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The machine's own result: a {@link DescentMatchResult} positioned by the
|
|
56
|
+
* complete cursor, and with no failure record — that one is tracked per match
|
|
57
|
+
* rather than per frame. This backend always has a position, so it needs no
|
|
58
|
+
* `null` case.
|
|
59
|
+
*
|
|
60
|
+
* @template T
|
|
61
|
+
* @typedef {AstResult<CodePointMeta<T>, Cursor>} _Result
|
|
62
|
+
*/
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* A leaf here is a code point with its metadata, so its symbol is the first
|
|
66
|
+
* half. This is the only thing {@link symbolAt} needs to know about a leaf.
|
|
67
|
+
*
|
|
68
|
+
* @type {<T>(leaf: CodePointMeta<T>) => number}
|
|
69
|
+
*/
|
|
70
|
+
const symbolOf = ([symbol]) => symbol
|
|
71
|
+
|
|
72
|
+
const symbolAtCp = symbolAt(symbolOf)
|
|
28
73
|
|
|
29
74
|
/**
|
|
30
75
|
* Folds one rejected terminal into the furthest-failure record: further along
|
|
31
|
-
* replaces, the same
|
|
32
|
-
* discarded.
|
|
76
|
+
* replaces, the same cursor accumulates (ignoring repeats), earlier is
|
|
77
|
+
* discarded. The comparison is on the complete cursor, so a failure after EOF
|
|
78
|
+
* was consumed is further than one at the same physical index before it.
|
|
33
79
|
*
|
|
34
|
-
* @type {(failure:
|
|
80
|
+
* @type {(failure: _Failure, pos: Cursor, terminal: TerminalRange) => _Failure}
|
|
35
81
|
*/
|
|
36
|
-
const recordFailure = (failure,
|
|
37
|
-
if (
|
|
38
|
-
if (
|
|
39
|
-
return {
|
|
82
|
+
const recordFailure = (failure, pos, terminal) => {
|
|
83
|
+
if (pos > failure.pos) { return { pos, expected: [terminal] } }
|
|
84
|
+
if (pos < failure.pos || failure.expected.includes(terminal)) { return failure }
|
|
85
|
+
return { pos, expected: [...failure.expected, terminal] }
|
|
40
86
|
}
|
|
41
87
|
|
|
42
88
|
/**
|
|
43
|
-
* Creates a recursive descent parser
|
|
44
|
-
* code point.
|
|
89
|
+
* Creates a recursive descent parser from an already materialized
|
|
90
|
+
* {@link RuleSet}, preserving metadata for each consumed code point.
|
|
45
91
|
*
|
|
46
92
|
* @template T
|
|
47
|
-
* @param {
|
|
93
|
+
* @param {RuleSet} ruleSet
|
|
48
94
|
* @returns {DescentMatch<T>}
|
|
49
95
|
*/
|
|
50
|
-
export const
|
|
51
|
-
const
|
|
52
|
-
const emptyTags = emptyTagMap(data[0])
|
|
96
|
+
export const descentParserRuleSet = ruleSet => {
|
|
97
|
+
const emptyTags = emptyTagMap(ruleSet)
|
|
53
98
|
|
|
54
99
|
// A suspended sequence match: items[itemIndex] is being matched by the current
|
|
55
100
|
// task; `seq` holds the ASTs of the items already matched.
|
|
@@ -59,8 +104,8 @@ export const descentParser = fr => {
|
|
|
59
104
|
* readonly tag: AstTag
|
|
60
105
|
* readonly items: Sequence
|
|
61
106
|
* readonly itemIndex: number
|
|
62
|
-
* readonly
|
|
63
|
-
* readonly seq:
|
|
107
|
+
* readonly startPos: Cursor
|
|
108
|
+
* readonly seq: AstSequence<CodePointMeta<T>>
|
|
64
109
|
* }} _SeqFrame
|
|
65
110
|
*/
|
|
66
111
|
|
|
@@ -72,12 +117,30 @@ export const descentParser = fr => {
|
|
|
72
117
|
* readonly kind: 'variant'
|
|
73
118
|
* readonly entries: readonly (readonly [string, string])[]
|
|
74
119
|
* readonly entryIndex: number
|
|
75
|
-
* readonly
|
|
76
|
-
* readonly emptyResult:
|
|
120
|
+
* readonly pos: Cursor
|
|
121
|
+
* readonly emptyResult: _Result<T>
|
|
77
122
|
* }} _VariantFrame
|
|
78
123
|
*/
|
|
79
124
|
|
|
80
|
-
|
|
125
|
+
// A suspended repetition: `item` is being matched by the current task for the
|
|
126
|
+
// round that began at `roundStart`, and `items` holds the ASTs of the rounds
|
|
127
|
+
// that already completed. They accumulate as a list rather than an array
|
|
128
|
+
// because a repetition is as long as its input: appending to an array per
|
|
129
|
+
// round would copy the whole prefix each time and make one repetition
|
|
130
|
+
// quadratic in the number of items it matched.
|
|
131
|
+
/**
|
|
132
|
+
* @typedef {{
|
|
133
|
+
* readonly kind: 'repeat'
|
|
134
|
+
* readonly tag: AstTag
|
|
135
|
+
* readonly item: string
|
|
136
|
+
* readonly items: _Items
|
|
137
|
+
* readonly roundStart: Cursor
|
|
138
|
+
* }} _RepeatFrame
|
|
139
|
+
*/
|
|
140
|
+
|
|
141
|
+
/** @typedef {List<Ast<CodePointMeta<T>>>} _Items */
|
|
142
|
+
|
|
143
|
+
/** @typedef {_SeqFrame | _VariantFrame | _RepeatFrame} _Frame */
|
|
81
144
|
|
|
82
145
|
// Immutable cons-cell stack: O(1) push/pop, no array copying per step.
|
|
83
146
|
/**
|
|
@@ -91,12 +154,28 @@ export const descentParser = fr => {
|
|
|
91
154
|
// tuple), or null when a result is ready to resume the innermost frame.
|
|
92
155
|
/**
|
|
93
156
|
* @typedef {{
|
|
157
|
+
* readonly kind: 'rule'
|
|
94
158
|
* readonly name: string
|
|
95
159
|
* readonly tag: AstTag
|
|
96
|
-
* readonly
|
|
97
|
-
* }}
|
|
160
|
+
* readonly pos: Cursor
|
|
161
|
+
* }} _RuleTask
|
|
98
162
|
*/
|
|
99
163
|
|
|
164
|
+
// The next round of a repetition, about to be started. Both the rule that
|
|
165
|
+
// introduces a repetition and the frame that finishes one of its rounds go
|
|
166
|
+
// through this, so a round is set up in exactly one place.
|
|
167
|
+
/**
|
|
168
|
+
* @typedef {{
|
|
169
|
+
* readonly kind: 'repeat'
|
|
170
|
+
* readonly tag: AstTag
|
|
171
|
+
* readonly item: string
|
|
172
|
+
* readonly items: _Items
|
|
173
|
+
* readonly pos: Cursor
|
|
174
|
+
* }} _RepeatTask
|
|
175
|
+
*/
|
|
176
|
+
|
|
177
|
+
/** @typedef {_RuleTask | _RepeatTask} _Task */
|
|
178
|
+
|
|
100
179
|
// The recursive-descent matcher as an explicit-stack machine: each iteration either
|
|
101
180
|
// starts the current task (pushing a frame for a sequence/variant and descending into
|
|
102
181
|
// its first child) or feeds the pending result into the innermost frame. Semantics are
|
|
@@ -104,97 +183,130 @@ export const descentParser = fr => {
|
|
|
104
183
|
// grammar recursion depth — right-recursive rules (e.g. repeat0Plus chains) no longer
|
|
105
184
|
// overflow on long input (see the longInput proof group).
|
|
106
185
|
/** @type {DescentMatchRule<T>} */
|
|
107
|
-
const f = (name, tag, cp,
|
|
108
|
-
|
|
109
|
-
const mrSuccess = (tag, sequence, idx) => ({ ast: {tag, sequence}, success: true, idx })
|
|
110
|
-
/** @type {(tag: AstTag, sequence: AstSequenceMeta<T>, idx: number) => DescentMatchResult<T>} */
|
|
111
|
-
const mrFail = (tag, sequence, idx) => ({ ast: {tag, sequence}, success: false, idx })
|
|
186
|
+
const f = (name, tag, cp, startPos) => {
|
|
187
|
+
const physical = physicalIdx(cp.length)
|
|
112
188
|
|
|
113
189
|
/** @type {_Stack} */
|
|
114
190
|
let stack = null
|
|
115
191
|
/** @type {_Task | null} */
|
|
116
|
-
let task = { name, tag,
|
|
117
|
-
/** @type {
|
|
118
|
-
let result = mrFail(undefined, [],
|
|
192
|
+
let task = { kind: 'rule', name, tag, pos: startPos }
|
|
193
|
+
/** @type {_Result<T>} */
|
|
194
|
+
let result = mrFail(undefined, [], startPos)
|
|
119
195
|
// High-water mark across the whole match, so it survives the rewinds a
|
|
120
196
|
// failing sequence item does to `result`.
|
|
121
|
-
/** @type {
|
|
122
|
-
let furthest = {
|
|
197
|
+
/** @type {_Failure} */
|
|
198
|
+
let furthest = { pos: 0, expected: [] }
|
|
123
199
|
|
|
124
200
|
while (true) {
|
|
125
201
|
if (task !== null) {
|
|
126
202
|
// The explicit annotation cuts a control-flow inference cycle (TS7022):
|
|
127
203
|
// `name`'s narrowed type feeds `rule`, whose type would otherwise feed the
|
|
128
204
|
// later `task` assignments that `name`'s narrowing depends on.
|
|
129
|
-
const
|
|
205
|
+
const current = /** @type {_Task} */ (task)
|
|
130
206
|
task = null
|
|
207
|
+
if (current.kind === 'repeat') {
|
|
208
|
+
// One round of a repetition is one match of its item, so the
|
|
209
|
+
// frame below carries the rounds already collected and the
|
|
210
|
+
// position this round may have to rewind to.
|
|
211
|
+
stack = { top: { kind: 'repeat', tag: current.tag, item: current.item, items: current.items, roundStart: current.pos }, rest: stack }
|
|
212
|
+
task = { kind: 'rule', name: current.item, tag: undefined, pos: current.pos }
|
|
213
|
+
continue
|
|
214
|
+
}
|
|
215
|
+
const { name, tag, pos } = current
|
|
131
216
|
/** @type {DataRule} */
|
|
132
|
-
const rule =
|
|
217
|
+
const rule = ruleSet[name]
|
|
133
218
|
if (typeof rule === 'number') {
|
|
134
219
|
// No nullable case: `emptyTagOf` in `bnf/data` returns `undefined`
|
|
135
220
|
// for every terminal, so `emptyTags[name]` here is always
|
|
136
221
|
// `undefined` and a terminal either consumes one symbol or fails.
|
|
137
|
-
|
|
138
|
-
|
|
222
|
+
// Past the synthesized EOF there is no symbol left to consume.
|
|
223
|
+
if (pos <= cp.length && rangeContains(...rangeDecode(rule))(symbolAtCp(cp, pos))) {
|
|
224
|
+
result = mrSuccess(tag, leafAt(cp, pos), pos + 1)
|
|
139
225
|
} else {
|
|
140
226
|
// The only place a terminal is rejected, so the only place
|
|
141
227
|
// the furthest failure can advance.
|
|
142
|
-
furthest = recordFailure(furthest,
|
|
143
|
-
result = mrFail(undefined, [],
|
|
228
|
+
furthest = recordFailure(furthest, pos, rule)
|
|
229
|
+
result = mrFail(undefined, [], pos)
|
|
144
230
|
}
|
|
145
231
|
} else if (rule instanceof Array) {
|
|
146
232
|
if (rule.length === 0) {
|
|
147
|
-
result = mrSuccess(tag, [],
|
|
233
|
+
result = mrSuccess(tag, [], pos)
|
|
148
234
|
} else {
|
|
149
|
-
stack = { top: { kind: 'seq', tag, items: rule, itemIndex: 0,
|
|
150
|
-
task = { name: rule[0], tag: undefined,
|
|
235
|
+
stack = { top: { kind: 'seq', tag, items: rule, itemIndex: 0, startPos: pos, seq: [] }, rest: stack }
|
|
236
|
+
task = { kind: 'rule', name: rule[0], tag: undefined, pos }
|
|
151
237
|
}
|
|
238
|
+
} else if (isRepeat(rule)) {
|
|
239
|
+
task = { kind: 'repeat', tag, item: rule, items: null, pos }
|
|
152
240
|
} else {
|
|
153
241
|
const entries = definedEntries(rule)
|
|
154
242
|
const emptyTag = emptyTags[name]
|
|
155
|
-
const emptyResult = mrFail(emptyTag, [],
|
|
243
|
+
const emptyResult = mrFail(emptyTag, [], pos)
|
|
156
244
|
if (entries.length === 0) {
|
|
157
245
|
result = emptyResult
|
|
158
246
|
} else {
|
|
159
|
-
stack = { top: { kind: 'variant', entries, entryIndex: 0,
|
|
247
|
+
stack = { top: { kind: 'variant', entries, entryIndex: 0, pos, emptyResult }, rest: stack }
|
|
160
248
|
const [entryTag, entryName] = entries[0]
|
|
161
|
-
task = { name: entryName, tag: entryTag,
|
|
249
|
+
task = { kind: 'rule', name: entryName, tag: entryTag, pos }
|
|
162
250
|
}
|
|
163
251
|
}
|
|
164
252
|
continue
|
|
165
253
|
}
|
|
166
254
|
|
|
167
255
|
if (stack === null) {
|
|
256
|
+
const { ast, success, pos } = result
|
|
257
|
+
/** @type {DescentMatchResult<T>} */
|
|
258
|
+
const mr = { ast, success, idx: physical(pos) }
|
|
168
259
|
// A success has nothing to diagnose; only a failure carries it.
|
|
169
|
-
return
|
|
260
|
+
return success
|
|
261
|
+
? mr
|
|
262
|
+
: { ...mr, failure: { idx: physical(furthest.pos), expected: furthest.expected } }
|
|
170
263
|
}
|
|
171
264
|
const frame = stack.top
|
|
172
265
|
stack = stack.rest
|
|
173
266
|
|
|
174
267
|
if (frame.kind === 'seq') {
|
|
175
|
-
const { ast: astRule, success,
|
|
268
|
+
const { ast: astRule, success, pos } = result
|
|
176
269
|
if (success === false) {
|
|
177
|
-
result = mrFail(frame.tag, [], frame.
|
|
270
|
+
result = mrFail(frame.tag, [], frame.startPos)
|
|
178
271
|
} else {
|
|
179
272
|
const seq = [...frame.seq, astRule]
|
|
180
273
|
const itemIndex = frame.itemIndex + 1
|
|
181
274
|
if (itemIndex < frame.items.length) {
|
|
182
275
|
stack = { top: { ...frame, itemIndex, seq }, rest: stack }
|
|
183
|
-
task = { name: frame.items[itemIndex], tag: undefined,
|
|
276
|
+
task = { kind: 'rule', name: frame.items[itemIndex], tag: undefined, pos }
|
|
277
|
+
} else {
|
|
278
|
+
result = mrSuccess(frame.tag, seq, pos)
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
} else if (frame.kind === 'repeat') {
|
|
282
|
+
if (result.success === false) {
|
|
283
|
+
// A round that fails ends the repetition instead of failing
|
|
284
|
+
// it: the rounds before it stand, and the whole match rewinds
|
|
285
|
+
// to where the failed round began.
|
|
286
|
+
result = mrSuccess(frame.tag, toArray(frame.items), frame.roundStart)
|
|
287
|
+
} else {
|
|
288
|
+
const items = concat(frame.items)([result.ast])
|
|
289
|
+
if (result.pos === frame.roundStart) {
|
|
290
|
+
// A round that consumed nothing would repeat forever. Only
|
|
291
|
+
// a hand-written `repeat` over a nullable rule reaches
|
|
292
|
+
// this — `toData` never derives one — so keep the one
|
|
293
|
+
// empty round and stop.
|
|
294
|
+
result = mrSuccess(frame.tag, toArray(items), result.pos)
|
|
184
295
|
} else {
|
|
185
|
-
|
|
296
|
+
task = { kind: 'repeat', tag: frame.tag, item: frame.item, items, pos: result.pos }
|
|
186
297
|
}
|
|
187
298
|
}
|
|
188
299
|
} else {
|
|
189
300
|
// success that consumed input wins immediately: the frame stays popped and
|
|
190
301
|
// `result` propagates to the frame below, matching the recursive `return m`.
|
|
191
|
-
|
|
302
|
+
// Consuming EOF counts as consumption, because the cursor moved.
|
|
303
|
+
if (!(result.success && frame.pos !== result.pos)) {
|
|
192
304
|
const emptyResult = result.success ? result : frame.emptyResult
|
|
193
305
|
const entryIndex = frame.entryIndex + 1
|
|
194
306
|
if (entryIndex < frame.entries.length) {
|
|
195
307
|
stack = { top: { ...frame, entryIndex, emptyResult }, rest: stack }
|
|
196
308
|
const [entryTag, entryName] = frame.entries[entryIndex]
|
|
197
|
-
task = { name: entryName, tag: entryTag,
|
|
309
|
+
task = { kind: 'rule', name: entryName, tag: entryTag, pos: frame.pos }
|
|
198
310
|
} else {
|
|
199
311
|
result = emptyResult
|
|
200
312
|
}
|
|
@@ -210,3 +322,13 @@ export const descentParser = fr => {
|
|
|
210
322
|
|
|
211
323
|
return match
|
|
212
324
|
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Creates a recursive descent parser that preserves metadata for each consumed
|
|
328
|
+
* code point.
|
|
329
|
+
*
|
|
330
|
+
* @template T
|
|
331
|
+
* @param {FRule} fr
|
|
332
|
+
* @returns {DescentMatch<T>}
|
|
333
|
+
*/
|
|
334
|
+
export const descentParser = fr => descentParserRuleSet(toData(fr)[0])
|
|
@@ -2,6 +2,7 @@
|
|
|
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
|
export declare const proof: {
|
|
@@ -9,5 +10,7 @@ export declare const proof: {
|
|
|
9
10
|
descentParser: (() => void)[];
|
|
10
11
|
longInput: (() => void)[];
|
|
11
12
|
descentParserWithMeta: (() => void)[];
|
|
13
|
+
logicalEof: (() => void)[];
|
|
14
|
+
repeat: (() => void)[];
|
|
12
15
|
furthestFailure: (() => void)[];
|
|
13
16
|
};
|