functionalscript 0.36.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/module.f.js +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/module.f.js +3 -3
- package/{fs → fjs}/base_n/proof.f.js +15 -39
- package/{fs → fjs/basen}/base128/module.f.d.ts +1 -1
- package/{fs → fjs/basen}/base128/module.f.js +1 -1
- package/{fs → fjs/basen}/base128/proof.f.js +3 -3
- package/{fs → fjs/basen}/base64/module.f.d.ts +2 -2
- package/{fs → fjs/basen}/base64/module.f.js +25 -15
- package/{fs → fjs/basen}/base64/proof.f.d.ts +2 -0
- package/{fs → fjs/basen}/base64/proof.f.js +26 -6
- package/{fs → fjs/basen}/cbase32/module.f.d.ts +2 -2
- package/{fs → fjs/basen}/cbase32/module.f.js +2 -2
- package/{fs → fjs/basen}/cbase32/proof.f.js +16 -43
- package/fjs/bnf/data/module.f.d.ts +52 -0
- package/{fs → fjs}/bnf/data/module.f.js +56 -6
- package/{fs → fjs}/bnf/data/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/data/proof.f.js +59 -24
- 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 +59 -28
- package/{fs → fjs}/bnf/ll1/module.f.d.ts +4 -4
- package/{fs → fjs}/bnf/ll1/module.f.js +15 -13
- package/{fs → fjs}/bnf/ll1/proof.f.d.ts +1 -0
- package/{fs → fjs}/bnf/ll1/proof.f.js +33 -16
- package/{fs → fjs}/bnf/module.f.d.ts +19 -5
- package/{fs → fjs}/bnf/module.f.js +14 -15
- package/fjs/bnf/proof.f.js +69 -0
- package/{fs → fjs}/bnf/testlib.f.js +2 -2
- package/{fs → fjs}/cas/cli/module.f.js +7 -7
- package/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
- package/{fs → fjs}/cas/cli/proof.f.js +37 -74
- 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/fjs/cas/mcp/module.f.js +267 -0
- package/{fs → fjs}/cas/mcp/proof.f.d.ts +7 -2
- package/{fs → fjs}/cas/mcp/proof.f.js +116 -60
- package/{fs → fjs}/cas/module.f.d.ts +10 -0
- package/{fs → fjs}/cas/module.f.js +36 -10
- package/{fs → fjs}/cas/proof.f.d.ts +8 -2
- package/{fs → fjs}/cas/proof.f.js +85 -94
- package/{fs → fjs}/ci/bun/module.f.js +2 -2
- package/{fs → fjs}/ci/common/module.f.d.ts +2 -2
- package/{fs → fjs}/ci/common/module.f.js +4 -4
- package/fjs/ci/config/module.f.d.ts +42 -0
- package/{fs → fjs}/ci/config/module.f.js +6 -8
- package/fjs/ci/deno/module.f.js +20 -0
- package/{fs → fjs}/ci/module.f.js +9 -9
- package/{fs → fjs}/ci/node/module.f.d.ts +1 -1
- package/{fs → fjs}/ci/node/module.f.js +3 -5
- package/{fs → fjs}/ci/playwright/module.f.js +3 -3
- package/{fs → fjs}/ci/proof.f.js +27 -22
- package/{fs → fjs}/ci/rust/module.f.js +11 -3
- package/{fs → fjs}/cli/module.f.js +3 -3
- package/{fs → fjs}/cli/proof.f.js +25 -66
- package/{fs/types → fjs/common}/monoid/module.f.d.ts +1 -1
- package/{fs/types → fjs/common}/monoid/proof.f.js +4 -9
- package/{fs → fjs}/crypto/hmac/module.f.js +2 -2
- package/{fs → fjs}/crypto/hmac/proof.f.js +9 -17
- package/{fs → fjs}/crypto/pow/module.f.js +3 -3
- package/fjs/crypto/pow/proof.f.js +111 -0
- package/{fs → fjs}/crypto/secp/module.f.js +2 -2
- package/{fs → fjs}/crypto/secp/proof.f.js +14 -35
- package/{fs → fjs}/crypto/sha2/module.f.js +2 -2
- package/{fs → fjs}/crypto/sha2/proof.f.js +23 -54
- package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
- package/{fs → fjs}/crypto/sign/module.f.js +11 -8
- package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
- package/{fs → fjs}/crypto/vdf/module.f.js +1 -1
- package/{fs → fjs}/crypto/vdf/proof.f.js +23 -64
- package/{fs → fjs}/dev/module.f.js +6 -6
- package/{fs → fjs}/dev/package_json/module.f.js +6 -6
- package/{fs → fjs}/dev/package_json/proof.f.js +9 -9
- package/{fs → fjs}/dev/proof.f.js +3 -5
- package/{fs → fjs}/djs/ast/module.f.js +2 -2
- package/{fs → fjs}/djs/ast/proof.f.js +8 -16
- package/fjs/djs/examples/m.f.d.ts +2 -0
- package/{fs → fjs}/djs/module.f.d.ts +1 -1
- package/{fs → fjs}/djs/module.f.js +5 -5
- package/{fs → fjs}/djs/parser/module.f.d.ts +5 -0
- package/{fs → fjs}/djs/parser/module.f.js +24 -4
- package/{fs → fjs}/djs/parser/proof.f.js +145 -407
- package/{fs → fjs}/djs/proof.f.js +16 -39
- package/{fs → fjs}/djs/serializer/module.f.js +6 -6
- package/{fs → fjs}/djs/serializer/proof.f.js +18 -43
- 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 +447 -446
- package/{fs → fjs}/djs/transpiler/module.f.d.ts +5 -0
- package/{fs → fjs}/djs/transpiler/module.f.js +21 -11
- package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
- package/fjs/djs/transpiler/proof.f.js +67 -0
- package/{fs → fjs}/effects/memory/module.f.js +4 -4
- package/{fs → fjs}/effects/memory/proof.f.js +11 -24
- package/{fs → fjs}/effects/module.f.js +1 -1
- package/{fs → fjs}/effects/node/memory/module.js +2 -2
- package/{fs → fjs}/effects/node/memory/proof.js +8 -15
- 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.f.js +7 -7
- package/{fs → fjs}/effects/node/module.js +13 -13
- 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/module.f.js +7 -7
- package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +2 -0
- package/{fs → fjs}/effects/node/virtual/proof.f.js +44 -30
- package/{fs → fjs}/effects/proof.f.js +18 -47
- package/fjs/emergent_testing/all.test.js +4 -0
- package/{fs → fjs}/emergent_testing/example.f.d.ts +1 -1
- package/{fs → fjs}/emergent_testing/module.f.js +6 -6
- package/{fs → fjs}/emergent_testing/proof.f.d.ts +19 -17
- package/{fs → fjs}/emergent_testing/proof.f.js +14 -14
- package/fjs/emergent_testing/scenarios/all.js +1 -0
- package/{fs → fjs}/fsc/bnf.f.js +2 -2
- package/{fs → fjs}/fsc/json.f.js +1 -1
- package/{fs → fjs}/fsc/module.f.js +7 -7
- package/{fs → fjs}/fsc/proof.f.js +16 -38
- package/{fs → fjs}/fsm/module.f.js +9 -9
- package/{fs → fjs}/fsm/proof.f.js +12 -19
- package/{fs → fjs}/js/tokenizer/module.f.js +7 -7
- package/{fs → fjs}/js/tokenizer/proof.f.js +5 -5
- package/{fs → fjs}/mcp/module.f.d.ts +20 -13
- package/{fs → fjs}/mcp/module.f.js +16 -9
- package/{fs → fjs}/mcp/proof.f.js +17 -17
- package/{fs → fjs}/mcp/stdio/module.f.d.ts +4 -4
- package/{fs → fjs}/mcp/stdio/module.f.js +12 -12
- package/{fs → fjs}/mcp/stdio/proof.f.js +10 -10
- package/{fs → fjs/media}/html/module.f.d.ts +3 -3
- package/{fs → fjs/media}/html/module.f.js +9 -9
- package/{fs → fjs/media}/html/proof.f.js +12 -33
- package/fjs/media/json/module.f.d.ts +50 -0
- package/{fs → fjs/media}/json/module.f.js +7 -7
- package/{fs → fjs/media}/json/parser/module.f.d.ts +7 -2
- package/{fs → fjs/media}/json/parser/module.f.js +21 -7
- package/{fs → fjs/media}/json/parser/proof.f.js +45 -120
- package/{fs → fjs/media}/json/proof.f.js +4 -4
- package/fjs/media/json/rpc/module.f.d.ts +114 -0
- package/{fs → fjs/media}/json/rpc/module.f.js +4 -4
- package/{fs → fjs/media}/json/rpc/proof.f.js +4 -4
- package/fjs/media/json/schema/module.f.d.ts +78 -0
- package/{fs → fjs/media}/json/schema/module.f.js +25 -41
- package/{fs → fjs/media}/json/schema/proof.f.js +6 -9
- package/{fs → fjs/media}/json/serializer/module.f.d.ts +1 -1
- package/{fs → fjs/media}/json/serializer/module.f.js +2 -2
- package/{fs → fjs/media}/json/serializer/proof.f.js +12 -29
- package/{fs → fjs/media}/json/tokenizer/module.f.d.ts +2 -2
- package/{fs → fjs/media}/json/tokenizer/module.f.js +4 -4
- package/{fs → fjs/media}/json/tokenizer/proof.f.js +5 -5
- package/fjs/media/module.f.d.ts +37 -0
- package/fjs/media/module.f.js +23 -0
- package/fjs/media/proof.f.d.ts +9 -0
- package/fjs/media/proof.f.js +58 -0
- package/fjs/media/revision/module.f.d.ts +78 -0
- package/fjs/media/revision/module.f.js +122 -0
- package/fjs/media/revision/proof.f.d.ts +31 -0
- package/fjs/media/revision/proof.f.js +140 -0
- package/{fs/mime → fjs/media/type}/module.f.d.ts +6 -6
- package/{fs/mime → fjs/media/type}/module.f.js +6 -6
- package/{fs/mime → fjs/media/type}/proof.f.js +8 -12
- package/fjs/module.f.d.ts +2 -0
- package/{fs/fjs → fjs}/module.f.js +9 -9
- package/fjs/module.js +4 -0
- package/{fs → fjs}/path/module.f.js +2 -2
- package/{fs → fjs}/path/proof.f.js +27 -78
- package/{fs/fjs → fjs}/proof.f.js +6 -4
- package/{fs → fjs}/sul/id/module.f.js +9 -9
- package/{fs → fjs}/sul/id/proof.f.js +12 -26
- package/{fs → fjs}/sul/level/hash/module.f.js +3 -3
- package/{fs → fjs}/sul/level/hash/proof.f.js +8 -8
- package/{fs → fjs}/sul/level/literal/module.f.js +5 -5
- package/{fs → fjs}/sul/level/literal/proof.f.js +15 -29
- package/{fs → fjs}/sul/module.f.js +3 -3
- package/{fs → fjs}/sul/proof.f.js +3 -3
- package/fjs/text/ascii/proof.f.d.ts +6 -0
- package/fjs/text/ascii/proof.f.js +14 -0
- package/{fs → fjs}/text/code_point/module.f.js +12 -12
- package/{fs → fjs}/text/code_point/proof.f.js +1 -1
- package/{fs → fjs}/text/module.f.js +5 -5
- package/{fs → fjs}/text/proof.f.js +7 -12
- package/{fs → fjs}/text/sgr/module.f.js +2 -2
- package/{fs → fjs}/text/sgr/proof.f.js +8 -17
- package/{fs → fjs}/text/utf16/module.f.js +6 -6
- package/{fs → fjs}/text/utf16/proof.f.js +27 -70
- package/{fs → fjs}/text/utf8/module.f.js +22 -17
- package/{fs → fjs}/text/utf8/proof.f.js +59 -128
- package/{fs → fjs}/types/array/module.f.js +1 -1
- package/{fs → fjs}/types/array/proof.f.js +21 -55
- package/{fs → fjs}/types/bigfloat/module.f.js +1 -1
- package/fjs/types/bigfloat/proof.f.js +217 -0
- package/{fs → fjs}/types/bigint/module.f.js +2 -2
- package/{fs → fjs}/types/bigint/proof.f.js +51 -147
- package/{fs → fjs}/types/bit_vec/module.f.js +8 -8
- package/{fs → fjs}/types/bit_vec/proof.f.js +76 -218
- package/{fs → fjs}/types/btree/find/module.f.js +1 -1
- package/fjs/types/btree/find/proof.f.d.ts +3 -0
- package/fjs/types/btree/find/proof.f.js +108 -0
- package/{fs → fjs}/types/btree/module.f.js +2 -2
- package/fjs/types/btree/proof.f.d.ts +13 -0
- package/{fs → fjs}/types/btree/proof.f.js +12 -19
- package/{fs → fjs}/types/btree/remove/module.f.js +4 -4
- package/fjs/types/btree/remove/proof.f.d.ts +9 -0
- package/{fs → fjs}/types/btree/remove/proof.f.js +88 -235
- package/{fs → fjs}/types/btree/set/module.f.js +8 -5
- package/{fs → fjs}/types/btree/set/proof.f.js +39 -28
- package/{fs → fjs}/types/byte_set/module.f.js +2 -2
- package/fjs/types/byte_set/proof.f.js +79 -0
- package/{fs → fjs}/types/function/compare/proof.f.js +14 -37
- package/fjs/types/function/operator/proof.f.d.ts +23 -0
- package/{fs → fjs}/types/function/operator/proof.f.js +18 -49
- package/{fs → fjs}/types/function/proof.f.js +3 -4
- package/{fs → fjs}/types/list/module.f.js +2 -2
- package/fjs/types/list/proof.f.d.ts +30 -0
- package/{fs → fjs}/types/list/proof.f.js +59 -167
- package/{fs → fjs}/types/map/proof.f.js +6 -14
- package/fjs/types/nibble_set/proof.f.js +60 -0
- package/{fs → fjs}/types/nominal/proof.f.js +5 -10
- package/{fs → fjs}/types/nullable/module.f.js +2 -2
- package/fjs/types/nullable/proof.f.js +29 -0
- package/{fs → fjs}/types/number/module.f.js +5 -5
- package/{fs → fjs}/types/number/proof.f.js +10 -25
- package/{fs → fjs}/types/object/module.f.js +4 -4
- package/{fs → fjs}/types/object/proof.f.js +4 -7
- package/{fs → fjs}/types/ordered_map/module.f.js +6 -6
- package/{fs → fjs}/types/ordered_map/proof.f.js +3 -3
- package/fjs/types/patricia_trie/proof.f.d.ts +13 -0
- package/{fs → fjs}/types/patricia_trie/proof.f.js +22 -22
- package/{fs → fjs}/types/prime_field/module.f.js +3 -8
- package/{fs → fjs}/types/prime_field/proof.f.js +2 -2
- 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/module.f.js +4 -4
- package/{fs → fjs}/types/range_map/proof.f.js +35 -88
- package/{fs → fjs}/types/result/module.js +1 -1
- package/fjs/types/result/proof.f.d.ts +12 -0
- 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 +48 -4
- 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/module.f.d.ts +2 -2
- package/{fs → fjs}/types/rtti/module.f.js +1 -1
- package/{fs → fjs}/types/rtti/parse/module.f.js +16 -25
- package/{fs → fjs}/types/rtti/parse/proof.f.js +9 -20
- package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
- package/{fs → fjs}/types/rtti/ts/module.f.js +1 -1
- package/{fs → fjs}/types/rtti/ts/proof.f.js +2 -2
- package/{fs → fjs}/types/rtti/validate/module.f.js +11 -32
- package/{fs → fjs}/types/rtti/validate/proof.f.js +6 -11
- package/{fs → fjs}/types/sorted_list/module.f.js +3 -3
- package/{fs → fjs}/types/sorted_list/proof.f.js +14 -27
- package/{fs → fjs}/types/sorted_set/module.f.js +1 -1
- package/{fs → fjs}/types/sorted_set/proof.f.js +20 -45
- package/{fs → fjs}/types/string/module.f.js +4 -4
- package/fjs/types/string/proof.f.js +77 -0
- package/{fs → fjs}/types/string_set/module.f.js +6 -6
- package/fjs/types/string_set/proof.f.js +43 -0
- package/{fs → fjs}/types/ts/proof.f.d.ts +18 -18
- package/{fs → fjs}/types/ts/proof.f.js +16 -43
- package/{fs → fjs}/types/uint8array/module.f.js +10 -10
- package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
- package/{fs → fjs}/types/uint8array/proof.f.js +11 -11
- package/{fs → fjs}/website/module.f.js +3 -3
- package/fjs/website/proof.f.js +13 -0
- package/package.json +8 -8
- 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/cas/mcp/module.f.js +0 -249
- package/fs/ci/config/module.f.d.ts +0 -43
- package/fs/ci/deno/module.f.js +0 -16
- package/fs/crypto/pow/proof.f.js +0 -161
- package/fs/djs/examples/m.f.d.ts +0 -2
- 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/djs/transpiler/proof.f.js +0 -68
- package/fs/emergent_testing/all.test.js +0 -4
- package/fs/emergent_testing/scenarios/all.js +0 -1
- package/fs/fjs/module.f.d.ts +0 -2
- package/fs/fjs/module.js +0 -4
- package/fs/json/module.f.d.ts +0 -50
- package/fs/json/rpc/module.f.d.ts +0 -114
- package/fs/json/schema/module.f.d.ts +0 -77
- package/fs/text/ascii/proof.f.d.ts +0 -4
- package/fs/text/ascii/proof.f.js +0 -24
- package/fs/types/bigfloat/proof.f.js +0 -348
- package/fs/types/btree/find/proof.f.js +0 -151
- package/fs/types/btree/proof.f.d.ts +0 -7
- package/fs/types/btree/remove/proof.f.d.ts +0 -4
- package/fs/types/byte_set/proof.f.js +0 -120
- package/fs/types/function/operator/proof.f.d.ts +0 -12
- package/fs/types/list/proof.f.d.ts +0 -22
- package/fs/types/nibble_set/proof.f.js +0 -89
- package/fs/types/nullable/proof.f.js +0 -50
- package/fs/types/patricia_trie/proof.f.d.ts +0 -7
- package/fs/types/range/module.f.js +0 -2
- package/fs/types/range/proof.f.d.ts +0 -1
- package/fs/types/range/proof.f.js +0 -18
- package/fs/types/result/proof.f.d.ts +0 -6
- 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/website/proof.f.js +0 -16
- /package/{fs → fjs}/asn.1/module.f.d.ts +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/proof.f.d.ts +0 -0
- /package/{fs → fjs/basen}/base128/proof.f.d.ts +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}/ci/bun/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/module.f.d.ts +0 -0
- /package/{fs → fjs}/ci/playwright/module.f.d.ts +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/proof.f.d.ts +0 -0
- /package/{fs/types → fjs/common}/monoid/module.f.js +0 -0
- /package/{fs/types → 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/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/pow/module.f.d.ts +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/proof.f.d.ts +0 -0
- /package/{fs → fjs}/crypto/sha2/module.f.d.ts +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/proof.f.d.ts +0 -0
- /package/{fs → fjs}/dev/module.f.d.ts +0 -0
- /package/{fs → fjs}/dev/package_json/module.f.d.ts +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/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.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/proof.f.d.ts +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/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.js +0 -0
- /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
- /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
- /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +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/example.f.js +0 -0
- /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
- /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +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/json.f.d.ts +0 -0
- /package/{fs → fjs}/fsc/module.f.d.ts +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/proof.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
- /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +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/media}/html/proof.f.d.ts +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/rpc/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/schema/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/serializer/proof.f.d.ts +0 -0
- /package/{fs → fjs/media}/json/tokenizer/proof.f.d.ts +0 -0
- /package/{fs/mime → fjs/media/type}/proof.f.d.ts +0 -0
- /package/{fs/fjs → fjs}/module.d.ts +0 -0
- /package/{fs → fjs}/path/module.f.d.ts +0 -0
- /package/{fs → fjs}/path/proof.f.d.ts +0 -0
- /package/{fs/fjs → fjs}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/id/module.f.d.ts +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/proof.f.d.ts +0 -0
- /package/{fs → fjs}/sul/level/literal/module.f.d.ts +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/proof.f.d.ts +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/module.f.d.ts +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/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/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/array/module.f.d.ts +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/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/bigint/module.f.d.ts +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/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
- /package/{fs → fjs}/types/btree/remove/module.f.d.ts +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/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/types/btree/find → 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/types/function/compare → fjs/types/function}/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/list/module.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/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/number/module.f.d.ts +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/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/proof.f.d.ts +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/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/types/function → 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/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/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/proof.f.d.ts +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/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/sorted_set/module.f.d.ts +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/proof.f.d.ts +0 -0
- /package/{fs → fjs}/types/string_set/module.f.d.ts +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/uint8array/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/module.f.d.ts +0 -0
- /package/{fs → fjs}/website/proof.f.d.ts +0 -0
|
@@ -1,26 +1,19 @@
|
|
|
1
|
-
import { empty, vec } from "
|
|
1
|
+
import { empty, vec } from "../../types/bit_vec/module.f.js";
|
|
2
2
|
import { cBase32ToVec, cBase32ToVec5x, vec5xToCBase32, vecToCBase32 } from "./module.f.js";
|
|
3
|
+
import { assertEq } from '../../asserts/module.f.js';
|
|
3
4
|
const check5x = (s, v) => {
|
|
4
5
|
const sr = vec5xToCBase32(v);
|
|
5
|
-
|
|
6
|
-
throw [sr, s];
|
|
7
|
-
}
|
|
6
|
+
assertEq(sr, s, [sr, s]);
|
|
8
7
|
const vr = cBase32ToVec5x(s);
|
|
9
|
-
|
|
10
|
-
throw [vr, v];
|
|
11
|
-
}
|
|
8
|
+
assertEq(vr, v, [vr, v]);
|
|
12
9
|
//
|
|
13
10
|
check(`${s}g`, v);
|
|
14
11
|
};
|
|
15
12
|
const check = (s, v) => {
|
|
16
13
|
const sr = vecToCBase32(v);
|
|
17
|
-
|
|
18
|
-
throw [sr, s];
|
|
19
|
-
}
|
|
14
|
+
assertEq(sr, s, [sr, s]);
|
|
20
15
|
const vr = cBase32ToVec(s);
|
|
21
|
-
|
|
22
|
-
throw [vr, v];
|
|
23
|
-
}
|
|
16
|
+
assertEq(vr, v, [vr, v]);
|
|
24
17
|
};
|
|
25
18
|
export const proof = {
|
|
26
19
|
roundtrip5x: () => {
|
|
@@ -50,40 +43,20 @@ export const proof = {
|
|
|
50
43
|
unalignedBits: () => {
|
|
51
44
|
const v = vec(1n)(1n);
|
|
52
45
|
const cr = vec5xToCBase32(v);
|
|
53
|
-
|
|
54
|
-
throw ['g', cr];
|
|
55
|
-
}
|
|
46
|
+
assertEq(cr, "g", ['g', cr]);
|
|
56
47
|
},
|
|
57
48
|
caseInsensitive: () => {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
if (cBase32ToVec5x("l") !== cBase32ToVec5x("1")) {
|
|
65
|
-
throw 'l maps to 1';
|
|
66
|
-
}
|
|
67
|
-
if (cBase32ToVec5x("o") !== cBase32ToVec5x("0")) {
|
|
68
|
-
throw 'o maps to 0';
|
|
69
|
-
}
|
|
70
|
-
if (cBase32ToVec5x("u") !== null) {
|
|
71
|
-
throw 'should error on invalid character';
|
|
72
|
-
}
|
|
49
|
+
assertEq(cBase32ToVec5x("A"), cBase32ToVec5x("a"), 'case-insensitive expected');
|
|
50
|
+
assertEq(cBase32ToVec5x("I"), cBase32ToVec5x("1"), 'i maps to 1');
|
|
51
|
+
assertEq(cBase32ToVec5x("l"), cBase32ToVec5x("1"), 'l maps to 1');
|
|
52
|
+
assertEq(cBase32ToVec5x("o"), cBase32ToVec5x("0"), 'o maps to 0');
|
|
53
|
+
assertEq(cBase32ToVec5x("u"), null, 'should error on invalid character');
|
|
73
54
|
},
|
|
74
55
|
unterminated: () => {
|
|
75
56
|
// No sentinel `1` bit → invalid; must return null, not loop forever.
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
throw 'single zero symbol must be null';
|
|
81
|
-
}
|
|
82
|
-
if (cBase32ToVec("00") !== null) {
|
|
83
|
-
throw 'all-zero symbols must be null';
|
|
84
|
-
}
|
|
85
|
-
if (cBase32ToVec("o") !== null) {
|
|
86
|
-
throw 'o (maps to 0) must be null';
|
|
87
|
-
}
|
|
57
|
+
assertEq(cBase32ToVec(""), null, 'empty must be null');
|
|
58
|
+
assertEq(cBase32ToVec("0"), null, 'single zero symbol must be null');
|
|
59
|
+
assertEq(cBase32ToVec("00"), null, 'all-zero symbols must be null');
|
|
60
|
+
assertEq(cBase32ToVec("o"), null, 'o (maps to 0) must be null');
|
|
88
61
|
}
|
|
89
62
|
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type Rule as FRule } from '../module.f.ts';
|
|
2
|
+
import { type StringMap } from '../../types/object/module.f.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Encoded terminal range value used by BNF data rules.
|
|
5
|
+
*
|
|
6
|
+
* The same as the functional TerminalRange.
|
|
7
|
+
*/
|
|
8
|
+
export type TerminalRange = number;
|
|
9
|
+
/**
|
|
10
|
+
* Ordered list of grammar rule names.
|
|
11
|
+
*/
|
|
12
|
+
export type Sequence = readonly string[];
|
|
13
|
+
/** A variant of rule names. */
|
|
14
|
+
export type Variant = StringMap<string, string>;
|
|
15
|
+
/**
|
|
16
|
+
* Grammar rule definition.
|
|
17
|
+
*
|
|
18
|
+
* It can be one of:
|
|
19
|
+
* - a tagged variant map,
|
|
20
|
+
* - a sequence of referenced rule names,
|
|
21
|
+
* - an encoded terminal range.
|
|
22
|
+
*/
|
|
23
|
+
export type Rule = Variant | Sequence | TerminalRange;
|
|
24
|
+
/** The full grammar */
|
|
25
|
+
export type RuleSet = Readonly<Record<string, Rule>>;
|
|
26
|
+
/**
|
|
27
|
+
* Whether a rule can match empty input: `undefined` if it never can, `true`
|
|
28
|
+
* if it can with no tag (a nullable sequence), or the tag of the nullable
|
|
29
|
+
* variant branch.
|
|
30
|
+
*/
|
|
31
|
+
export type EmptyTag = string | true | undefined;
|
|
32
|
+
type EmptyTagMap = StringMap<string, EmptyTag>;
|
|
33
|
+
/**
|
|
34
|
+
* Computes, for every rule in the set, whether it can match empty input, by
|
|
35
|
+
* the standard nullable-set fixpoint: a sequence is nullable iff all of its
|
|
36
|
+
* items are (AND semantics), a variant iff at least one branch is (its tag is
|
|
37
|
+
* that branch's). Rules may reference each other cyclically (e.g. a `repeat`
|
|
38
|
+
* rule referring to itself), so this starts every rule as non-nullable and
|
|
39
|
+
* relaxes every rule, one round at a time, until a full round changes
|
|
40
|
+
* nothing. A round only ever grows the nullable set or moves a variant's
|
|
41
|
+
* chosen tag to a later (still-nullable) branch, both bounded, so this always
|
|
42
|
+
* terminates — but a rule's tag can still change for rounds *after* its own
|
|
43
|
+
* nullable/non-nullable status has already settled, while a cyclic
|
|
44
|
+
* dependency's tag catches up, so a fixed round count isn't enough.
|
|
45
|
+
*/
|
|
46
|
+
export declare const emptyTagMap: (ruleSet: RuleSet) => EmptyTagMap;
|
|
47
|
+
/**
|
|
48
|
+
* Converts a functional grammar rule into serializable BNF data and returns
|
|
49
|
+
* the generated rule set with the entry rule identifier.
|
|
50
|
+
*/
|
|
51
|
+
export declare const toData: (fr: FRule) => readonly [RuleSet, string];
|
|
52
|
+
export {};
|
|
@@ -5,15 +5,65 @@
|
|
|
5
5
|
* This module is the pure, parser-agnostic substrate: it defines the
|
|
6
6
|
* {@link RuleSet} data form (`Rule = Variant | Sequence | TerminalRange`) and
|
|
7
7
|
* converts a functional grammar into it. The automaton builders that consume a
|
|
8
|
-
* {@link RuleSet} live in their own sibling modules (`
|
|
9
|
-
* `
|
|
8
|
+
* {@link RuleSet} live in their own sibling modules (`fjs/bnf/ll1`,
|
|
9
|
+
* `fjs/bnf/descent`, …), so the IR stays free of any one parser's machinery.
|
|
10
10
|
*
|
|
11
11
|
* @module
|
|
12
12
|
*/
|
|
13
|
-
import { stringToCodePointList } from
|
|
14
|
-
import { map, toArray } from
|
|
15
|
-
import { oneEncode, } from
|
|
16
|
-
import {} from
|
|
13
|
+
import { stringToCodePointList } from '../../text/utf16/module.f.js';
|
|
14
|
+
import { map, toArray } from '../../types/list/module.f.js';
|
|
15
|
+
import { oneEncode, } from '../module.f.js';
|
|
16
|
+
import { definedEntries } from '../../types/object/module.f.js';
|
|
17
|
+
const emptyTagOf = (map) => (rule) => {
|
|
18
|
+
if (typeof rule === 'number') {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
else if (rule instanceof Array) {
|
|
22
|
+
return rule.every(item => map[item] !== undefined) ? true : undefined;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
let tag = undefined;
|
|
26
|
+
for (const [k, item] of definedEntries(rule)) {
|
|
27
|
+
if (map[item] !== undefined) {
|
|
28
|
+
tag = k;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return tag;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const emptyTagStep = (ruleSet) => (map) => {
|
|
35
|
+
let next = map;
|
|
36
|
+
let changed = false;
|
|
37
|
+
for (const name in ruleSet) {
|
|
38
|
+
const tag = emptyTagOf(map)(ruleSet[name]);
|
|
39
|
+
if (tag !== next[name]) {
|
|
40
|
+
changed = true;
|
|
41
|
+
}
|
|
42
|
+
next = { ...next, [name]: tag };
|
|
43
|
+
}
|
|
44
|
+
return [next, changed];
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Computes, for every rule in the set, whether it can match empty input, by
|
|
48
|
+
* the standard nullable-set fixpoint: a sequence is nullable iff all of its
|
|
49
|
+
* items are (AND semantics), a variant iff at least one branch is (its tag is
|
|
50
|
+
* that branch's). Rules may reference each other cyclically (e.g. a `repeat`
|
|
51
|
+
* rule referring to itself), so this starts every rule as non-nullable and
|
|
52
|
+
* relaxes every rule, one round at a time, until a full round changes
|
|
53
|
+
* nothing. A round only ever grows the nullable set or moves a variant's
|
|
54
|
+
* chosen tag to a later (still-nullable) branch, both bounded, so this always
|
|
55
|
+
* terminates — but a rule's tag can still change for rounds *after* its own
|
|
56
|
+
* nullable/non-nullable status has already settled, while a cyclic
|
|
57
|
+
* dependency's tag catches up, so a fixed round count isn't enough.
|
|
58
|
+
*/
|
|
59
|
+
export const emptyTagMap = (ruleSet) => {
|
|
60
|
+
const step = emptyTagStep(ruleSet);
|
|
61
|
+
const relax = (map) => {
|
|
62
|
+
const [next, changed] = step(map);
|
|
63
|
+
return changed ? relax(next) : next;
|
|
64
|
+
};
|
|
65
|
+
return relax({});
|
|
66
|
+
};
|
|
17
67
|
const { entries } = Object;
|
|
18
68
|
const find = (map) => (fr) => {
|
|
19
69
|
for (const [k, v] of entries(map)) {
|
|
@@ -1,23 +1,18 @@
|
|
|
1
|
-
import { stringify } from
|
|
2
|
-
import { identity } from
|
|
3
|
-
import { sort } from
|
|
4
|
-
import { oneEncode, option, range, rangeDecode, repeat0Plus, set } from
|
|
5
|
-
import { classic, deterministic } from
|
|
6
|
-
import { toData } from
|
|
1
|
+
import { stringify } from '../../media/json/module.f.js';
|
|
2
|
+
import { identity } from '../../types/function/module.f.js';
|
|
3
|
+
import { sort } from '../../types/object/module.f.js';
|
|
4
|
+
import { oneEncode, option, range, rangeDecode, repeat0Plus, set } from '../module.f.js';
|
|
5
|
+
import { classic, deterministic } from '../testlib.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
|
+
};
|