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/ll1/module.f.mjs
CHANGED
|
@@ -4,28 +4,48 @@
|
|
|
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
37
|
|
|
22
38
|
import { strictEqual } from '../../types/function/operator/module.f.mjs'
|
|
23
|
-
import {
|
|
39
|
+
import { assertNotNullish } from '../../asserts/module.f.mjs'
|
|
40
|
+
import { identity } from '../../types/function/module.f.mjs'
|
|
41
|
+
import { concat, toArray } from '../../types/list/module.f.mjs'
|
|
24
42
|
import { rangeMap } from '../../types/range_map/module.f.mjs'
|
|
43
|
+
import { contains as rangeContains } from '../../types/range/module.f.mjs'
|
|
25
44
|
import { contains, set } from '../../types/string_set/module.f.mjs'
|
|
26
45
|
import { rangeDecode } from '../module.f.mjs'
|
|
27
46
|
import { definedEntries } from '../../types/object/module.f.mjs'
|
|
28
|
-
import { emptyTagMap, toData } from '../data/module.f.mjs'
|
|
47
|
+
import { emptyTagMap, isRepeat, toData } from '../data/module.f.mjs'
|
|
48
|
+
import { leafAt, mrFail, mrSuccess, physicalIdx, symbolAt } from '../matcher/module.f.mjs'
|
|
29
49
|
|
|
30
50
|
/** @type {Properties<_DispatchResult>} */
|
|
31
51
|
const dispatchProps = {
|
|
@@ -47,83 +67,81 @@ const dispatchOp = rangeMap(dispatchProps)
|
|
|
47
67
|
/**
|
|
48
68
|
* Builds a dispatch map for a {@link RuleSet} to enable predictive parsing.
|
|
49
69
|
*
|
|
70
|
+
* Each rule's entry holds the rule's first set as a range map. Only a variant
|
|
71
|
+
* reads the value under a symbol — the branch that lookahead selects; every
|
|
72
|
+
* other reader asks whether a symbol is in the set at all, which is how a
|
|
73
|
+
* repetition decides to start another round. `empty` is the branch a variant
|
|
74
|
+
* takes when no entry matches the lookahead — its nullable branch, absent
|
|
75
|
+
* when the variant cannot match empty.
|
|
76
|
+
*
|
|
77
|
+
* A rule referenced in first position while its own first set is still being
|
|
78
|
+
* computed is left recursion — a grammar no lookahead can decide, whose match
|
|
79
|
+
* would loop at the same position forever — so building throws
|
|
80
|
+
* (`left recursion …`) rather than letting the matcher diverge. The one
|
|
81
|
+
* self-reference with a sound reading is a repetition of itself: zero rounds
|
|
82
|
+
* match whatever the item does, so it dispatches on nothing and matches empty.
|
|
83
|
+
*
|
|
50
84
|
* @type {(ruleSet: RuleSet) => _DispatchMap}
|
|
51
85
|
*/
|
|
52
86
|
export const dispatchMap = ruleSet => {
|
|
53
87
|
|
|
54
88
|
const nullMap = emptyTagMap(ruleSet)
|
|
55
89
|
|
|
56
|
-
/** @type {(dr: _DispatchResult, name: string) => _DispatchResult} */
|
|
57
|
-
const addRuleToDispatch = (dr, name) => {
|
|
58
|
-
if (dr === null)
|
|
59
|
-
return null
|
|
60
|
-
|
|
61
|
-
return { tag: dr.tag, rules: [...dr.rules, name]}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/** @type {(dr: _DispatchResult, tag: string) => _DispatchResult} */
|
|
65
|
-
const addTagToDispatch = (dr, tag) => {
|
|
66
|
-
if (dr === null)
|
|
67
|
-
return null
|
|
68
|
-
|
|
69
|
-
return { tag, rules: dr.rules}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
90
|
/** @type {(dm: _DispatchMap, name: string, current: StringSet) => _DispatchMap} */
|
|
73
91
|
const dispatchRule = (dm, name, current) => {
|
|
74
92
|
if (name in dm) { return dm }
|
|
75
93
|
const newCurrent = set(name)(current)
|
|
76
94
|
const rule = ruleSet[name]
|
|
95
|
+
/** @type {_DispatchRule} */
|
|
96
|
+
let dr
|
|
77
97
|
if (typeof rule === 'number') {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
return { ...dm, [name]: dr }
|
|
98
|
+
dr = {
|
|
99
|
+
empty: undefined,
|
|
100
|
+
rangeMap: dispatchOp.fromRange({ tag: undefined, name })(rangeDecode(rule)),
|
|
101
|
+
}
|
|
83
102
|
} else if (rule instanceof Array) {
|
|
84
|
-
|
|
85
|
-
|
|
103
|
+
// A sequence's first set is the union of its items' first sets up
|
|
104
|
+
// to and including the first item that cannot match empty.
|
|
86
105
|
/** @type {_Dispatch} */
|
|
87
|
-
let
|
|
106
|
+
let first = []
|
|
88
107
|
for (const item of rule) {
|
|
89
108
|
if (contains(item)(newCurrent)) {
|
|
90
|
-
|
|
91
|
-
} else {
|
|
92
|
-
dm = dispatchRule(dm, item, newCurrent)
|
|
93
|
-
const dr = /** @type {_DispatchRule} */ (dm[item])
|
|
94
|
-
if (emptyTag === true) {
|
|
95
|
-
result = result.map(x => [addRuleToDispatch(x[0], item), x[1]])
|
|
96
|
-
result = toArray(dispatchOp.merge(result)(dr.rangeMap))
|
|
97
|
-
emptyTag = nullMap[item] !== undefined ? true : undefined
|
|
98
|
-
} else {
|
|
99
|
-
result = result.map(x => [addRuleToDispatch(x[0], item), x[1]])
|
|
100
|
-
}
|
|
109
|
+
throw ['left recursion [', name, '][', item, ']']
|
|
101
110
|
}
|
|
111
|
+
dm = dispatchRule(dm, item, newCurrent)
|
|
112
|
+
first = toArray(dispatchOp.merge(first)(assertNotNullish(dm[item]).rangeMap))
|
|
113
|
+
if (nullMap[item] === undefined) { break }
|
|
102
114
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
115
|
+
dr = { empty: undefined, rangeMap: first }
|
|
116
|
+
} else if (isRepeat(rule)) {
|
|
117
|
+
// Zero rounds always match, so a repetition needs no `empty`
|
|
118
|
+
// branch; its first set is its item's. A repetition of itself has
|
|
119
|
+
// no first set to dispatch on, so it can only match zero rounds —
|
|
120
|
+
// `toData` never derives one, but a hand-written rule set can.
|
|
121
|
+
dm = contains(rule)(newCurrent) ? dm : dispatchRule(dm, rule, newCurrent)
|
|
122
|
+
const itemDr = dm[rule]
|
|
123
|
+
dr = { empty: undefined, rangeMap: itemDr === undefined ? [] : itemDr.rangeMap }
|
|
106
124
|
} else {
|
|
107
|
-
const entries = definedEntries(rule)
|
|
108
125
|
/** @type {_Dispatch} */
|
|
109
|
-
let
|
|
110
|
-
/** @type {
|
|
111
|
-
let
|
|
112
|
-
for (const [tag, item] of
|
|
126
|
+
let first = []
|
|
127
|
+
/** @type {_DispatchBranch | undefined} */
|
|
128
|
+
let empty = undefined
|
|
129
|
+
for (const [tag, item] of definedEntries(rule)) {
|
|
130
|
+
if (contains(item)(newCurrent)) {
|
|
131
|
+
throw ['left recursion [', name, '][', item, ']']
|
|
132
|
+
}
|
|
113
133
|
dm = dispatchRule(dm, item, newCurrent)
|
|
114
|
-
|
|
134
|
+
/** @type {_Dispatch} */
|
|
135
|
+
const d = assertNotNullish(dm[item]).rangeMap
|
|
136
|
+
.map(x => [x[0] === null ? null : { tag, name: item }, x[1]])
|
|
137
|
+
first = toArray(dispatchOp.merge(first)(d))
|
|
115
138
|
if (nullMap[item] !== undefined) {
|
|
116
|
-
|
|
117
|
-
} else {
|
|
118
|
-
/** @type {_Dispatch} */
|
|
119
|
-
const d = dr.rangeMap.map(x => [addTagToDispatch(x[0], tag), x[1]])
|
|
120
|
-
result = toArray(dispatchOp.merge(result)(d))
|
|
139
|
+
empty = { tag, name: item }
|
|
121
140
|
}
|
|
122
141
|
}
|
|
123
|
-
|
|
124
|
-
const dr = {emptyTag, rangeMap: result}
|
|
125
|
-
return { ...dm, [name]: dr}
|
|
142
|
+
dr = { empty, rangeMap: first }
|
|
126
143
|
}
|
|
144
|
+
return { ...dm, [name]: dr }
|
|
127
145
|
}
|
|
128
146
|
|
|
129
147
|
/** @type {_DispatchMap} */
|
|
@@ -145,13 +163,108 @@ export const parser = fr => {
|
|
|
145
163
|
return parserRuleSet(data[0])
|
|
146
164
|
}
|
|
147
165
|
|
|
148
|
-
/**
|
|
149
|
-
|
|
150
|
-
|
|
166
|
+
/**
|
|
167
|
+
* Where a match stopped: a {@link Cursor}, or `null` when it ran out of input —
|
|
168
|
+
* the `null` {@link Remainder} this backend reports for that.
|
|
169
|
+
*
|
|
170
|
+
* @typedef {Cursor|null} _Position
|
|
171
|
+
*/
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* The machine's own result: a {@link MatchResult} positioned by a cursor
|
|
175
|
+
* instead of by a materialized remainder.
|
|
176
|
+
*
|
|
177
|
+
* @typedef {AstResult<CodePoint, _Position>} _Result
|
|
178
|
+
*/
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* A suspended sequence match: `items[itemIndex]` is being matched by the
|
|
182
|
+
* current task, and `seq` holds the ASTs of the items already matched.
|
|
183
|
+
*
|
|
184
|
+
* @typedef {{
|
|
185
|
+
* readonly kind: 'seq'
|
|
186
|
+
* readonly tag: AstTag
|
|
187
|
+
* readonly items: Sequence
|
|
188
|
+
* readonly itemIndex: number
|
|
189
|
+
* readonly seq: AstSequence<CodePoint>
|
|
190
|
+
* }} _SeqFrame
|
|
191
|
+
*/
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* A suspended repetition: the item is being matched by the current task for
|
|
195
|
+
* one more round, and `items` holds the ASTs of the rounds that already
|
|
196
|
+
* completed. They accumulate as a list rather than an array because a
|
|
197
|
+
* repetition is as long as its input: appending to an array per round would
|
|
198
|
+
* copy the whole prefix each time and make one repetition quadratic in the
|
|
199
|
+
* number of items it matched.
|
|
200
|
+
*
|
|
201
|
+
* @typedef {{
|
|
202
|
+
* readonly kind: 'repeat'
|
|
203
|
+
* readonly tag: AstTag
|
|
204
|
+
* readonly item: string
|
|
205
|
+
* readonly items: _Items
|
|
206
|
+
* }} _RepeatFrame
|
|
207
|
+
*/
|
|
208
|
+
|
|
209
|
+
/** @typedef {List<Ast<CodePoint>>} _Items */
|
|
210
|
+
|
|
211
|
+
/** @typedef {_SeqFrame | _RepeatFrame} _Frame */
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Immutable cons-cell stack: O(1) push/pop, no array copying per step.
|
|
215
|
+
*
|
|
216
|
+
* @typedef {null | {
|
|
217
|
+
* readonly top: _Frame
|
|
218
|
+
* readonly rest: _Stack
|
|
219
|
+
* }} _Stack
|
|
220
|
+
*/
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* The rule invocation about to be evaluated, or `null` when a result is ready
|
|
224
|
+
* to resume the innermost frame instead.
|
|
225
|
+
*
|
|
226
|
+
* @typedef {{
|
|
227
|
+
* readonly kind: 'rule'
|
|
228
|
+
* readonly name: string
|
|
229
|
+
* readonly tag: AstTag
|
|
230
|
+
* readonly pos: Cursor
|
|
231
|
+
* }} _RuleTask
|
|
232
|
+
*/
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* The next round of a repetition, about to be decided by lookahead. Both the
|
|
236
|
+
* rule that introduces a repetition and the frame that finishes one of its
|
|
237
|
+
* rounds go through this, so a round is set up in exactly one place.
|
|
238
|
+
*
|
|
239
|
+
* @typedef {{
|
|
240
|
+
* readonly kind: 'repeat'
|
|
241
|
+
* readonly tag: AstTag
|
|
242
|
+
* readonly item: string
|
|
243
|
+
* readonly items: _Items
|
|
244
|
+
* readonly pos: Cursor
|
|
245
|
+
* }} _RepeatTask
|
|
246
|
+
*/
|
|
247
|
+
|
|
248
|
+
/** @typedef {_RuleTask | _RepeatTask} _Task */
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* A leaf here is the code point itself, so it *is* its own symbol. The
|
|
252
|
+
* annotation pins `identity`'s type parameter, which `symbolAt`'s own cannot
|
|
253
|
+
* infer from a fully generic argument.
|
|
254
|
+
*
|
|
255
|
+
* @type {(leaf: CodePoint) => number}
|
|
256
|
+
*/
|
|
257
|
+
const symbolOf = identity
|
|
258
|
+
|
|
259
|
+
const symbolAtCp = symbolAt(symbolOf)
|
|
151
260
|
|
|
152
|
-
/**
|
|
153
|
-
|
|
154
|
-
|
|
261
|
+
/**
|
|
262
|
+
* The public remainder of a position. It stays physical, so consuming EOF
|
|
263
|
+
* leaves it empty; the slice is materialized once, at the end of a match.
|
|
264
|
+
*
|
|
265
|
+
* @type {(cp: readonly CodePoint[], pos: _Position) => Remainder}
|
|
266
|
+
*/
|
|
267
|
+
const remainderAt = (cp, pos) => pos === null ? null : cp.slice(physicalIdx(cp.length)(pos))
|
|
155
268
|
|
|
156
269
|
/**
|
|
157
270
|
* Creates an LL(1) parser from an already materialized {@link RuleSet}.
|
|
@@ -161,39 +274,128 @@ const mrFail = (tag, sequence, r) =>
|
|
|
161
274
|
export const parserRuleSet = ruleSet => {
|
|
162
275
|
const map = dispatchMap(ruleSet)
|
|
163
276
|
|
|
164
|
-
/** @type {
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
277
|
+
/** @type {(name: string) => _DispatchRule} */
|
|
278
|
+
const dispatched = name => assertNotNullish(map[name])
|
|
279
|
+
|
|
280
|
+
// The matcher as an explicit-stack machine, the same shape as the sibling
|
|
281
|
+
// `bnf/descent` matcher's: each iteration either starts the current task
|
|
282
|
+
// (walking one rule of the grammar) or feeds the pending result into the
|
|
283
|
+
// innermost frame. The JS call stack stays O(1) however deeply the grammar
|
|
284
|
+
// recurses — nesting depth grows with input length, so a few thousand code
|
|
285
|
+
// points used to overflow a recursive matcher (see the longInput proof
|
|
286
|
+
// group). Positions are cursors into the shared input array for the same
|
|
287
|
+
// reason: re-slicing the remainder per step made a match quadratic.
|
|
288
|
+
//
|
|
289
|
+
// Unlike `bnf/descent` it never backtracks: the dispatch map decides every
|
|
290
|
+
// choice from the lookahead symbol, so a cursor only moves forward and no
|
|
291
|
+
// frame needs rewind state.
|
|
292
|
+
/** @type {(name: string, cp: readonly CodePoint[]) => MatchResult} */
|
|
293
|
+
const f = (name, cp) => {
|
|
294
|
+
/** @type {_Stack} */
|
|
295
|
+
let stack = null
|
|
296
|
+
/** @type {_Task|null} */
|
|
297
|
+
let task = {kind: 'rule', name, tag: undefined, pos: 0}
|
|
298
|
+
/** @type {_Result} */
|
|
299
|
+
let result = mrFail(undefined, [], 0)
|
|
300
|
+
|
|
301
|
+
while (true) {
|
|
302
|
+
if (task !== null) {
|
|
303
|
+
// The explicit cast cuts a control-flow inference cycle
|
|
304
|
+
// (TS7022): `task`'s narrowed type feeds `pos`, which feeds the
|
|
305
|
+
// `task` assignment below that the narrowing depends on.
|
|
306
|
+
const current = /** @type {_Task} */ (task)
|
|
307
|
+
task = null
|
|
308
|
+
if (current.kind === 'repeat') {
|
|
309
|
+
const {tag, item, items, pos} = current
|
|
310
|
+
// One more round starts exactly while the lookahead is in
|
|
311
|
+
// the item's first set. Predictive selection cannot start a
|
|
312
|
+
// round that consumes nothing, so every round advances the
|
|
313
|
+
// cursor and the repetition always terminates.
|
|
314
|
+
if (pos <= cp.length && dispatchOp.get(dispatched(item).rangeMap)(symbolAtCp(cp, pos)) !== null) {
|
|
315
|
+
stack = {top: {kind: 'repeat', tag, item, items}, rest: stack}
|
|
316
|
+
task = {kind: 'rule', name: item, tag: undefined, pos}
|
|
317
|
+
} else {
|
|
318
|
+
result = mrSuccess(tag, toArray(items), pos)
|
|
319
|
+
}
|
|
320
|
+
continue
|
|
321
|
+
}
|
|
322
|
+
const {name, tag, pos} = current
|
|
323
|
+
const rule = ruleSet[name]
|
|
324
|
+
if (typeof rule === 'number') {
|
|
325
|
+
// The one logical EOF is available at the physical end, and
|
|
326
|
+
// only there: a terminal that matches it consumes it, once.
|
|
327
|
+
// Past it no symbol is left to consume.
|
|
328
|
+
if (pos <= cp.length && rangeContains(...rangeDecode(rule))(symbolAtCp(cp, pos))) {
|
|
329
|
+
result = mrSuccess(tag, leafAt(cp, pos), pos + 1)
|
|
330
|
+
} else if (pos >= cp.length) {
|
|
331
|
+
// Nothing left to reject: the match ran out of input.
|
|
332
|
+
result = mrSuccess(undefined, [], null)
|
|
333
|
+
} else {
|
|
334
|
+
result = mrFail(undefined, [], pos)
|
|
335
|
+
}
|
|
336
|
+
} else if (rule instanceof Array) {
|
|
337
|
+
if (rule.length === 0) {
|
|
338
|
+
result = mrSuccess(tag, [], pos)
|
|
339
|
+
} else {
|
|
340
|
+
stack = {top: {kind: 'seq', tag, items: rule, itemIndex: 0, seq: []}, rest: stack}
|
|
341
|
+
task = {kind: 'rule', name: rule[0], tag: undefined, pos}
|
|
342
|
+
}
|
|
343
|
+
} else if (isRepeat(rule)) {
|
|
344
|
+
task = {kind: 'repeat', tag, item: rule, items: null, pos}
|
|
345
|
+
} else {
|
|
346
|
+
const {empty, rangeMap} = dispatched(name)
|
|
347
|
+
const d = pos > cp.length ? null : dispatchOp.get(rangeMap)(symbolAtCp(cp, pos))
|
|
348
|
+
const branch = d ?? empty
|
|
349
|
+
if (branch !== undefined) {
|
|
350
|
+
// The selected branch's node becomes the variant's,
|
|
351
|
+
// carrying the branch's tag — entered before its first
|
|
352
|
+
// symbol is consumed, like every rule invocation.
|
|
353
|
+
task = {kind: 'rule', name: branch.name, tag: branch.tag, pos}
|
|
354
|
+
} else if (pos >= cp.length) {
|
|
355
|
+
result = mrSuccess(undefined, [], null)
|
|
356
|
+
} else {
|
|
357
|
+
result = mrFail(undefined, [], pos)
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
continue
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
if (stack === null) {
|
|
364
|
+
const {ast, success, pos} = result
|
|
365
|
+
return [ast, success, remainderAt(cp, pos)]
|
|
188
366
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
367
|
+
const frame = stack.top
|
|
368
|
+
stack = stack.rest
|
|
369
|
+
|
|
370
|
+
const {ast, success, pos} = result
|
|
371
|
+
// A failing rule fails everything above it: LL(1) committed to
|
|
372
|
+
// every choice on the way here, so there is nothing to rewind and
|
|
373
|
+
// retry, and the failure propagates unchanged — its position is
|
|
374
|
+
// where matching stopped.
|
|
375
|
+
if (success === false) { continue }
|
|
376
|
+
if (frame.kind === 'seq') {
|
|
377
|
+
const seq = [...frame.seq, ast]
|
|
378
|
+
if (pos === null) {
|
|
379
|
+
result = mrSuccess(frame.tag, seq, null)
|
|
380
|
+
} else {
|
|
381
|
+
const itemIndex = frame.itemIndex + 1
|
|
382
|
+
if (itemIndex < frame.items.length) {
|
|
383
|
+
stack = {top: {...frame, itemIndex, seq}, rest: stack}
|
|
384
|
+
task = {kind: 'rule', name: frame.items[itemIndex], tag: undefined, pos}
|
|
385
|
+
} else {
|
|
386
|
+
result = mrSuccess(frame.tag, seq, pos)
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
} else {
|
|
390
|
+
const items = concat(frame.items)([ast])
|
|
391
|
+
if (pos === null) {
|
|
392
|
+
result = mrSuccess(frame.tag, toArray(items), null)
|
|
393
|
+
} else {
|
|
394
|
+
task = {kind: 'repeat', tag: frame.tag, item: frame.item, items, pos}
|
|
395
|
+
}
|
|
192
396
|
}
|
|
193
|
-
r = newR
|
|
194
397
|
}
|
|
195
|
-
return mrSuccess(tag, seq, r)
|
|
196
398
|
}
|
|
197
399
|
|
|
198
|
-
return
|
|
400
|
+
return f
|
|
199
401
|
}
|
|
@@ -1,16 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @
|
|
3
|
-
*
|
|
2
|
+
* @import { CodePoint } from '../../text/utf16/types.ts'
|
|
4
3
|
* @import { RuleSet } from '../data/types.ts'
|
|
4
|
+
* @import { CodePointMeta } from '../descent/types.ts'
|
|
5
|
+
* @import { Rule as FRule } from '../types.ts'
|
|
5
6
|
* @import { MatchResult } from './types.ts'
|
|
6
7
|
*/
|
|
7
8
|
export declare const proof: {
|
|
8
9
|
dispatch: (() => void)[];
|
|
9
10
|
parser: (() => void)[];
|
|
11
|
+
longInput: (() => void)[];
|
|
12
|
+
logicalEof: (() => void)[];
|
|
10
13
|
repeat: (() => void)[];
|
|
11
14
|
repeatParser: (() => void)[];
|
|
15
|
+
descentEquivalence: {
|
|
16
|
+
leadingItem: () => void;
|
|
17
|
+
variant: () => void;
|
|
18
|
+
skippedOption: () => void;
|
|
19
|
+
takenOption: () => void;
|
|
20
|
+
repetition: () => void;
|
|
21
|
+
nesting: () => void;
|
|
22
|
+
repetitionInNullablePrefix: () => void;
|
|
23
|
+
emptyRepetitionInNullablePrefix: () => void;
|
|
24
|
+
};
|
|
12
25
|
throw: {
|
|
13
26
|
ambiguousVariantDispatch: () => void;
|
|
27
|
+
leftRecursiveSequence: () => void;
|
|
28
|
+
leftRecursiveVariant: () => void;
|
|
14
29
|
};
|
|
15
30
|
cyclicNullability: () => void;
|
|
16
31
|
};
|