functionalscript 0.37.0 → 0.38.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 +1 -1
- package/{fs → fjs}/asn.1/proof.f.js +32 -94
- package/fjs/asserts/module.f.d.ts +36 -0
- package/fjs/asserts/module.f.js +39 -0
- package/fjs/asserts/proof.f.d.ts +11 -0
- package/fjs/asserts/proof.f.js +18 -0
- package/{fs → fjs}/base_n/proof.f.js +12 -36
- package/{fs → fjs}/basen/base64/proof.f.d.ts +1 -0
- package/{fs → fjs}/basen/base64/proof.f.js +15 -1
- package/{fs → fjs}/basen/cbase32/proof.f.js +15 -42
- package/fjs/bnf/data/module.f.d.ts +52 -0
- package/{fs → fjs}/bnf/data/module.f.js +53 -3
- package/{fs → fjs}/bnf/data/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/data/proof.f.js +54 -19
- package/{fs → fjs}/bnf/descent/module.f.d.ts +4 -14
- package/fjs/bnf/descent/module.f.js +124 -0
- package/{fs → fjs}/bnf/descent/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/descent/proof.f.js +55 -24
- package/{fs → fjs}/bnf/ll1/module.f.d.ts +4 -4
- package/{fs → fjs}/bnf/ll1/module.f.js +7 -5
- package/{fs → fjs}/bnf/ll1/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/ll1/proof.f.js +27 -10
- package/{fs → fjs}/bnf/module.f.d.ts +19 -5
- package/{fs → fjs}/bnf/module.f.js +10 -11
- package/fjs/bnf/proof.f.js +69 -0
- package/{fs → fjs}/bnf/testlib.f.js +2 -2
- package/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/cli/proof.f.js +29 -66
- package/fjs/cas/evo/mcp/module.f.d.ts +19 -0
- package/fjs/cas/evo/mcp/module.f.js +56 -0
- package/fjs/cas/evo/mcp/proof.f.d.ts +9 -0
- package/fjs/cas/evo/mcp/proof.f.js +95 -0
- package/fjs/cas/evo/module.f.d.ts +138 -0
- package/fjs/cas/evo/module.f.js +309 -0
- package/fjs/cas/evo/proof.f.d.ts +32 -0
- package/fjs/cas/evo/proof.f.js +453 -0
- package/fjs/cas/mcp/module.f.d.ts +49 -0
- package/{fs → fjs}/cas/mcp/module.f.js +54 -76
- package/{fs → fjs}/cas/mcp/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/mcp/proof.f.js +41 -13
- package/{fs → fjs}/cas/module.f.d.ts +10 -0
- package/{fs → fjs}/cas/module.f.js +27 -1
- package/{fs → fjs}/cas/proof.f.d.ts +4 -0
- package/{fs → fjs}/cas/proof.f.js +77 -86
- package/{fs → fjs}/ci/config/module.f.d.ts +5 -5
- package/{fs → fjs}/ci/config/module.f.js +5 -5
- package/{fs → fjs}/ci/proof.f.js +14 -9
- package/{fs → fjs}/ci/rust/module.f.js +9 -1
- package/{fs → fjs}/cli/proof.f.js +22 -63
- package/{fs → fjs}/common/monoid/proof.f.js +4 -9
- package/{fs → fjs}/crypto/hmac/proof.f.js +4 -12
- package/fjs/crypto/pow/proof.f.js +111 -0
- package/{fs → fjs}/crypto/secp/proof.f.js +12 -33
- package/{fs → fjs}/crypto/sha2/proof.f.js +18 -49
- package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
- package/{fs → fjs}/crypto/sign/module.f.js +7 -4
- package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
- package/{fs → fjs}/crypto/vdf/proof.f.js +22 -63
- package/{fs → fjs}/dev/package_json/proof.f.js +7 -7
- package/{fs → fjs}/dev/proof.f.js +2 -4
- package/{fs → fjs}/djs/ast/proof.f.js +4 -12
- package/{fs → fjs}/djs/parser/module.f.d.ts +5 -0
- package/{fs → fjs}/djs/parser/module.f.js +20 -0
- package/{fs → fjs}/djs/parser/proof.f.js +138 -400
- package/{fs → fjs}/djs/proof.f.js +13 -36
- package/{fs → fjs}/djs/serializer/proof.f.js +14 -39
- package/fjs/djs/tokenizer/module.f.d.ts +24 -0
- package/fjs/djs/tokenizer/module.f.js +472 -0
- package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.d.ts +4 -3
- package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.js +446 -445
- package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
- package/{fs → fjs}/djs/transpiler/proof.f.js +29 -30
- package/{fs → fjs}/effects/memory/proof.f.js +8 -21
- package/{fs → fjs}/effects/node/memory/proof.js +5 -12
- package/{fs → fjs}/effects/node/module.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.f.d.ts +1 -1
- package/{fs → fjs}/effects/node/module.js +3 -3
- package/{fs → fjs}/effects/node/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/proof.f.js +106 -292
- package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +1 -0
- package/{fs → fjs}/effects/node/virtual/proof.f.js +36 -29
- package/{fs → fjs}/effects/proof.f.js +16 -45
- package/{fs → fjs}/emergent_testing/proof.f.js +7 -7
- package/{fs → fjs}/fsc/proof.f.js +12 -34
- package/{fs → fjs}/fsm/proof.f.js +5 -12
- package/{fs → fjs}/mcp/module.f.d.ts +7 -0
- package/{fs → fjs}/mcp/module.f.js +9 -2
- package/{fs → fjs}/mcp/proof.f.js +12 -12
- package/{fs → fjs}/mcp/stdio/module.f.d.ts +2 -2
- package/{fs → fjs}/mcp/stdio/module.f.js +2 -2
- package/{fs → fjs}/media/html/proof.f.js +12 -33
- package/{fs → fjs}/media/json/parser/module.f.d.ts +5 -0
- package/{fs → fjs}/media/json/parser/module.f.js +14 -0
- package/{fs → fjs}/media/json/parser/proof.f.js +39 -114
- package/{fs → fjs}/media/json/rpc/module.f.js +1 -1
- package/{fs → fjs}/media/json/schema/module.f.d.ts +2 -2
- package/{fs → fjs}/media/json/schema/module.f.js +23 -39
- package/{fs → fjs}/media/json/schema/proof.f.js +3 -6
- package/{fs → fjs}/media/json/serializer/proof.f.js +10 -27
- package/{fs → fjs}/media/module.f.d.ts +6 -6
- package/{fs → fjs}/media/module.f.js +3 -4
- package/{fs → fjs}/media/proof.f.js +5 -4
- package/{fs → fjs}/media/revision/module.f.d.ts +31 -4
- package/{fs → fjs}/media/revision/module.f.js +35 -23
- package/{fs → fjs}/media/revision/proof.f.d.ts +10 -8
- package/fjs/media/revision/proof.f.js +140 -0
- package/{fs → fjs}/media/type/proof.f.js +2 -6
- package/{fs → fjs}/module.f.js +1 -1
- package/{fs → fjs}/path/proof.f.js +27 -78
- package/{fs → fjs}/proof.f.js +2 -0
- package/{fs → fjs}/sul/id/proof.f.js +7 -21
- package/{fs → fjs}/sul/level/hash/proof.f.js +5 -5
- package/{fs → fjs}/sul/level/literal/proof.f.js +12 -26
- package/fjs/text/ascii/proof.f.d.ts +6 -0
- package/{fs → fjs}/text/ascii/proof.f.js +4 -14
- package/{fs → fjs}/text/code_point/module.f.js +10 -10
- package/{fs → fjs}/text/proof.f.js +4 -9
- package/{fs → fjs}/text/sgr/proof.f.js +6 -15
- package/{fs → fjs}/text/utf16/module.f.js +1 -1
- package/{fs → fjs}/text/utf16/proof.f.js +23 -66
- package/{fs → fjs}/text/utf8/proof.f.js +56 -125
- package/{fs → fjs}/types/array/proof.f.js +18 -52
- package/fjs/types/bigfloat/proof.f.js +217 -0
- package/{fs → fjs}/types/bigint/proof.f.js +49 -145
- package/{fs → fjs}/types/bit_vec/proof.f.js +72 -214
- package/{fs → fjs}/types/btree/find/proof.f.js +23 -66
- package/{fs → fjs}/types/btree/proof.f.js +5 -12
- package/{fs → fjs}/types/btree/remove/proof.f.d.ts +2 -0
- package/{fs → fjs}/types/btree/remove/proof.f.js +83 -230
- package/{fs → fjs}/types/btree/set/module.f.js +5 -2
- package/{fs → fjs}/types/btree/set/proof.f.js +35 -24
- package/{fs → fjs}/types/byte_set/proof.f.js +22 -63
- package/{fs → fjs}/types/function/compare/proof.f.js +13 -36
- package/{fs → fjs}/types/function/operator/proof.f.js +17 -48
- package/{fs → fjs}/types/function/proof.f.js +2 -3
- package/{fs → fjs}/types/list/proof.f.js +55 -163
- package/{fs → fjs}/types/map/proof.f.js +4 -12
- package/{fs → fjs}/types/nibble_set/proof.f.js +16 -45
- package/{fs → fjs}/types/nominal/proof.f.js +5 -10
- package/fjs/types/nullable/proof.f.js +29 -0
- package/{fs → fjs}/types/number/proof.f.js +9 -24
- package/{fs → fjs}/types/object/proof.f.js +3 -6
- package/{fs → fjs}/types/patricia_trie/proof.f.js +21 -21
- package/{fs → fjs}/types/prime_field/module.f.js +2 -7
- package/{fs → fjs}/types/range/module.f.d.ts +1 -1
- package/fjs/types/range/module.f.js +2 -0
- package/fjs/types/range/proof.f.js +9 -0
- package/{fs → fjs}/types/range_map/proof.f.js +28 -81
- package/{fs → fjs}/types/result/proof.f.d.ts +3 -2
- package/fjs/types/result/proof.f.js +31 -0
- package/{fs → fjs}/types/rtti/common/module.f.d.ts +36 -1
- package/{fs → fjs}/types/rtti/common/module.f.js +44 -0
- package/fjs/types/rtti/common/proof.f.d.ts +8 -0
- package/fjs/types/rtti/common/proof.f.js +51 -0
- package/{fs → fjs}/types/rtti/parse/module.f.js +13 -22
- package/{fs → fjs}/types/rtti/parse/proof.f.js +7 -18
- package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
- package/{fs → fjs}/types/rtti/validate/module.f.js +8 -29
- package/{fs → fjs}/types/rtti/validate/proof.f.js +4 -9
- package/{fs → fjs}/types/sorted_list/proof.f.js +8 -21
- package/{fs → fjs}/types/sorted_set/proof.f.js +14 -39
- package/fjs/types/string/proof.f.js +77 -0
- package/fjs/types/string_set/proof.f.js +43 -0
- package/{fs → fjs}/types/ts/proof.f.js +15 -42
- package/{fs → fjs}/types/uint8array/module.f.js +7 -7
- package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
- package/{fs → fjs}/types/uint8array/proof.f.js +7 -7
- package/{fs → fjs}/website/proof.f.js +3 -6
- package/package.json +6 -6
- package/fs/asserts/module.f.d.ts +0 -4
- package/fs/asserts/module.f.js +0 -9
- package/fs/asserts/proof.f.d.ts +0 -8
- package/fs/asserts/proof.f.js +0 -51
- package/fs/bnf/data/module.f.d.ts +0 -30
- package/fs/bnf/descent/module.f.js +0 -119
- package/fs/bnf/proof.f.js +0 -104
- package/fs/cas/mcp/module.f.d.ts +0 -36
- package/fs/crypto/pow/proof.f.js +0 -161
- package/fs/djs/tokenizer/module.f.d.ts +0 -12
- package/fs/djs/tokenizer/module.f.js +0 -62
- package/fs/djs/tokenizer/proof.f.d.ts +0 -7
- package/fs/djs/tokenizer/proof.f.js +0 -543
- package/fs/djs/tokenizer-new/module.f.d.ts +0 -3
- package/fs/djs/tokenizer-new/module.f.js +0 -155
- package/fs/media/revision/proof.f.js +0 -119
- package/fs/text/ascii/proof.f.d.ts +0 -4
- package/fs/types/bigfloat/proof.f.js +0 -348
- package/fs/types/nullable/proof.f.js +0 -50
- package/fs/types/range/module.f.js +0 -2
- package/fs/types/range/proof.f.js +0 -18
- package/fs/types/result/proof.f.js +0 -52
- package/fs/types/string/proof.f.js +0 -118
- package/fs/types/string_set/proof.f.js +0 -82
- /package/{fs → fjs}/asn.1/module.f.d.ts +0 -0
- /package/{fs → fjs}/asn.1/module.f.js +0 -0
- /package/{fs → fjs}/asn.1/proof.f.d.ts +0 -0
- /package/{fs → fjs}/base_n/module.f.d.ts +0 -0
- /package/{fs → fjs}/base_n/module.f.js +0 -0
- /package/{fs → fjs}/base_n/proof.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/module.f.js +0 -0
- /package/{fs → fjs}/basen/base128/proof.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base128/proof.f.js +0 -0
- /package/{fs → fjs}/basen/base64/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/base64/module.f.js +0 -0
- /package/{fs → fjs}/basen/cbase32/module.f.d.ts +0 -0
- /package/{fs → fjs}/basen/cbase32/module.f.js +0 -0
- /package/{fs → fjs}/basen/cbase32/proof.f.d.ts +0 -0
- /package/{fs → fjs}/bnf/proof.f.d.ts +0 -0
- /package/{fs → fjs}/bnf/testlib.f.d.ts +0 -0
- /package/{fs → fjs}/cas/cli/module.f.d.ts +0 -0
- /package/{fs → fjs}/cas/cli/module.f.js +0 -0
- /package/{fs → fjs}/ci/bun/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/bun/module.f.js +0 -0
- /package/{fs → fjs}/ci/common/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/common/module.f.js +0 -0
- /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/deno/module.f.js +0 -0
- /package/{fs → fjs}/ci/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/module.f.js +0 -0
- /package/{fs → fjs}/ci/node/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/node/module.f.js +0 -0
- /package/{fs → fjs}/ci/playwright/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/playwright/module.f.js +0 -0
- /package/{fs → fjs}/ci/proof.f.d.ts +0 -0
- /package/{fs → fjs}/ci/rust/module.f.d.ts +0 -0
- /package/{fs → fjs}/cli/module.f.d.ts +0 -0
- /package/{fs → fjs}/cli/module.f.js +0 -0
- /package/{fs → fjs}/cli/proof.f.d.ts +0 -0
- /package/{fs → fjs}/common/monoid/module.f.d.ts +0 -0
- /package/{fs → fjs}/common/monoid/module.f.js +0 -0
- /package/{fs → fjs}/common/monoid/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/hmac/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/hmac/module.f.js +0 -0
- /package/{fs → fjs}/crypto/hmac/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/module.f.js +0 -0
- /package/{fs → fjs}/crypto/pow/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/secp/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/secp/module.f.js +0 -0
- /package/{fs → fjs}/crypto/secp/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/module.f.js +0 -0
- /package/{fs → fjs}/crypto/sha2/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sign/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/vdf/module.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/vdf/module.f.js +0 -0
- /package/{fs → fjs}/crypto/vdf/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/module.f.js +0 -0
- /package/{fs → fjs}/dev/package_json/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/package_json/module.f.js +0 -0
- /package/{fs → fjs}/dev/package_json/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/ast/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/ast/module.f.js +0 -0
- /package/{fs → fjs}/djs/ast/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/input.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/input.f.js +0 -0
- /package/{fs → fjs}/djs/examples/m.f.d.ts +0 -0
- /package/{fs → fjs}/djs/examples/m.f.js +0 -0
- /package/{fs → fjs}/djs/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/module.f.js +0 -0
- /package/{fs → fjs}/djs/parser/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/serializer/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/serializer/module.f.js +0 -0
- /package/{fs → fjs}/djs/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/djs/transpiler/module.f.d.ts +0 -0
- /package/{fs → fjs}/djs/transpiler/module.f.js +0 -0
- /package/{fs → fjs}/effects/list/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/list/module.f.js +0 -0
- /package/{fs → fjs}/effects/memory/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/memory/module.f.js +0 -0
- /package/{fs → fjs}/effects/memory/proof.f.d.ts +0 -0
- /package/{fs → fjs}/effects/mock/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/mock/module.f.js +0 -0
- /package/{fs → fjs}/effects/module.d.ts +0 -0
- /package/{fs → fjs}/effects/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/module.f.js +0 -0
- /package/{fs → fjs}/effects/module.js +0 -0
- /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
- /package/{fs → fjs}/effects/node/memory/module.js +0 -0
- /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
- /package/{fs → fjs}/effects/node/module.f.js +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.js +0 -0
- /package/{fs → fjs}/effects/proof.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/all.test.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/all.test.js +0 -0
- /package/{fs → fjs}/emergent_testing/example.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/example.f.js +0 -0
- /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/module.f.js +0 -0
- /package/{fs → fjs}/emergent_testing/proof.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/all.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/async.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.js +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.js +0 -0
- /package/{fs → fjs}/fsc/bnf.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/bnf.f.js +0 -0
- /package/{fs → fjs}/fsc/json.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/json.f.js +0 -0
- /package/{fs → fjs}/fsc/module.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/module.f.js +0 -0
- /package/{fs → fjs}/fsc/proof.f.d.ts +0 -0
- /package/{fs → fjs}/fsm/module.f.d.ts +0 -0
- /package/{fs → fjs}/fsm/module.f.js +0 -0
- /package/{fs → fjs}/fsm/proof.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/module.f.js +0 -0
- /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/proof.f.js +0 -0
- /package/{fs → fjs}/mcp/proof.f.d.ts +0 -0
- /package/{fs → fjs}/mcp/stdio/proof.f.d.ts +0 -0
- /package/{fs → fjs}/mcp/stdio/proof.f.js +0 -0
- /package/{fs → fjs}/media/html/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/html/module.f.js +0 -0
- /package/{fs → fjs}/media/html/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/module.f.js +0 -0
- /package/{fs → fjs}/media/json/parser/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/proof.f.js +0 -0
- /package/{fs → fjs}/media/json/rpc/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/rpc/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/rpc/proof.f.js +0 -0
- /package/{fs → fjs}/media/json/schema/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/serializer/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/serializer/module.f.js +0 -0
- /package/{fs → fjs}/media/json/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/module.f.js +0 -0
- /package/{fs → fjs}/media/json/tokenizer/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/json/tokenizer/proof.f.js +0 -0
- /package/{fs → fjs}/media/proof.f.d.ts +0 -0
- /package/{fs → fjs}/media/type/module.f.d.ts +0 -0
- /package/{fs → fjs}/media/type/module.f.js +0 -0
- /package/{fs → fjs}/media/type/proof.f.d.ts +0 -0
- /package/{fs → fjs}/module.d.ts +0 -0
- /package/{fs → fjs}/module.f.d.ts +0 -0
- /package/{fs → fjs}/module.js +0 -0
- /package/{fs → fjs}/path/module.f.d.ts +0 -0
- /package/{fs → fjs}/path/module.f.js +0 -0
- /package/{fs → fjs}/path/proof.f.d.ts +0 -0
- /package/{fs → fjs}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/module.f.js +0 -0
- /package/{fs → fjs}/sul/id/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/hash/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/hash/module.f.js +0 -0
- /package/{fs → fjs}/sul/level/hash/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/module.f.js +0 -0
- /package/{fs → fjs}/sul/level/literal/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/module.f.d.ts +0 -0
- /package/{fs → fjs}/sul/module.f.js +0 -0
- /package/{fs → fjs}/sul/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/proof.f.js +0 -0
- /package/{fs → fjs}/text/ascii/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/ascii/module.f.js +0 -0
- /package/{fs → fjs}/text/code_point/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/code_point/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/code_point/proof.f.js +0 -0
- /package/{fs → fjs}/text/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/module.f.js +0 -0
- /package/{fs → fjs}/text/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/sgr/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/sgr/module.f.js +0 -0
- /package/{fs → fjs}/text/sgr/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf16/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf16/proof.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf8/module.f.d.ts +0 -0
- /package/{fs → fjs}/text/utf8/module.f.js +0 -0
- /package/{fs → fjs}/text/utf8/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/module.f.js +0 -0
- /package/{fs → fjs}/types/array/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigfloat/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigfloat/module.f.js +0 -0
- /package/{fs → fjs}/types/bigfloat/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/module.f.js +0 -0
- /package/{fs → fjs}/types/bigint/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/bit_vec/module.f.js +0 -0
- /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/find/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/find/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/remove/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/remove/module.f.js +0 -0
- /package/{fs → fjs}/types/btree/set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/types/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/types/module.f.js +0 -0
- /package/{fs → fjs}/types/byte_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/byte_set/module.f.js +0 -0
- /package/{fs → fjs}/types/byte_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/compare/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/compare/module.f.js +0 -0
- /package/{fs → fjs}/types/function/compare/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/module.f.js +0 -0
- /package/{fs → fjs}/types/function/operator/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/operator/module.f.js +0 -0
- /package/{fs → fjs}/types/function/operator/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/function/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/list/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/list/module.f.js +0 -0
- /package/{fs → fjs}/types/list/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/map/module.f.js +0 -0
- /package/{fs → fjs}/types/map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nibble_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nibble_set/module.f.js +0 -0
- /package/{fs → fjs}/types/nibble_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nominal/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nominal/module.f.js +0 -0
- /package/{fs → fjs}/types/nominal/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/nullable/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/nullable/module.f.js +0 -0
- /package/{fs → fjs}/types/nullable/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/module.f.js +0 -0
- /package/{fs → fjs}/types/number/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/object/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/object/module.f.js +0 -0
- /package/{fs → fjs}/types/object/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/option/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/option/module.f.js +0 -0
- /package/{fs → fjs}/types/ordered_map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/ordered_map/module.f.js +0 -0
- /package/{fs → fjs}/types/ordered_map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/ordered_map/proof.f.js +0 -0
- /package/{fs → fjs}/types/patricia_trie/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/patricia_trie/module.f.js +0 -0
- /package/{fs → fjs}/types/patricia_trie/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/phantom/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/phantom/module.f.js +0 -0
- /package/{fs → fjs}/types/prime_field/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/prime_field/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/prime_field/proof.f.js +0 -0
- /package/{fs → fjs}/types/range/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/range_map/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/range_map/module.f.js +0 -0
- /package/{fs → fjs}/types/range_map/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/result/module.f.js +0 -0
- /package/{fs → fjs}/types/result/module.js +0 -0
- /package/{fs → fjs}/types/rtti/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/module.f.js +0 -0
- /package/{fs → fjs}/types/rtti/parse/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/parse/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/proof.f.js +0 -0
- /package/{fs → fjs}/types/rtti/ts/module.f.js +0 -0
- /package/{fs → fjs}/types/rtti/ts/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/ts/proof.f.js +0 -0
- /package/{fs → fjs}/types/rtti/validate/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/rtti/validate/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_list/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_list/module.f.js +0 -0
- /package/{fs → fjs}/types/sorted_list/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/module.f.js +0 -0
- /package/{fs → fjs}/types/sorted_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/string/module.f.js +0 -0
- /package/{fs → fjs}/types/string/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/module.f.js +0 -0
- /package/{fs → fjs}/types/string_set/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/ts/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/ts/module.f.js +0 -0
- /package/{fs → fjs}/types/ts/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/uint8array/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/module.f.js +0 -0
- /package/{fs → fjs}/website/proof.f.d.ts +0 -0
|
@@ -3,21 +3,16 @@ import { identity } from '../../types/function/module.f.js';
|
|
|
3
3
|
import { sort } from '../../types/object/module.f.js';
|
|
4
4
|
import { oneEncode, option, range, rangeDecode, repeat0Plus, set } from '../module.f.js';
|
|
5
5
|
import { classic, deterministic } from '../testlib.f.js';
|
|
6
|
-
import { toData } from './module.f.js';
|
|
6
|
+
import { emptyTagMap, toData } from './module.f.js';
|
|
7
|
+
import { assertEq } from '../../asserts/module.f.js';
|
|
7
8
|
export const proof = {
|
|
8
9
|
rangeDecode: () => {
|
|
9
10
|
const decoded1 = stringify(sort)(rangeDecode(0x000079_000087));
|
|
10
|
-
|
|
11
|
-
throw decoded1;
|
|
12
|
-
}
|
|
11
|
+
assertEq(decoded1, '[121,135]');
|
|
13
12
|
const decoded2 = stringify(sort)(rangeDecode(0x000080_000087));
|
|
14
|
-
|
|
15
|
-
throw decoded2;
|
|
16
|
-
}
|
|
13
|
+
assertEq(decoded2, '[128,135]');
|
|
17
14
|
const decoded3 = stringify(sort)(rangeDecode(0x10FFFF_10FFFF));
|
|
18
|
-
|
|
19
|
-
throw decoded3;
|
|
20
|
-
}
|
|
15
|
+
assertEq(decoded3, '[1114111,1114111]');
|
|
21
16
|
},
|
|
22
17
|
rangeEncode: () => {
|
|
23
18
|
const encoded1 = oneEncode(0x79);
|
|
@@ -70,26 +65,20 @@ export const proof = {
|
|
|
70
65
|
const varintRule = { true: 'true', false: 'false' };
|
|
71
66
|
const result = stringify(sort)(toData(varintRule));
|
|
72
67
|
const expected = '[{"":{"false":"5","true":"0"},"0":["1","2","3","4"],"1":1946157172,"2":1912602738,"3":1962934389,"4":1694498917,"5":["6","7","8","9","4"],"6":1711276134,"7":1627390049,"8":1811939436,"9":1929379955},""]';
|
|
73
|
-
|
|
74
|
-
throw [result, expected];
|
|
75
|
-
}
|
|
68
|
+
assertEq(result, expected, [result, expected]);
|
|
76
69
|
},
|
|
77
70
|
() => {
|
|
78
71
|
const lazyRule = () => 'true';
|
|
79
72
|
const lazyRule0 = () => 'false';
|
|
80
73
|
const result = stringify(sort)(toData([lazyRule, lazyRule0]));
|
|
81
74
|
const expected = '[{"":["lazyRule","lazyRule0"],"0":1946157172,"1":1912602738,"2":1962934389,"3":1694498917,"4":1711276134,"5":1627390049,"6":1811939436,"7":1929379955,"lazyRule":["0","1","2","3"],"lazyRule0":["4","5","6","7","3"]},""]';
|
|
82
|
-
|
|
83
|
-
throw [result, expected];
|
|
84
|
-
}
|
|
75
|
+
assertEq(result, expected, [result, expected]);
|
|
85
76
|
},
|
|
86
77
|
() => {
|
|
87
78
|
const emptyRule = '';
|
|
88
79
|
const result = stringify(sort)(toData(emptyRule));
|
|
89
80
|
const expected = '[{"":[]},""]';
|
|
90
|
-
|
|
91
|
-
throw [result, expected];
|
|
92
|
-
}
|
|
81
|
+
assertEq(result, expected, [result, expected]);
|
|
93
82
|
},
|
|
94
83
|
() => {
|
|
95
84
|
const optionRule = option('a');
|
|
@@ -120,6 +109,52 @@ export const proof = {
|
|
|
120
109
|
throw result;
|
|
121
110
|
}
|
|
122
111
|
},
|
|
112
|
+
emptyTagMap: [
|
|
113
|
+
() => {
|
|
114
|
+
const stringRule = 'true';
|
|
115
|
+
const result = JSON.stringify(emptyTagMap(toData(stringRule)[0]));
|
|
116
|
+
assertEq(result, '{}');
|
|
117
|
+
},
|
|
118
|
+
() => {
|
|
119
|
+
const emptyRule = '';
|
|
120
|
+
const result = JSON.stringify(emptyTagMap(toData(emptyRule)[0]));
|
|
121
|
+
assertEq(result, '{"":true}');
|
|
122
|
+
},
|
|
123
|
+
() => {
|
|
124
|
+
const emptyRule = '';
|
|
125
|
+
const varintRule = { true: 'true', e: emptyRule };
|
|
126
|
+
const result = JSON.stringify(emptyTagMap(toData(varintRule)[0]));
|
|
127
|
+
assertEq(result, '{"5":true,"":"e"}');
|
|
128
|
+
},
|
|
129
|
+
() => {
|
|
130
|
+
const repeatRule = repeat0Plus(option('a'));
|
|
131
|
+
const result = JSON.stringify(emptyTagMap(toData(repeatRule)[0]));
|
|
132
|
+
assertEq(result, '{"0":"none","3":true,"":true,"r":"none"}');
|
|
133
|
+
},
|
|
134
|
+
() => {
|
|
135
|
+
// Regression for the sequence case: a sequence is nullable iff
|
|
136
|
+
// *all* of its items are, not just the first one. The old
|
|
137
|
+
// descent-only implementation pinned the result to nullable as
|
|
138
|
+
// soon as it saw the leading empty item, and reported this
|
|
139
|
+
// 2-item sequence as nullable even though its second item is a
|
|
140
|
+
// mandatory terminal.
|
|
141
|
+
const data = toData(['', range('AA')]);
|
|
142
|
+
const emptyTags = emptyTagMap(data[0]);
|
|
143
|
+
assertEq(emptyTags[data[1]], undefined, emptyTags);
|
|
144
|
+
},
|
|
145
|
+
() => {
|
|
146
|
+
// Regression: a fixed round count (one round per rule) settles
|
|
147
|
+
// the nullable/non-nullable *set* — a standard result — but a
|
|
148
|
+
// variant's chosen *tag* can still change for rounds after that,
|
|
149
|
+
// while a cyclic dependency's own tag catches up. Here A is
|
|
150
|
+
// nullable via 'x' (A -> E, both settle in 2 rounds), but B (a
|
|
151
|
+
// 1-item sequence over A) only becomes nullable once A does, and
|
|
152
|
+
// once B is nullable, A's true winning branch is 'y' (A -> B) —
|
|
153
|
+
// reachable only by iterating to an actual fixpoint.
|
|
154
|
+
const rs = { A: { x: 'E', y: 'B' }, B: ['A'], E: [] };
|
|
155
|
+
assertEq(emptyTagMap(rs).A, 'y');
|
|
156
|
+
},
|
|
157
|
+
],
|
|
123
158
|
example: () => {
|
|
124
159
|
const grammar = {
|
|
125
160
|
space: 0x000020_000020,
|
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Recursive descent matcher backend over the BNF data {@link RuleSet}.
|
|
3
3
|
*
|
|
4
|
-
* Built from the serializable IR in `
|
|
5
|
-
* LL(1) dispatch builder (`
|
|
4
|
+
* Built from the serializable IR in `fjs/bnf/data`, this is a sibling of the
|
|
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 ({@link AstRuleMeta}).
|
|
8
|
-
*
|
|
7
|
+
* AST ({@link AstRuleMeta}). Nullability (which rule can match empty input) is
|
|
8
|
+
* computed once by {@link emptyTagMap} in `fjs/bnf/data`.
|
|
9
9
|
*
|
|
10
10
|
* @module
|
|
11
11
|
*/
|
|
12
12
|
import { type CodePoint } from '../../text/utf16/module.f.ts';
|
|
13
|
-
import { type StringMap } from '../../types/object/module.f.ts';
|
|
14
|
-
import { type RuleSet } from '../data/module.f.ts';
|
|
15
13
|
import { type Rule as FRule } from '../module.f.ts';
|
|
16
|
-
type EmptyTagEntry = string | boolean;
|
|
17
|
-
type EmptyTagMap = StringMap<string, EmptyTagEntry>;
|
|
18
14
|
export type AstTag = string | true | undefined;
|
|
19
15
|
/**
|
|
20
16
|
* Recursive descent matcher for a single named rule.
|
|
@@ -43,14 +39,8 @@ export type AstRuleMeta<T> = {
|
|
|
43
39
|
readonly tag: AstTag;
|
|
44
40
|
readonly sequence: AstSequenceMeta<T>;
|
|
45
41
|
};
|
|
46
|
-
/**
|
|
47
|
-
* Creates a map that describes whether each rule can consume empty input and,
|
|
48
|
-
* for tagged variants, which tag represents the empty match.
|
|
49
|
-
*/
|
|
50
|
-
export declare const createEmptyTagMap: (data: readonly [RuleSet, string]) => EmptyTagMap;
|
|
51
42
|
/**
|
|
52
43
|
* Creates a recursive descent parser that preserves metadata for each consumed
|
|
53
44
|
* code point.
|
|
54
45
|
*/
|
|
55
46
|
export declare const descentParser: <T>(fr: FRule) => DescentMatch<T>;
|
|
56
|
-
export {};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recursive descent matcher backend over the BNF data {@link RuleSet}.
|
|
3
|
+
*
|
|
4
|
+
* Built from the serializable IR in `fjs/bnf/data`, this is a sibling of the
|
|
5
|
+
* LL(1) dispatch builder (`fjs/bnf/ll1`). It walks the grammar by recursive
|
|
6
|
+
* descent and preserves per-code-point metadata, producing a metadata-aware
|
|
7
|
+
* AST ({@link AstRuleMeta}). Nullability (which rule can match empty input) is
|
|
8
|
+
* computed once by {@link emptyTagMap} in `fjs/bnf/data`.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import {} from '../../text/utf16/module.f.js';
|
|
13
|
+
import { rangeDecode } from '../module.f.js';
|
|
14
|
+
import { contains as rangeContains } from '../../types/range/module.f.js';
|
|
15
|
+
import { definedEntries } from '../../types/object/module.f.js';
|
|
16
|
+
import { emptyTagMap, toData } from '../data/module.f.js';
|
|
17
|
+
import {} from '../module.f.js';
|
|
18
|
+
/**
|
|
19
|
+
* Creates a recursive descent parser that preserves metadata for each consumed
|
|
20
|
+
* code point.
|
|
21
|
+
*/
|
|
22
|
+
export const descentParser = (fr) => {
|
|
23
|
+
const data = toData(fr);
|
|
24
|
+
const emptyTags = emptyTagMap(data[0]);
|
|
25
|
+
// The recursive-descent matcher as an explicit-stack machine: each iteration either
|
|
26
|
+
// starts the current task (pushing a frame for a sequence/variant and descending into
|
|
27
|
+
// its first child) or feeds the pending result into the innermost frame. Semantics are
|
|
28
|
+
// identical to the former recursive `f`, but the JS call stack stays O(1) regardless of
|
|
29
|
+
// grammar recursion depth — right-recursive rules (e.g. repeat0Plus chains) no longer
|
|
30
|
+
// overflow on long input (see the longInput proof group).
|
|
31
|
+
const f = (name, tag, cp, idx) => {
|
|
32
|
+
const mrSuccess = (tag, sequence, idx) => [{ tag, sequence }, true, idx];
|
|
33
|
+
const mrFail = (tag, sequence, idx) => [{ tag, sequence }, false, idx];
|
|
34
|
+
let stack = null;
|
|
35
|
+
let task = { name, tag, idx };
|
|
36
|
+
let result = mrFail(undefined, [], idx);
|
|
37
|
+
while (true) {
|
|
38
|
+
if (task !== null) {
|
|
39
|
+
const { name, tag, idx } = task;
|
|
40
|
+
task = null;
|
|
41
|
+
// The explicit annotation cuts a control-flow inference cycle (TS7022):
|
|
42
|
+
// `name`'s narrowed type feeds `rule`, whose type would otherwise feed the
|
|
43
|
+
// later `task` assignments that `name`'s narrowing depends on.
|
|
44
|
+
const rule = data[0][name];
|
|
45
|
+
if (typeof rule === 'number') {
|
|
46
|
+
const emptyTag = emptyTags[name];
|
|
47
|
+
if (idx >= cp.length) {
|
|
48
|
+
result = emptyTag === undefined ? mrFail(emptyTag, [], idx) : mrSuccess(emptyTag, [], idx);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const cpi = cp[idx];
|
|
52
|
+
const range = rangeDecode(rule);
|
|
53
|
+
result = rangeContains(...range)(cpi[0]) ? mrSuccess(tag, [cpi], idx + 1) : mrFail(emptyTag, [], idx);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else if (rule instanceof Array) {
|
|
57
|
+
if (rule.length === 0) {
|
|
58
|
+
result = mrSuccess(tag, [], idx);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
stack = { top: { kind: 'seq', tag, items: rule, itemIndex: 0, startIdx: idx, seq: [] }, rest: stack };
|
|
62
|
+
task = { name: rule[0], tag: undefined, idx };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const entries = definedEntries(rule);
|
|
67
|
+
const emptyTag = emptyTags[name];
|
|
68
|
+
const emptyResult = mrFail(emptyTag, [], idx);
|
|
69
|
+
if (entries.length === 0) {
|
|
70
|
+
result = emptyResult;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
stack = { top: { kind: 'variant', entries, entryIndex: 0, idx, emptyResult }, rest: stack };
|
|
74
|
+
const [entryTag, entryName] = entries[0];
|
|
75
|
+
task = { name: entryName, tag: entryTag, idx };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (stack === null) {
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
const frame = stack.top;
|
|
84
|
+
stack = stack.rest;
|
|
85
|
+
if (frame.kind === 'seq') {
|
|
86
|
+
const [astRule, success, nidx] = result;
|
|
87
|
+
if (success === false) {
|
|
88
|
+
result = mrFail(frame.tag, [], frame.startIdx);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
const seq = [...frame.seq, astRule];
|
|
92
|
+
const itemIndex = frame.itemIndex + 1;
|
|
93
|
+
if (itemIndex < frame.items.length) {
|
|
94
|
+
stack = { top: { ...frame, itemIndex, seq }, rest: stack };
|
|
95
|
+
task = { name: frame.items[itemIndex], tag: undefined, idx: nidx };
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
result = mrSuccess(frame.tag, seq, nidx);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// success that consumed input wins immediately: the frame stays popped and
|
|
104
|
+
// `result` propagates to the frame below, matching the recursive `return m`.
|
|
105
|
+
if (!(result[1] && frame.idx !== result[2])) {
|
|
106
|
+
const emptyResult = result[1] ? result : frame.emptyResult;
|
|
107
|
+
const entryIndex = frame.entryIndex + 1;
|
|
108
|
+
if (entryIndex < frame.entries.length) {
|
|
109
|
+
stack = { top: { ...frame, entryIndex, emptyResult }, rest: stack };
|
|
110
|
+
const [entryTag, entryName] = frame.entries[entryIndex];
|
|
111
|
+
task = { name: entryName, tag: entryTag, idx: frame.idx };
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
result = emptyResult;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
const match = (name, cp) => {
|
|
121
|
+
return f(name, undefined, cp, 0);
|
|
122
|
+
};
|
|
123
|
+
return match;
|
|
124
|
+
};
|
|
@@ -2,8 +2,9 @@ import { stringToCodePointList } from '../../text/utf16/module.f.js';
|
|
|
2
2
|
import { map, toArray } from '../../types/list/module.f.js';
|
|
3
3
|
import { commaJoin0Plus, option, range, repeat0Plus, set } from '../module.f.js';
|
|
4
4
|
import { deterministic } from '../testlib.f.js';
|
|
5
|
-
import { toData } from '../data/module.f.js';
|
|
6
|
-
import {
|
|
5
|
+
import { emptyTagMap, toData } from '../data/module.f.js';
|
|
6
|
+
import { descentParser } from './module.f.js';
|
|
7
|
+
import { assertEq } from '../../asserts/module.f.js';
|
|
7
8
|
const mapCodePoint = (cp) => [cp, undefined];
|
|
8
9
|
const descentParserCpOnly = (m, name, cp) => {
|
|
9
10
|
const cpm = toArray(map(mapCodePoint)(cp));
|
|
@@ -14,34 +15,34 @@ export const proof = {
|
|
|
14
15
|
() => {
|
|
15
16
|
const stringRule = 'true';
|
|
16
17
|
const data = toData(stringRule);
|
|
17
|
-
const emptyTags =
|
|
18
|
+
const emptyTags = emptyTagMap(data[0]);
|
|
18
19
|
const result = JSON.stringify(emptyTags);
|
|
19
|
-
if (result !== '{
|
|
20
|
+
if (result !== '{}') {
|
|
20
21
|
throw result;
|
|
21
22
|
}
|
|
22
23
|
},
|
|
23
24
|
() => {
|
|
24
25
|
const terminalRangeRule = range('AF');
|
|
25
26
|
const data = toData(terminalRangeRule);
|
|
26
|
-
const emptyTags =
|
|
27
|
+
const emptyTags = emptyTagMap(data[0]);
|
|
27
28
|
const result = JSON.stringify(emptyTags);
|
|
28
|
-
if (result !== '{
|
|
29
|
+
if (result !== '{}') {
|
|
29
30
|
throw result;
|
|
30
31
|
}
|
|
31
32
|
},
|
|
32
33
|
() => {
|
|
33
34
|
const varintRule = { true: 'true', false: 'false' };
|
|
34
35
|
const data = toData(varintRule);
|
|
35
|
-
const emptyTags =
|
|
36
|
+
const emptyTags = emptyTagMap(data[0]);
|
|
36
37
|
const result = JSON.stringify(emptyTags);
|
|
37
|
-
if (result !== '{
|
|
38
|
+
if (result !== '{}') {
|
|
38
39
|
throw result;
|
|
39
40
|
}
|
|
40
41
|
},
|
|
41
42
|
() => {
|
|
42
43
|
const emptyRule = '';
|
|
43
44
|
const data = toData(emptyRule);
|
|
44
|
-
const emptyTags =
|
|
45
|
+
const emptyTags = emptyTagMap(data[0]);
|
|
45
46
|
const result = JSON.stringify(emptyTags);
|
|
46
47
|
if (result !== '{"":true}') {
|
|
47
48
|
throw result;
|
|
@@ -51,27 +52,27 @@ export const proof = {
|
|
|
51
52
|
const emptyRule = '';
|
|
52
53
|
const varintRule = { true: 'true', e: emptyRule };
|
|
53
54
|
const data = toData(varintRule);
|
|
54
|
-
const emptyTags =
|
|
55
|
+
const emptyTags = emptyTagMap(data[0]);
|
|
55
56
|
const result = JSON.stringify(emptyTags);
|
|
56
|
-
if (result !== '{"
|
|
57
|
+
if (result !== '{"5":true,"":"e"}') {
|
|
57
58
|
throw result;
|
|
58
59
|
}
|
|
59
60
|
},
|
|
60
61
|
() => {
|
|
61
62
|
const repeatRule = repeat0Plus(option('a'));
|
|
62
63
|
const data = toData(repeatRule);
|
|
63
|
-
const emptyTags =
|
|
64
|
+
const emptyTags = emptyTagMap(data[0]);
|
|
64
65
|
const result = JSON.stringify(emptyTags);
|
|
65
|
-
if (result !== '{"0":"none","
|
|
66
|
+
if (result !== '{"0":"none","3":true,"":true,"r":"none"}') {
|
|
66
67
|
throw result;
|
|
67
68
|
}
|
|
68
69
|
},
|
|
69
70
|
() => {
|
|
70
71
|
const repeatRule = repeat0Plus(set(' \n\r\t'));
|
|
71
72
|
const data = toData(repeatRule);
|
|
72
|
-
const emptyTags =
|
|
73
|
+
const emptyTags = emptyTagMap(data[0]);
|
|
73
74
|
const result = JSON.stringify(emptyTags);
|
|
74
|
-
if (result !== '{"
|
|
75
|
+
if (result !== '{"5":true,"r":"none"}') {
|
|
75
76
|
throw result;
|
|
76
77
|
}
|
|
77
78
|
}
|
|
@@ -151,6 +152,15 @@ export const proof = {
|
|
|
151
152
|
throw result;
|
|
152
153
|
}
|
|
153
154
|
},
|
|
155
|
+
() => {
|
|
156
|
+
const emptyVariantRule = {};
|
|
157
|
+
const m = descentParser(emptyVariantRule);
|
|
158
|
+
const mr = m("", []);
|
|
159
|
+
const result = JSON.stringify(mr);
|
|
160
|
+
if (result !== '[{"sequence":[]},false,0]') {
|
|
161
|
+
throw result;
|
|
162
|
+
}
|
|
163
|
+
},
|
|
154
164
|
() => {
|
|
155
165
|
const stringRule = 'AB';
|
|
156
166
|
const m = descentParser(stringRule);
|
|
@@ -214,9 +224,7 @@ export const proof = {
|
|
|
214
224
|
const cp = toArray(stringToCodePointList(s));
|
|
215
225
|
const mr = descentParserCpOnly(m, '', cp);
|
|
216
226
|
const success = mr[1] && mr[2] === cp.length;
|
|
217
|
-
|
|
218
|
-
throw mr;
|
|
219
|
-
}
|
|
227
|
+
assertEq(success, expected, mr);
|
|
220
228
|
};
|
|
221
229
|
expect('a', true);
|
|
222
230
|
expect('', true);
|
|
@@ -236,9 +244,7 @@ export const proof = {
|
|
|
236
244
|
const cp = toArray(stringToCodePointList(s));
|
|
237
245
|
const mr = descentParserCpOnly(m, 'value', cp);
|
|
238
246
|
const success = mr[1] && mr[2] === cp.length;
|
|
239
|
-
|
|
240
|
-
throw mr;
|
|
241
|
-
}
|
|
247
|
+
assertEq(success, expected, mr);
|
|
242
248
|
};
|
|
243
249
|
expect('', false);
|
|
244
250
|
expect('[]', true);
|
|
@@ -252,9 +258,7 @@ export const proof = {
|
|
|
252
258
|
const cp = toArray(stringToCodePointList(s));
|
|
253
259
|
const mr = descentParserCpOnly(m, '', cp);
|
|
254
260
|
const success = mr[1] && mr[2] === cp.length;
|
|
255
|
-
|
|
256
|
-
throw mr;
|
|
257
|
-
}
|
|
261
|
+
assertEq(success, expected, mr);
|
|
258
262
|
};
|
|
259
263
|
expect(' true ', true);
|
|
260
264
|
expect(' tr2ue ', false);
|
|
@@ -278,6 +282,33 @@ export const proof = {
|
|
|
278
282
|
expect(' [{ "q": [ 12, false, [}], "a"] }] ', false);
|
|
279
283
|
}
|
|
280
284
|
],
|
|
285
|
+
// Regression for the stack-recursive matcher bug: the matcher used to recurse
|
|
286
|
+
// natively once per grammar step, so match depth grew with input length and these
|
|
287
|
+
// inputs threw "RangeError: Maximum call stack size exceeded" at a few thousand
|
|
288
|
+
// code points. The explicit-frame-stack matcher handles them in O(1) JS call stack.
|
|
289
|
+
longInput: [
|
|
290
|
+
() => {
|
|
291
|
+
// long right-recursive repetition: one repeat0Plus chain across the whole input
|
|
292
|
+
const rule = repeat0Plus(set(' \n\r\t'));
|
|
293
|
+
const name = toData(rule)[1];
|
|
294
|
+
const m = descentParser(rule);
|
|
295
|
+
const cp = toArray(stringToCodePointList(' '.repeat(10000)));
|
|
296
|
+
const [, ok, idx] = descentParserCpOnly(m, name, cp);
|
|
297
|
+
assertEq(ok, true);
|
|
298
|
+
assertEq(idx, 10000);
|
|
299
|
+
},
|
|
300
|
+
() => {
|
|
301
|
+
// deep non-repetition nesting: 5000 bracket levels in the JSON-like test
|
|
302
|
+
// grammar — a shape that repetition-specific fixes (a `repeat` primitive)
|
|
303
|
+
// would not cover
|
|
304
|
+
const m = descentParser(deterministic());
|
|
305
|
+
const n = 5000;
|
|
306
|
+
const cp = toArray(stringToCodePointList('['.repeat(n) + ']'.repeat(n)));
|
|
307
|
+
const [, ok, idx] = descentParserCpOnly(m, '', cp);
|
|
308
|
+
assertEq(ok, true);
|
|
309
|
+
assertEq(idx, n * 2);
|
|
310
|
+
},
|
|
311
|
+
],
|
|
281
312
|
descentParserWithMeta: [
|
|
282
313
|
() => {
|
|
283
314
|
const emptyRule = '';
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* LL(1) dispatch/matcher backend over the BNF data {@link RuleSet}.
|
|
3
3
|
*
|
|
4
|
-
* Built from the serializable IR in `
|
|
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
7
|
* ({@link MatchResult}). It throws at build time (`can not merge …`) when the
|
|
8
|
-
* grammar is not LL(1) — a first/first conflict.
|
|
8
|
+
* grammar is not LL(1) — a first/first conflict. Nullability is looked up from
|
|
9
|
+
* {@link emptyTagMap} in `fjs/bnf/data` rather than re-derived here.
|
|
9
10
|
*
|
|
10
11
|
* @module
|
|
11
12
|
*/
|
|
12
13
|
import { type CodePoint } from '../../text/utf16/module.f.ts';
|
|
13
14
|
import { type RangeMapArray } from '../../types/range_map/module.f.ts';
|
|
14
15
|
import { type StringMap } from '../../types/object/module.f.ts';
|
|
15
|
-
import { type RuleSet } from '../data/module.f.ts';
|
|
16
|
+
import { type EmptyTag, type RuleSet } from '../data/module.f.ts';
|
|
16
17
|
import { type Rule as FRule } from '../module.f.ts';
|
|
17
|
-
type EmptyTag = string | true | undefined;
|
|
18
18
|
type DispatchRule = {
|
|
19
19
|
readonly emptyTag: EmptyTag;
|
|
20
20
|
readonly rangeMap: Dispatch;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* LL(1) dispatch/matcher backend over the BNF data {@link RuleSet}.
|
|
3
3
|
*
|
|
4
|
-
* Built from the serializable IR in `
|
|
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
7
|
* ({@link MatchResult}). It throws at build time (`can not merge …`) when the
|
|
8
|
-
* grammar is not LL(1) — a first/first conflict.
|
|
8
|
+
* grammar is not LL(1) — a first/first conflict. Nullability is looked up from
|
|
9
|
+
* {@link emptyTagMap} in `fjs/bnf/data` rather than re-derived here.
|
|
9
10
|
*
|
|
10
11
|
* @module
|
|
11
12
|
*/
|
|
@@ -16,7 +17,7 @@ import { rangeMap } from '../../types/range_map/module.f.js';
|
|
|
16
17
|
import { contains, set } from '../../types/string_set/module.f.js';
|
|
17
18
|
import { rangeDecode } from '../module.f.js';
|
|
18
19
|
import { definedEntries } from '../../types/object/module.f.js';
|
|
19
|
-
import { toData } from '../data/module.f.js';
|
|
20
|
+
import { emptyTagMap, toData } from '../data/module.f.js';
|
|
20
21
|
import {} from '../module.f.js';
|
|
21
22
|
const dispatchOp = rangeMap({
|
|
22
23
|
union: a => b => {
|
|
@@ -35,6 +36,7 @@ const dispatchOp = rangeMap({
|
|
|
35
36
|
* Builds a dispatch map for a {@link RuleSet} to enable predictive parsing.
|
|
36
37
|
*/
|
|
37
38
|
export const dispatchMap = (ruleSet) => {
|
|
39
|
+
const nullMap = emptyTagMap(ruleSet);
|
|
38
40
|
const addRuleToDispatch = (dr, name) => {
|
|
39
41
|
if (dr === null)
|
|
40
42
|
return null;
|
|
@@ -70,7 +72,7 @@ export const dispatchMap = (ruleSet) => {
|
|
|
70
72
|
if (emptyTag === true) {
|
|
71
73
|
result = result.map(x => [addRuleToDispatch(x[0], item), x[1]]);
|
|
72
74
|
result = toArray(dispatchOp.merge(result)(dr.rangeMap));
|
|
73
|
-
emptyTag =
|
|
75
|
+
emptyTag = nullMap[item] !== undefined ? true : undefined;
|
|
74
76
|
}
|
|
75
77
|
else {
|
|
76
78
|
result = result.map(x => [addRuleToDispatch(x[0], item), x[1]]);
|
|
@@ -87,7 +89,7 @@ export const dispatchMap = (ruleSet) => {
|
|
|
87
89
|
for (const [tag, item] of entries) {
|
|
88
90
|
dm = dispatchRule(dm, item, newCurrent);
|
|
89
91
|
const dr = dm[item];
|
|
90
|
-
if (
|
|
92
|
+
if (nullMap[item] !== undefined) {
|
|
91
93
|
emptyTag = tag;
|
|
92
94
|
}
|
|
93
95
|
else {
|
|
@@ -4,6 +4,7 @@ import { commaJoin0Plus, option, range, repeat0Plus, set } from '../module.f.js'
|
|
|
4
4
|
import { deterministic } from '../testlib.f.js';
|
|
5
5
|
import { toData } from '../data/module.f.js';
|
|
6
6
|
import { dispatchMap, parser, parserRuleSet } from './module.f.js';
|
|
7
|
+
import { assertEq } from '../../asserts/module.f.js';
|
|
7
8
|
export const proof = {
|
|
8
9
|
dispatch: [
|
|
9
10
|
() => {
|
|
@@ -238,9 +239,7 @@ export const proof = {
|
|
|
238
239
|
const isSuccess = (mr) => mr[1] && mr[2]?.length === 0;
|
|
239
240
|
const expect = (s, success) => {
|
|
240
241
|
const mr = m('', toArray(stringToCodePointList(s)));
|
|
241
|
-
|
|
242
|
-
throw mr;
|
|
243
|
-
}
|
|
242
|
+
assertEq(isSuccess(mr), success, mr);
|
|
244
243
|
};
|
|
245
244
|
expect('a', true);
|
|
246
245
|
expect('', true);
|
|
@@ -259,9 +258,7 @@ export const proof = {
|
|
|
259
258
|
const isSuccess = (mr) => mr[1] && mr[2]?.length === 0;
|
|
260
259
|
const expect = (s, success) => {
|
|
261
260
|
const mr = m('value', toArray(stringToCodePointList(s)));
|
|
262
|
-
|
|
263
|
-
throw mr;
|
|
264
|
-
}
|
|
261
|
+
assertEq(isSuccess(mr), success, mr);
|
|
265
262
|
};
|
|
266
263
|
expect('', false);
|
|
267
264
|
expect('[]', true);
|
|
@@ -274,9 +271,7 @@ export const proof = {
|
|
|
274
271
|
const isSuccess = (mr) => mr[1] && mr[2]?.length === 0;
|
|
275
272
|
const expect = (s, success) => {
|
|
276
273
|
const mr = m('', toArray(stringToCodePointList(s)));
|
|
277
|
-
|
|
278
|
-
throw mr;
|
|
279
|
-
}
|
|
274
|
+
assertEq(isSuccess(mr), success, mr);
|
|
280
275
|
};
|
|
281
276
|
expect(' true ', true);
|
|
282
277
|
expect(' tr2ue ', false);
|
|
@@ -354,5 +349,27 @@ export const proof = {
|
|
|
354
349
|
const conflictRule = { 'a': range('AA'), 'b': range('AA') };
|
|
355
350
|
dispatchMap(toData(conflictRule)[0]);
|
|
356
351
|
}
|
|
357
|
-
}
|
|
352
|
+
},
|
|
353
|
+
// Regression: `emptyTagMap` must stay correct for cyclic rule references.
|
|
354
|
+
// A naive single-pass, memoized derivation that marks a rule nullable as
|
|
355
|
+
// a placeholder *before* recursing into its own children (to break the
|
|
356
|
+
// cycle) over-approximates nullability here, and made `dispatchMap`
|
|
357
|
+
// falsely report a first/first conflict for this grammar even though it
|
|
358
|
+
// has none — `value` only ever nests inside brackets or is the literal
|
|
359
|
+
// `a`, and `ws` is genuinely optional on both sides of it.
|
|
360
|
+
cyclicNullability: () => {
|
|
361
|
+
const ws = option(' ');
|
|
362
|
+
const value = () => ({ array: ['[', value, ']'], leaf: 'a' });
|
|
363
|
+
const m = parser([ws, value, ws]); // must not throw 'can not merge'
|
|
364
|
+
const expect = (s, success) => {
|
|
365
|
+
const mr = m('', toArray(stringToCodePointList(s)));
|
|
366
|
+
assertEq(mr[1] && mr[2]?.length === 0, success, mr);
|
|
367
|
+
};
|
|
368
|
+
expect('a', true);
|
|
369
|
+
expect(' a ', true);
|
|
370
|
+
expect('[a]', true);
|
|
371
|
+
expect('[[a]]', true);
|
|
372
|
+
expect(' [[a]] ', true);
|
|
373
|
+
expect('b', false);
|
|
374
|
+
},
|
|
358
375
|
};
|
|
@@ -6,6 +6,21 @@ import { type Array2 } from '../types/array/module.f.ts';
|
|
|
6
6
|
* For example: 0xBBBBBB_EEEEEE
|
|
7
7
|
* - 0xBBBBBB is the first symbol (24 bits)
|
|
8
8
|
* - 0xEEEEEE is the last symbol (24 bits)
|
|
9
|
+
*
|
|
10
|
+
* 24 bits per half, not 26 (the most `float64`'s 52-bit safe-integer mantissa
|
|
11
|
+
* could fit two of): 24 is divisible by 4, so each half is exactly 6 hex
|
|
12
|
+
* digits, and the packed pair reads as a plain `0xYYYYYY_ZZZZZZ` literal with
|
|
13
|
+
* no partial hex digit at either boundary. 26 bits would still be safe to
|
|
14
|
+
* store but wouldn't align to hex nibbles, making the packed literal harder
|
|
15
|
+
* to read and split by eye.
|
|
16
|
+
*
|
|
17
|
+
* Not 16 bits (32 bits total) either, even though a 32-bit pair would fit in
|
|
18
|
+
* a JS bitwise operator's native 32-bit range (JS `|`/`&`/`<<`/etc. operate on
|
|
19
|
+
* 32-bit ints, whereas the 48-bit pair used here, and even a 52-bit one,
|
|
20
|
+
* would need converting to `BigInt` for bitwise operations). 16 bits per
|
|
21
|
+
* symbol can't hold a full Unicode code point: the max scalar value `0x10FFFF`
|
|
22
|
+
* needs 21 bits, well past `0xFFFF`. So the bitwise-op convenience of 16 loses
|
|
23
|
+
* to the requirement of representing every Unicode code point in one half.
|
|
9
24
|
*/
|
|
10
25
|
export type TerminalRange = number;
|
|
11
26
|
/**
|
|
@@ -16,10 +31,6 @@ export declare const fullRange: TerminalRange;
|
|
|
16
31
|
* Unicode scalar value range packed into a single {@link TerminalRange}.
|
|
17
32
|
*/
|
|
18
33
|
export declare const unicodeRange: TerminalRange;
|
|
19
|
-
/**
|
|
20
|
-
* Maximal non-Unicode symbol encoded as a string value.
|
|
21
|
-
*/
|
|
22
|
-
export declare const max: string;
|
|
23
34
|
/**
|
|
24
35
|
* Maximal Unicode code point encoded as a string value.
|
|
25
36
|
*/
|
|
@@ -48,7 +59,10 @@ export declare const rangeEncode: (a: number, b: number) => TerminalRange;
|
|
|
48
59
|
*/
|
|
49
60
|
export declare const oneEncode: (a: number) => TerminalRange;
|
|
50
61
|
/**
|
|
51
|
-
* End-of-file marker
|
|
62
|
+
* End-of-file marker: `mask`, the single largest value the 24-bit symbol
|
|
63
|
+
* space can hold (the top of `fullRange`). Deliberately outside Unicode
|
|
64
|
+
* (`unicodeRange` tops out at `0x10FFFF`) so it can never collide with a
|
|
65
|
+
* real code point.
|
|
52
66
|
*/
|
|
53
67
|
export declare const eof: TerminalRange;
|
|
54
68
|
/**
|