aontu 0.62.0 → 0.63.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/dist/agentsmd.js +0 -27
- package/dist/agentsmd.js.map +1 -1
- package/dist/alias.js.map +1 -1
- package/dist/allow.js +0 -92
- package/dist/allow.js.map +1 -1
- package/dist/aontu.d.ts +1 -1
- package/dist/aontu.js +1 -79
- package/dist/aontu.js.map +1 -1
- package/dist/aontumodel.d.ts +4 -0
- package/dist/aontumodel.js +33 -0
- package/dist/aontumodel.js.map +1 -0
- package/dist/cli.js +101 -620
- package/dist/cli.js.map +1 -1
- package/dist/ctx.js +0 -48
- package/dist/ctx.js.map +1 -1
- package/dist/diff.js +0 -32
- package/dist/diff.js.map +1 -1
- package/dist/err.js +0 -40
- package/dist/err.js.map +1 -1
- package/dist/escape.js +0 -45
- package/dist/escape.js.map +1 -1
- package/dist/exactjson.d.ts +0 -35
- package/dist/exactjson.js +0 -131
- package/dist/exactjson.js.map +1 -1
- package/dist/format.js +13 -203
- package/dist/format.js.map +1 -1
- package/dist/grammar.d.ts +9 -0
- package/dist/grammar.js +54 -0
- package/dist/grammar.js.map +1 -0
- package/dist/graph.js +0 -26
- package/dist/graph.js.map +1 -1
- package/dist/hcanon.js +0 -82
- package/dist/hcanon.js.map +1 -1
- package/dist/helpdoc.js +1 -1
- package/dist/helpdoc.js.map +1 -1
- package/dist/hints.d.ts +0 -6
- package/dist/hints.js +54 -55
- package/dist/hints.js.map +1 -1
- package/dist/jsonschema.js +0 -114
- package/dist/jsonschema.js.map +1 -1
- package/dist/keyorder.d.ts +0 -7
- package/dist/keyorder.js +0 -41
- package/dist/keyorder.js.map +1 -1
- package/dist/lang.js +17 -915
- package/dist/lang.js.map +1 -1
- package/dist/lower.js +11 -61
- package/dist/lower.js.map +1 -1
- package/dist/lsp-server.js +0 -16
- package/dist/lsp-server.js.map +1 -1
- package/dist/lsp.d.ts +1 -1
- package/dist/lsp.js +12 -159
- package/dist/lsp.js.map +1 -1
- package/dist/mcp-server.js +0 -26
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp.js +0 -113
- package/dist/mcp.js.map +1 -1
- package/dist/mod-tool.js +0 -130
- package/dist/mod-tool.js.map +1 -1
- package/dist/mod.js +0 -162
- package/dist/mod.js.map +1 -1
- package/dist/patch.js +0 -217
- package/dist/patch.js.map +1 -1
- package/dist/provenance.js +0 -140
- package/dist/provenance.js.map +1 -1
- package/dist/query.js +0 -75
- package/dist/query.js.map +1 -1
- package/dist/reach.js +0 -43
- package/dist/reach.js.map +1 -1
- package/dist/relation.js +0 -61
- package/dist/relation.js.map +1 -1
- package/dist/render.js +20 -135
- package/dist/render.js.map +1 -1
- package/dist/report-sarif.d.ts +0 -11
- package/dist/report-sarif.js +0 -28
- package/dist/report-sarif.js.map +1 -1
- package/dist/sig.js +0 -35
- package/dist/sig.js.map +1 -1
- package/dist/sigdecl.js +1 -1
- package/dist/sigdecl.js.map +1 -1
- package/dist/siggate.js +0 -4
- package/dist/siggate.js.map +1 -1
- package/dist/site.js +3 -29
- package/dist/site.js.map +1 -1
- package/dist/subsume.d.ts +0 -10
- package/dist/subsume.js +0 -137
- package/dist/subsume.js.map +1 -1
- package/dist/template.d.ts +2 -1
- package/dist/template.js +58 -138
- package/dist/template.js.map +1 -1
- package/dist/trim.js +0 -41
- package/dist/trim.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/type.js.map +1 -1
- package/dist/unify.js +12 -242
- package/dist/unify.js.map +1 -1
- package/dist/utility.js +0 -22
- package/dist/utility.js.map +1 -1
- package/dist/val/AbnfFuncVal.d.ts +18 -0
- package/dist/val/AbnfFuncVal.js +132 -0
- package/dist/val/AbnfFuncVal.js.map +1 -0
- package/dist/val/AbsentVal.d.ts +11 -0
- package/dist/val/AbsentVal.js +30 -0
- package/dist/val/AbsentVal.js.map +1 -0
- package/dist/val/AggFuncVal.d.ts +10 -1
- package/dist/val/AggFuncVal.js +104 -116
- package/dist/val/AggFuncVal.js.map +1 -1
- package/dist/val/ArithFuncVal.js +0 -12
- package/dist/val/ArithFuncVal.js.map +1 -1
- package/dist/val/BagVal.js +1 -78
- package/dist/val/BagVal.js.map +1 -1
- package/dist/val/BigDecimalVal.js +0 -16
- package/dist/val/BigDecimalVal.js.map +1 -1
- package/dist/val/BigIntegerVal.js +0 -16
- package/dist/val/BigIntegerVal.js.map +1 -1
- package/dist/val/CloseFuncVal.js +0 -9
- package/dist/val/CloseFuncVal.js.map +1 -1
- package/dist/val/CmpFuncVal.js +2 -59
- package/dist/val/CmpFuncVal.js.map +1 -1
- package/dist/val/ConjunctVal.js +0 -29
- package/dist/val/ConjunctVal.js.map +1 -1
- package/dist/val/ConstraintVal.js +0 -500
- package/dist/val/ConstraintVal.js.map +1 -1
- package/dist/val/ContainerKindVal.js +0 -2
- package/dist/val/ContainerKindVal.js.map +1 -1
- package/dist/val/CopyFuncVal.js +0 -3
- package/dist/val/CopyFuncVal.js.map +1 -1
- package/dist/val/Decimal.js +0 -179
- package/dist/val/Decimal.js.map +1 -1
- package/dist/val/DeprecateFuncVal.js.map +1 -1
- package/dist/val/DisjunctVal.js +0 -152
- package/dist/val/DisjunctVal.js.map +1 -1
- package/dist/val/EachFuncVal.js +0 -3
- package/dist/val/EachFuncVal.js.map +1 -1
- package/dist/val/EmitFuncVal.d.ts +1 -1
- package/dist/val/EmitFuncVal.js +6 -119
- package/dist/val/EmitFuncVal.js.map +1 -1
- package/dist/val/ExpectVal.js +0 -62
- package/dist/val/ExpectVal.js.map +1 -1
- package/dist/val/FilterFuncVal.js +0 -25
- package/dist/val/FilterFuncVal.js.map +1 -1
- package/dist/val/FuncBaseVal.d.ts +1 -0
- package/dist/val/FuncBaseVal.js +7 -127
- package/dist/val/FuncBaseVal.js.map +1 -1
- package/dist/val/GraphAtomVal.js +0 -15
- package/dist/val/GraphAtomVal.js.map +1 -1
- package/dist/val/HideFuncVal.js +0 -13
- package/dist/val/HideFuncVal.js.map +1 -1
- package/dist/val/IntegerVal.js +0 -61
- package/dist/val/IntegerVal.js.map +1 -1
- package/dist/val/JunctionVal.js +0 -20
- package/dist/val/JunctionVal.js.map +1 -1
- package/dist/val/KeyFuncVal.js +0 -46
- package/dist/val/KeyFuncVal.js.map +1 -1
- package/dist/val/ListVal.js +0 -57
- package/dist/val/ListVal.js.map +1 -1
- package/dist/val/LowerFuncVal.js +0 -11
- package/dist/val/LowerFuncVal.js.map +1 -1
- package/dist/val/MapVal.js +0 -151
- package/dist/val/MapVal.js.map +1 -1
- package/dist/val/MatchFuncVal.js +0 -27
- package/dist/val/MatchFuncVal.js.map +1 -1
- package/dist/val/{FormFuncVal.d.ts → MaybeFuncVal.d.ts} +5 -5
- package/dist/val/MaybeFuncVal.js +50 -0
- package/dist/val/MaybeFuncVal.js.map +1 -0
- package/dist/val/MoveFuncVal.js +0 -18
- package/dist/val/MoveFuncVal.js.map +1 -1
- package/dist/val/NilVal.js +0 -60
- package/dist/val/NilVal.js.map +1 -1
- package/dist/val/NomFuncVal.js +8 -42
- package/dist/val/NomFuncVal.js.map +1 -1
- package/dist/val/NumberVal.js +0 -15
- package/dist/val/NumberVal.js.map +1 -1
- package/dist/val/OpBaseVal.d.ts +1 -0
- package/dist/val/OpBaseVal.js +3 -15
- package/dist/val/OpBaseVal.js.map +1 -1
- package/dist/val/PackFuncVal.js +0 -34
- package/dist/val/PackFuncVal.js.map +1 -1
- package/dist/val/PathFuncVal.js +0 -6
- package/dist/val/PathFuncVal.js.map +1 -1
- package/dist/val/PathVal.js +0 -41
- package/dist/val/PathVal.js.map +1 -1
- package/dist/val/PlaceVal.js +0 -25
- package/dist/val/PlaceVal.js.map +1 -1
- package/dist/val/PlusOpVal.d.ts +1 -7
- package/dist/val/PlusOpVal.js +13 -74
- package/dist/val/PlusOpVal.js.map +1 -1
- package/dist/val/PrefFuncVal.js +0 -1
- package/dist/val/PrefFuncVal.js.map +1 -1
- package/dist/val/PrefVal.js +0 -167
- package/dist/val/PrefVal.js.map +1 -1
- package/dist/val/RecurseVal.js +0 -55
- package/dist/val/RecurseVal.js.map +1 -1
- package/dist/val/RefVal.js +0 -282
- package/dist/val/RefVal.js.map +1 -1
- package/dist/val/ReferFuncVal.js +0 -232
- package/dist/val/ReferFuncVal.js.map +1 -1
- package/dist/val/ScalarKindVal.js +0 -49
- package/dist/val/ScalarKindVal.js.map +1 -1
- package/dist/val/ScalarVal.js +0 -11
- package/dist/val/ScalarVal.js.map +1 -1
- package/dist/val/StrFuncVal.js +0 -18
- package/dist/val/StrFuncVal.js.map +1 -1
- package/dist/val/SuperFuncVal.js +0 -32
- package/dist/val/SuperFuncVal.js.map +1 -1
- package/dist/val/TopVal.js +0 -1
- package/dist/val/TopVal.js.map +1 -1
- package/dist/val/TranslateFuncVal.js +1 -3
- package/dist/val/TranslateFuncVal.js.map +1 -1
- package/dist/val/UpperFuncVal.js +0 -11
- package/dist/val/UpperFuncVal.js.map +1 -1
- package/dist/val/Val.d.ts +1 -0
- package/dist/val/Val.js +2 -133
- package/dist/val/Val.js.map +1 -1
- package/dist/val/VarVal.js +0 -12
- package/dist/val/VarVal.js.map +1 -1
- package/dist/val/arith.js +0 -37
- package/dist/val/arith.js.map +1 -1
- package/dist/val/caserange.js +0 -61
- package/dist/val/caserange.js.map +1 -1
- package/dist/val/members.js +0 -6
- package/dist/val/members.js.map +1 -1
- package/dist/val/numcmp.js +0 -11
- package/dist/val/numcmp.js.map +1 -1
- package/dist/val/numkind.js +0 -145
- package/dist/val/numkind.js.map +1 -1
- package/dist/val/valutil.js +0 -16
- package/dist/val/valutil.js.map +1 -1
- package/dist/vet.js +0 -461
- package/dist/vet.js.map +1 -1
- package/dist/view.js +0 -414
- package/dist/view.js.map +1 -1
- package/dist/walk.js +0 -41
- package/dist/walk.js.map +1 -1
- package/grammar/aontu.abnf +8 -6
- package/grammar/aontu.gbnf +4 -4
- package/grammar/aontu.lark +4 -4
- package/grammar/aontu.tmLanguage.json +1 -1
- package/package.json +4 -2
- package/src/agentsmd.ts +0 -35
- package/src/alias.ts +0 -39
- package/src/allow.ts +1 -96
- package/src/aontu.ts +3 -110
- package/src/aontumodel.ts +32 -0
- package/src/cli.ts +113 -682
- package/src/ctx.ts +0 -103
- package/src/diff.ts +0 -40
- package/src/err.ts +0 -40
- package/src/escape.ts +0 -46
- package/src/exactjson.ts +0 -131
- package/src/format.ts +14 -257
- package/src/grammar.ts +72 -0
- package/src/graph.ts +0 -61
- package/src/hcanon.ts +0 -82
- package/src/helpdoc.ts +1 -1
- package/src/hints.ts +66 -57
- package/src/jsonschema.ts +0 -123
- package/src/keyorder.ts +0 -42
- package/src/lang.ts +19 -931
- package/src/lower.ts +12 -62
- package/src/lsp-server.ts +0 -16
- package/src/lsp.ts +12 -180
- package/src/mcp-server.ts +0 -31
- package/src/mcp.ts +0 -130
- package/src/mod-tool.ts +0 -158
- package/src/mod.ts +0 -178
- package/src/patch.ts +0 -232
- package/src/provenance.ts +0 -183
- package/src/query.ts +0 -84
- package/src/reach.ts +0 -53
- package/src/relation.ts +0 -84
- package/src/render.ts +20 -172
- package/src/report-sarif.ts +0 -48
- package/src/sig.ts +0 -35
- package/src/sigdecl.ts +1 -1
- package/src/siggate.ts +0 -30
- package/src/site.ts +3 -29
- package/src/subsume.ts +1 -161
- package/src/template.ts +69 -140
- package/src/trim.ts +0 -53
- package/src/type.ts +2 -45
- package/src/unify.ts +13 -251
- package/src/utility.ts +0 -31
- package/src/val/AbnfFuncVal.ts +181 -0
- package/src/val/AbsentVal.ts +54 -0
- package/src/val/AggFuncVal.ts +152 -188
- package/src/val/ArithFuncVal.ts +0 -20
- package/src/val/BagVal.ts +1 -78
- package/src/val/BigDecimalVal.ts +0 -16
- package/src/val/BigIntegerVal.ts +0 -16
- package/src/val/CloseFuncVal.ts +0 -9
- package/src/val/CmpFuncVal.ts +4 -166
- package/src/val/ConjunctVal.ts +0 -33
- package/src/val/ConstraintVal.ts +2 -537
- package/src/val/ContainerKindVal.ts +0 -18
- package/src/val/CopyFuncVal.ts +0 -5
- package/src/val/Decimal.ts +1 -185
- package/src/val/DeprecateFuncVal.ts +0 -10
- package/src/val/DisjunctVal.ts +0 -157
- package/src/val/EachFuncVal.ts +0 -40
- package/src/val/EmitFuncVal.ts +8 -208
- package/src/val/ExpectVal.ts +0 -62
- package/src/val/FilterFuncVal.ts +0 -55
- package/src/val/FuncBaseVal.ts +9 -130
- package/src/val/GraphAtomVal.ts +0 -42
- package/src/val/HideFuncVal.ts +0 -15
- package/src/val/IntegerVal.ts +0 -61
- package/src/val/JunctionVal.ts +0 -20
- package/src/val/KeyFuncVal.ts +0 -48
- package/src/val/ListVal.ts +0 -59
- package/src/val/LowerFuncVal.ts +0 -12
- package/src/val/MapVal.ts +0 -151
- package/src/val/MatchFuncVal.ts +0 -59
- package/src/val/MaybeFuncVal.ts +86 -0
- package/src/val/MoveFuncVal.ts +0 -20
- package/src/val/NilVal.ts +0 -60
- package/src/val/NomFuncVal.ts +8 -95
- package/src/val/NumberVal.ts +0 -16
- package/src/val/OpBaseVal.ts +4 -17
- package/src/val/PackFuncVal.ts +0 -63
- package/src/val/PathFuncVal.ts +0 -32
- package/src/val/PathVal.ts +0 -66
- package/src/val/PlaceVal.ts +0 -45
- package/src/val/PlusOpVal.ts +18 -75
- package/src/val/PrefFuncVal.ts +0 -1
- package/src/val/PrefVal.ts +0 -179
- package/src/val/RecurseVal.ts +0 -81
- package/src/val/RefVal.ts +1 -285
- package/src/val/ReferFuncVal.ts +0 -255
- package/src/val/ScalarKindVal.ts +0 -50
- package/src/val/ScalarVal.ts +0 -12
- package/src/val/StrFuncVal.ts +0 -44
- package/src/val/SuperFuncVal.ts +0 -42
- package/src/val/TopVal.ts +0 -1
- package/src/val/TranslateFuncVal.ts +1 -51
- package/src/val/UpperFuncVal.ts +0 -12
- package/src/val/Val.ts +3 -192
- package/src/val/VarVal.ts +0 -15
- package/src/val/arith.ts +0 -92
- package/src/val/caserange.ts +0 -62
- package/src/val/members.ts +0 -23
- package/src/val/numcmp.ts +1 -27
- package/src/val/numkind.ts +0 -149
- package/src/val/valutil.ts +0 -16
- package/src/vet.ts +1 -582
- package/src/view.ts +0 -507
- package/src/walk.ts +0 -41
- package/dist/std.d.ts +0 -3
- package/dist/std.js +0 -672
- package/dist/std.js.map +0 -1
- package/dist/val/FormFuncVal.js +0 -55
- package/dist/val/FormFuncVal.js.map +0 -1
- package/dist/val/NamerFuncVal.d.ts +0 -12
- package/dist/val/NamerFuncVal.js +0 -176
- package/dist/val/NamerFuncVal.js.map +0 -1
- package/src/std.ts +0 -683
package/src/utility.ts
CHANGED
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
/* Copyright (c) 2023-2025 Richard Rodger, MIT License */
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
|
|
5
4
|
import type { AontuOptions, TrustOptions, Val } from './type'
|
|
6
5
|
|
|
7
6
|
|
|
8
|
-
// THE INCLUDE OPTIONS AN ENGINE HANDS ITS Aontu INSTANCE. Every verb
|
|
9
|
-
// engine builds one, and until there were two such options each did it
|
|
10
|
-
// inline -- `null == options.trust ? undefined : { trust: options.trust }`,
|
|
11
|
-
// written out twelve times. That is fine while there is one option and
|
|
12
|
-
// a latent bug the moment there are two: `textExt` had to reach the
|
|
13
|
-
// same twelve places, and the one it missed refused a `.md` include
|
|
14
|
-
// under a flag the bare command honoured. One function now, so a third
|
|
15
|
-
// include option is threaded once.
|
|
16
7
|
type IncludeOptions = {
|
|
17
8
|
trust?: TrustOptions
|
|
18
9
|
textExt?: string[]
|
|
@@ -27,11 +18,6 @@ function includeOpts(options: IncludeOptions): Partial<AontuOptions> {
|
|
|
27
18
|
}
|
|
28
19
|
|
|
29
20
|
|
|
30
|
-
// Default walk() depth limit. High enough that real configs are never
|
|
31
|
-
// silently truncated (the old default of 32 dropped marks on deeply
|
|
32
|
-
// nested refs/funcs → wrong output), while still bounding runaway or
|
|
33
|
-
// accidentally-cyclic walks (walk has no cycle detection). Pass null for
|
|
34
|
-
// truly unbounded.
|
|
35
21
|
const WALK_DEFAULT_MAXDEPTH = 9999
|
|
36
22
|
|
|
37
23
|
|
|
@@ -47,12 +33,6 @@ function propagateMarks(source: Val, target: Val): void {
|
|
|
47
33
|
}
|
|
48
34
|
|
|
49
35
|
|
|
50
|
-
// Collect every value in the tree carrying the deprecation record (G3
|
|
51
|
-
// phase 4), with its path — the one walk behind vet's `deprecated`
|
|
52
|
-
// warnings and the LSP's Deprecated tags. The record travels on meets
|
|
53
|
-
// (the unite rider) and clones, so this sees the declaration and every
|
|
54
|
-
// use resolving through it. The non-Val guard is for a bag's raw peg
|
|
55
|
-
// entries, which degenerate parses can leave behind.
|
|
56
36
|
function collectDeprecations(
|
|
57
37
|
root: Val): Array<{ val: Val, path: string[] }> {
|
|
58
38
|
const out: Array<{ val: Val, path: string[] }> = []
|
|
@@ -97,17 +77,6 @@ function deprecationMessage(d: Record<string, string>): string {
|
|
|
97
77
|
}
|
|
98
78
|
|
|
99
79
|
|
|
100
|
-
// The canonical form of a value, wrapped in the RIDER it carries —
|
|
101
|
-
// the deprecation record (G3 phase 4) — reparseably, so
|
|
102
|
-
// `deprecate(x, m)` survives canon. Bags render their children through
|
|
103
|
-
// this (MapVal/ListVal canon), which is where a marked FIELD — the
|
|
104
|
-
// realistic case — lives.
|
|
105
|
-
//
|
|
106
|
-
// The rider renders HERE and not in the value's own `canon` for the
|
|
107
|
-
// same reason the guard at the MapVal call site tests the isVal flag:
|
|
108
|
-
// a bag's canon recursion visits each child once, and a child that
|
|
109
|
-
// wrapped itself as well would render its subtree twice per level —
|
|
110
|
-
// 2^depth on a nested document.
|
|
111
80
|
function canonRiders(v: Val): string {
|
|
112
81
|
const c = v.canon
|
|
113
82
|
const d = v.deprecation
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/* Copyright (c) 2026 Richard Rodger, MIT License */
|
|
2
|
+
|
|
3
|
+
// The grammar pair, ADR-033. Twin of go/abnf.go.
|
|
4
|
+
|
|
5
|
+
import type { Val, ValSpec } from '../type'
|
|
6
|
+
import { DONE } from '../type'
|
|
7
|
+
import { AontuContext } from '../ctx'
|
|
8
|
+
import { FuncBaseVal } from './FuncBaseVal'
|
|
9
|
+
import { StringVal } from './StringVal'
|
|
10
|
+
import { MapVal } from './MapVal'
|
|
11
|
+
import { ListVal } from './ListVal'
|
|
12
|
+
import { ConjunctVal } from './ConjunctVal'
|
|
13
|
+
import { makeNilErr } from '../err'
|
|
14
|
+
import { compileGrammar, parseWith } from '../grammar'
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class AbnfFuncVal extends FuncBaseVal {
|
|
18
|
+
isAbnfFunc = true
|
|
19
|
+
|
|
20
|
+
constructor(spec: ValSpec, ctx?: AontuContext) {
|
|
21
|
+
super(spec, ctx)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
funcname() {
|
|
25
|
+
return 'abnf'
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
resolve(ctx: AontuContext, args: Val[]): Val {
|
|
29
|
+
const a: any = args[0]
|
|
30
|
+
|
|
31
|
+
// Not an arity check: the arity and signature gates run first, so
|
|
32
|
+
// what reaches here is a nil argument, which both pass over.
|
|
33
|
+
if ('string' !== typeof a?.peg) {
|
|
34
|
+
return this.place(makeNilErr(ctx, 'abnf_grammar', this, undefined,
|
|
35
|
+
'abnf'))
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const [, why] = compileGrammar(a.peg)
|
|
39
|
+
if (undefined !== why) {
|
|
40
|
+
return this.place(makeNilErr(ctx, 'abnf_grammar', this, undefined,
|
|
41
|
+
'abnf', { reason: why }))
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return this.place(new StringVal({ peg: a.peg }, ctx))
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
// A tree node is just the map {rule, src, kids}, so it needs no case of
|
|
50
|
+
// its own. Keys are sorted so both ports build the same member order.
|
|
51
|
+
function astVal(node: any, ctx: AontuContext): Val {
|
|
52
|
+
if ('string' === typeof node) {
|
|
53
|
+
return new StringVal({ peg: node }, ctx)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (Array.isArray(node)) {
|
|
57
|
+
return new ListVal({
|
|
58
|
+
peg: node.map(
|
|
59
|
+
(e: any, i: number) => astVal(e, ctx.descend(String(i)))),
|
|
60
|
+
}, ctx)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const peg: Record<string, Val> = {}
|
|
64
|
+
for (const k of Object.keys(node).sort()) {
|
|
65
|
+
peg[k] = astVal(node[k], ctx.descend(k))
|
|
66
|
+
}
|
|
67
|
+
return new MapVal({ peg }, ctx)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class ParseFuncVal extends FuncBaseVal {
|
|
72
|
+
isParseFunc = true
|
|
73
|
+
|
|
74
|
+
constructor(spec: ValSpec, ctx?: AontuContext) {
|
|
75
|
+
super(spec, ctx)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
funcname() {
|
|
79
|
+
return 'parse'
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
// Meets its peer instead of resolving, so it must see the peer
|
|
84
|
+
// before the base drives to resolve().
|
|
85
|
+
unify(peer: Val, ctx: AontuContext): Val {
|
|
86
|
+
if (1 !== this.peg.length) {
|
|
87
|
+
return super.unify(peer, ctx)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
this.driveStagedArgs(ctx, 1)
|
|
91
|
+
|
|
92
|
+
const g: any = this.peg[0]
|
|
93
|
+
if ('string' !== typeof g?.peg) {
|
|
94
|
+
return this.residuate(peer, ctx)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// A settled constraint is stable, as a residual constraint atom is.
|
|
98
|
+
// Without this a `type()` holding one never resolves.
|
|
99
|
+
this.dc = DONE
|
|
100
|
+
|
|
101
|
+
const p: any = peer
|
|
102
|
+
if (true !== p?.isString || 'string' !== typeof p?.peg) {
|
|
103
|
+
return this.hold(peer, ctx)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const [grammar, why] = compileGrammar(g.peg)
|
|
107
|
+
if (undefined !== why) {
|
|
108
|
+
return makeNilErr(ctx, 'abnf_grammar', this, peer, 'parse',
|
|
109
|
+
{ reason: why })
|
|
110
|
+
}
|
|
111
|
+
if ('' === p.peg) {
|
|
112
|
+
return makeNilErr(ctx, 'parse_failed', this, peer, 'parse',
|
|
113
|
+
{ reason: 'the empty string parses under no grammar' })
|
|
114
|
+
}
|
|
115
|
+
const [, err] = parseWith(grammar, p.peg, ctx)
|
|
116
|
+
if (undefined !== err) {
|
|
117
|
+
return makeNilErr(ctx, 'parse_failed', this, peer, 'parse',
|
|
118
|
+
{ reason: err })
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return peer
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
// The stable twin of residuate: no `notdone()`, because a settled
|
|
126
|
+
// constraint stays done while it waits for a value.
|
|
127
|
+
hold(peer: Val, ctx: AontuContext): Val {
|
|
128
|
+
if (peer.isTop || peer.id === this.id) {
|
|
129
|
+
// Cloned, or a driver meeting it twice reports `unify_cycle`.
|
|
130
|
+
const out: Val = this.clone(ctx)
|
|
131
|
+
out.dc = DONE
|
|
132
|
+
return out
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (peer.isFunc
|
|
136
|
+
&& (peer as any).funcname() === this.funcname()
|
|
137
|
+
&& peer.path.join('.') === this.path.join('.')
|
|
138
|
+
&& peer.canon === this.canon) {
|
|
139
|
+
return this
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return new ConjunctVal({ peg: [this, peer] }, ctx)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
resolve(ctx: AontuContext, args: Val[]): Val {
|
|
147
|
+
const g: any = args[0]
|
|
148
|
+
const v: any = args[1]
|
|
149
|
+
|
|
150
|
+
// Not an arity check: see the abnf twin above.
|
|
151
|
+
if ('string' !== typeof g?.peg || 'string' !== typeof v?.peg) {
|
|
152
|
+
return this.place(makeNilErr(ctx, 'parse_arg', this, undefined, 'parse'))
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const [grammar, why] = compileGrammar(g.peg)
|
|
156
|
+
if (undefined !== why) {
|
|
157
|
+
return this.place(makeNilErr(ctx, 'abnf_grammar', this, undefined,
|
|
158
|
+
'parse', { reason: why }))
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// The host answers an empty tree for empty input.
|
|
162
|
+
if ('' === v.peg) {
|
|
163
|
+
return this.place(makeNilErr(ctx, 'parse_failed', this, undefined,
|
|
164
|
+
'parse', { reason: 'the empty string parses under no grammar' }))
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const [node, err] = parseWith(grammar, v.peg, ctx)
|
|
168
|
+
if (undefined !== err) {
|
|
169
|
+
return this.place(makeNilErr(ctx, 'parse_failed', this, undefined,
|
|
170
|
+
'parse', { reason: err }))
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return this.place(astVal(node, ctx))
|
|
174
|
+
}
|
|
175
|
+
} /* node:coverage ignore next 6 */
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
export {
|
|
179
|
+
AbnfFuncVal,
|
|
180
|
+
ParseFuncVal,
|
|
181
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/* Copyright (c) 2026 Richard Rodger, MIT License */
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import type {
|
|
5
|
+
Val,
|
|
6
|
+
ValSpec,
|
|
7
|
+
} from '../type'
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
DONE,
|
|
11
|
+
} from '../type'
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
AontuContext,
|
|
15
|
+
} from '../ctx'
|
|
16
|
+
|
|
17
|
+
import { FeatureVal } from './FeatureVal'
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
// Top with one difference (ADR-034): absence is GENERABLE, and
|
|
21
|
+
// generates nothing, so a bag drops it at a required key too.
|
|
22
|
+
class AbsentVal extends FeatureVal {
|
|
23
|
+
isAbsent = true
|
|
24
|
+
|
|
25
|
+
constructor(
|
|
26
|
+
spec: ValSpec,
|
|
27
|
+
ctx?: AontuContext
|
|
28
|
+
) {
|
|
29
|
+
super(spec, ctx)
|
|
30
|
+
this.dc = DONE
|
|
31
|
+
this.mark.type = false
|
|
32
|
+
this.mark.hide = false
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// The unit of the meet, called for EITHER operand so `&` commutes.
|
|
36
|
+
// Nothing here meets an absence with TOP, so there is no top arm;
|
|
37
|
+
// Go has one because it MEETS an op's result where this port places
|
|
38
|
+
// it. edge-plus-list-absent guards the day that changes.
|
|
39
|
+
unify(peer: Val, _ctx: AontuContext): Val {
|
|
40
|
+
return peer
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
get canon() { return 'maybe()' }
|
|
44
|
+
|
|
45
|
+
gen(_ctx?: AontuContext) {
|
|
46
|
+
return undefined
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
} /* node:coverage ignore next 6 */
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
AbsentVal,
|
|
54
|
+
}
|