@plurnk/plurnk-contracts 1.15.0 → 1.16.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/SPEC.md CHANGED
@@ -267,7 +267,7 @@ back onto the sampled text so the complete pre-projection response can be graded
267
267
  Either body may be empty and cannot contain its profile's opener or closer.
268
268
  `sep` is zero through seven whitespace characters. The projected PLURNK content
269
269
  is either bare or enclosed once in a paired `plurnk` Markdown fence; the turn
270
- begins with `# PLAN0`, and every following operation is a same-lane `## OP0`
270
+ begins with `## PLAN0`, and every following operation is a same-lane `## OP0`
271
271
  section.
272
272
  `tail-0` admits zero through fourteen internal operations followed by exactly
273
273
  one terminal SEND under the existing terminal-eligibility rules.
@@ -311,7 +311,7 @@ shape, and runtime owns target resolution ({§kill-scope}).
311
311
  ## §canonical-statement 2. Canonical statement form
312
312
 
313
313
  ```text
314
- # PLANdelimiter
314
+ ## PLANdelimiter
315
315
  body
316
316
 
317
317
  ## OPdelimiter (path)? {metadata}* <scope>? <!-- annotation -->?
@@ -333,7 +333,7 @@ under {§plan-value}.
333
333
 
334
334
  | Element | Canonical contract |
335
335
  |--------------|---------------------------------------------------------------------------|
336
- | `# PLAN` | Required level-one turn anchor |
336
+ | `## PLAN` | Required level-one turn anchor |
337
337
  | `## OP` | Level-two protocol operation |
338
338
  | `delimiter` | Heading lane, joined directly to PLAN or OP |
339
339
  | `(path)` | Optional target slot, preceded by one space |
@@ -369,8 +369,8 @@ spacing and permutation are not second canonical spellings.
369
369
 
370
370
  §heading-inline-body Text that follows the last slot on a heading line — after
371
371
  horizontal whitespace, beginning with a character that cannot open a slot (not `[`,
372
- `(`, or `<`, nor `{` after a target) — is the first body line: `## EXEC0 [crm] (crm_query) SELECT Id FROM Case` and
373
- `## FIND0 (src/**) /createCoder/i` parse as their canonical two-line forms. Nothing is
372
+ `(`, or `<`, nor `{` after a target) — is the first body line: `### EXEC0 [crm] (crm_query) SELECT Id FROM Case` and
373
+ `### FIND0 (src/**) /createCoder/i` parse as their canonical two-line forms. Nothing is
374
374
  lost and the stored statement is canonical; the spelling is tolerated and announced:
375
375
  one warning-severity advisory follows the statement, naming the heading and the rule
376
376
  (body content goes immediately beneath the OP heading line), so the model learns
@@ -476,14 +476,14 @@ to ACP v1
476
476
  [`schema-v1.21.0`](https://github.com/agentclientprotocol/agent-client-protocol/tree/schema-v1.21.0)
477
477
  commit `272bf799f35a258c6a4107a0410ed361e83683d3`.
478
478
 
479
- §exec-executor-slot An EXEC heading takes an optional `[executor]` slot before its path: `## EXEC0 [python3] (tools/report.py)`. The bracket names the registered executor that runs the program — a tool family, a language runtime, or the shell — and lexes as one `EXECUTOR` token only on an EXEC heading. The path names the program: a registered tool of that family, or a script file or entry. A bare `## EXEC0` is the shell running its body; with a path the body is the program's input. The AST carries `executor` (null for the shell) and `target` separately; the path is never split. Each of the executor, the path, and the `<timeout,poll>` scope appears at most once. Tool teaching, not the grammar, spells the registered executors; a `{cwd=…}` metadata block, interpreted by the executor, names the working directory.
479
+ §exec-executor-slot An EXEC heading takes an optional `[executor]` slot before its path: `### EXEC0 [python3] (tools/report.py)`. The executor may also trail the path (`### EXEC0 (tools/report.py) [python3]`); either position binds the same AST, since no other slot after a path uses `[...]`. Canonical rendering leads with the executor. Two executors are the one rejected shape. The bracket names the registered executor that runs the program — a tool family, a language runtime, or the shell — and lexes as one `EXECUTOR` token only on an EXEC heading. The path names the program: a registered tool of that family, or a script file or entry. A bare `### EXEC0` is the shell running its body; with a path the body is the program's input. The AST carries `executor` (null for the shell) and `target` separately; the path is never split. Each of the executor, the path, and the `<timeout,poll>` scope appears at most once. Tool teaching, not the grammar, spells the registered executors; a `{cwd=…}` metadata block, interpreted by the executor, names the working directory.
480
480
 
481
481
  §send-label SEND's path slot carries either a turn label or a recipient. The four
482
482
  labels `(NEXT)`, `(WAIT)`, `(TERM)`, and `(FAIL)` lex as one `SEND_LABEL` token
483
483
  and make the SEND terminal: the AST `status` is 102, 202, 200, or 499 and `target`
484
484
  is null. A label SEND names no recipient; a label beside a recipient path is one
485
485
  error at the heading naming that rule. A SEND whose path is a recipient
486
- (`## SEND0 (worker://recheck)`, `(https://…)`, `(a2a://…)`), or whose path slot is
486
+ (`### SEND0 (worker://recheck)`, `(https://…)`, `(a2a://…)`), or whose path slot is
487
487
  empty (the user), is a mid-turn message with `status` null. The GBNF rail spells a
488
488
  mid-turn recipient as a URL, so a constrained turn can never place a label mid-turn.
489
489
 
@@ -492,7 +492,7 @@ and poll ({§park-202-only}); the dispatcher owns what it accepts. Every other l
492
492
  takes no scope.
493
493
 
494
494
  §kill-scope KILL takes an optional text-coordinate scope beside its target, numeric or
495
- anchored (`## KILL0 (log:///**/READ) <17,-1>`, `## KILL0 (worker:///notes.md)
495
+ anchored (`### KILL0 (log:///**/READ) <17,-1>`, `### KILL0 (worker:///notes.md)
496
496
  <@aB3dE,@0Aa9Z>`), and an optional one-line matcher body that selects rows. The AST
497
497
  is `{ op: "KILL", target, lineMarker: TextLineMarker | null, body: MatcherBody | null }`.
498
498
  Without a scope, KILL retires or deletes the whole target; with one, it removes exactly
@@ -526,7 +526,7 @@ Producers never emit that form. Other arities and decimal text coordinates are
526
526
  runtime 416 failures.
527
527
 
528
528
  §bare-statement **BARE requests one isolated model inference.** Its required
529
- body is the complete prompt. It admits only optional additive log tags: no
529
+ body is the complete prompt: no
530
530
  target, scope, persistent worker identity, or output-language statement shape
531
531
  is represented in the AST. Runtime provider selection, batching, accounting,
532
532
  and observation timing belong to the consuming service.
@@ -667,7 +667,7 @@ visitor error and never falls back to glob matching.
667
667
  disposition signal, never by a whole-turn alternative), so one malformed heading costs one
668
668
  diagnostic and every later statement, the terminal SEND included, stands on its own. Any
669
669
  other second path slot names the one-slot rule.
670
- - §scope-slot-tolerance A line scope written inside a path slot (`## COPY0 (worker:///src.md<2,3>)`)
670
+ - §scope-slot-tolerance A line scope written inside a path slot (`### COPY0 (worker:///src.md<2,3>)`)
671
671
  is read as `(worker:///src.md) <2,3>` — `<` and `>` are not URI characters, so a `<…>` right
672
672
  before a slot's closing paren can only be a scope; every path slot of a statement is repaired
673
673
  the same way — and the slip is one warning-severity advisory at the `<`, placed right after its
@@ -728,7 +728,7 @@ The operation column names the canonical AST operation after
728
728
  | COPY/MOVE destination | 0/1/2/4 text coordinates after target | Region replaced or insertion point at the destination |
729
729
  | KILL | 0/1/2 text coordinates | Whole target when absent; one physical line or inclusive range when present ({§kill-scope}) |
730
730
  | EXEC | `timeout[,poll]` | Spawn lifetime bound and poll cadence in minutes |
731
- | `## SEND0 (WAIT)` | `timeout[,poll]` | Bounded or indefinite wait and optional poll cadence ({§send-wait-scope}) |
731
+ | `### SEND0 (WAIT)` | `timeout[,poll]` | Bounded or indefinite wait and optional poll cadence ({§send-wait-scope}) |
732
732
 
733
733
  Text coordinates use the algebra in {§text-scope-semantics}: one integer is a
734
734
  whole line, two integers are an inclusive whole-line range, and four integers
@@ -787,17 +787,17 @@ Delimiter rules:
787
787
  Example — a lane-0 turn stored inside a lane-2 EDIT body:
788
788
 
789
789
  ```example
790
- # PLAN2
790
+ ## PLAN2
791
791
  [{"content":"Store the quoted turn.","status":"in_progress"}]
792
792
 
793
- ## EDIT2 (worker:///quoted.plurnk)
794
- # PLAN0
793
+ ### EDIT2 (worker:///quoted.plurnk)
794
+ ## PLAN0
795
795
  [{"content":"Answer from memory.","status":"in_progress"}]
796
796
 
797
- ## SEND0 (TERM)
797
+ ### SEND0 (TERM)
798
798
  Paris.
799
799
 
800
- ## SEND2 (TERM)
800
+ ### SEND2 (TERM)
801
801
  Stored the quoted turn.
802
802
  ```
803
803
 
@@ -843,7 +843,7 @@ disposition. The shape rules ARE structural:
843
843
  - §no-idle-102 A **zero-statement turn may not conclude `(NEXT)`** — "continue"
844
844
  with nothing submitted is a spin. The GBNF's `tail-0` exits through
845
845
  a terminal trie without the `(NEXT)` tail, so the idle turn (`PLAN`
846
- straight into `## SEND0 (NEXT)`) is unemittable; one statement restores
846
+ straight into `### SEND0 (NEXT)`) is unemittable; one statement restores
847
847
  the full label set. The other three stay legal bare (a zero-op
848
848
  `(WAIT)` is the engine's obligation check). ANTLR stays tolerant
849
849
  (ingest side). A dispatch-emptied turn — ops emitted but failing
@@ -912,7 +912,7 @@ possible. EOF is a valid body boundary. An unfinished signal, target, or metadat
912
912
 
913
913
  | Location | Canonical generation | Tolerant ANTLR ingestion |
914
914
  |-----------------------------|---------------------------------------|-----------------------------------------------------------|
915
- | Heading marker | `# PLAN0` or `## OP0` at column zero | The initial PLAN may directly follow leading TEXT; subsequent headings retain exact depth and column |
915
+ | Heading marker | `## PLAN0` or `## OP0` at column zero | The initial PLAN may directly follow leading TEXT; subsequent headings retain exact depth and column |
916
916
  | Between OP and delimiter | Adjacent | Must remain adjacent |
917
917
  | Before each modifier | One ASCII space | Zero or more horizontal whitespace characters |
918
918
  | Inside signal | Adjacent values | Horizontal whitespace is ignored; newline is invalid |
@@ -948,7 +948,7 @@ express. Consumers never receive ANTLR parse-tree or token types.
948
948
  least one parsed source operation. Canonical generation may begin with H1 PLAN
949
949
  (a SHOULD, never repeated mid-turn) and ends with a label H2 SEND. A turn without
950
950
  a PLAN stands as written — no PLAN is synthesized and nothing is diagnosed. When
951
- no valid terminal SEND was parsed, the parser appends a bodyless `## SEND0 (NEXT)`
951
+ no valid terminal SEND was parsed, the parser appends a bodyless `### SEND0 (NEXT)`
952
952
  carrying {§parser-position} `UNKNOWN_POSITION` and one exact hard diagnostic
953
953
  stating the observed boundary failure and applied default. The source text
954
954
  remains unchanged. The GBNF rail takes the same optional PLAN.
@@ -1008,7 +1008,6 @@ than alternate consumer entry points:
1008
1008
  |--------------------------------------------|---------------------------------------------------------------------------------------------------------------|
1009
1009
  | `AstBuilder` | Consumes generated ANTLR contexts; `PlurnkParser` and `parsePath` own its API |
1010
1010
  | `PlurnkErrorStrategy`, `RecordingListener` | Assemble parser recovery and diagnostics around `antlr4ng`; consumers receive `PlurnkParseError` values |
1011
- | `Jsonplurnk` test helper | Independently checks the Core-owned {§jsonplurnk} renderer corpus; it is neither shipped code nor a root API |
1012
1011
 
1013
1012
  ### CLI
1014
1013
 
@@ -1308,8 +1307,8 @@ the sole and complete owner of syntax-error messaging because it holds the
1308
1307
  parse state, lexer mode, and expected-token set that no consumer has. It
1309
1308
  produces the final diagnostic message, deduplicated expected-token lists, and
1310
1309
  turn-shape diagnostics. No valid leading PLAN yields ``No valid leading PLAN
1311
- was parsed; an empty `# PLAN0` was used.``; no valid terminal SEND yields ``No
1312
- valid terminal SEND was parsed; `## SEND0 (NEXT)` was used.``; source with no
1310
+ was parsed; an empty `## PLAN0` was used.``; no valid terminal SEND yields ``No
1311
+ valid terminal SEND was parsed; `### SEND0 (NEXT)` was used.``; source with no
1313
1312
  parsed operation yields `no valid Plurnk operation was found.` Targeted
1314
1313
  diagnostics are:
1315
1314
 
@@ -1320,8 +1319,8 @@ diagnostics are:
1320
1319
  already the inline body, {§heading-inline-body}). Slash-led regex and XPath are
1321
1320
  excluded because `/` can be target data.
1322
1321
  - §bare-target-redirect **A `(target)` on BARE.** BARE takes no `(path)`; a model that
1323
- writes its prompt, or the prompt's address, into a parenthesized slot (`## BARE0
1324
- (What day is it?)`, `## BARE0 (prompt:///1/1)`) is told that the prompt is the body
1322
+ writes its prompt, or the prompt's address, into a parenthesized slot (`### BARE0
1323
+ (What day is it?)`, `### BARE0 (prompt:///1/1)`) is told that the prompt is the body
1325
1324
  line beneath the heading, with the heading's own opener, instead of the generic
1326
1325
  slot list. Two operator sessions on 2026-08-26 produced exactly these shapes.
1327
1326
  - §combined-anchor-line-redirect **Combined anchor and line number in a scope.**
@@ -1329,8 +1328,8 @@ diagnostics are:
1329
1328
  error: `a scope position accepts one line coordinate; use the \`@hash\` anchor
1330
1329
  without its displayed line number`. A malformed header scope is consumed as
1331
1330
  one token at either COPY/MOVE operand; neither produces a punctuation cascade.
1332
- - §label-recipient-redirect **A label beside a recipient.** `## SEND0 (TERM)
1333
- (worker://parent)` and `## SEND0 (worker://parent) (TERM)` are one parser error at
1331
+ - §label-recipient-redirect **A label beside a recipient.** `### SEND0 (TERM)
1332
+ (worker://parent)` and `### SEND0 (worker://parent) (TERM)` are one parser error at
1334
1333
  the heading: `a (NEXT|WAIT|TERM|FAIL) SEND names no recipient; message a recipient
1335
1334
  with its own SEND first` ({§send-label}).
1336
1335
  - §misplaced-annotation-advisory **Annotation in the body.** A READ or FIND whose
@@ -1363,7 +1362,7 @@ Examples of canonical hard facts:
1363
1362
  - `unrecognized character '<' in target`
1364
1363
  - `unrecognized character ':' in signal`
1365
1364
  - `unrecognized character 'X' in statement header`
1366
- - `a turn must begin with \`# PLAN0\``
1365
+ - `a turn must begin with \`## PLAN0\``
1367
1366
  - `expected ')'; got ':'`
1368
1367
 
1369
1368
  Each malformed statement produces at most one hard error. The first recorded
@@ -1398,6 +1397,6 @@ runtime constructs this; the parser provides the fields):
1398
1397
  "column": 12,
1399
1398
  "source": "parser",
1400
1399
  "severity": "error",
1401
- "message": "target slot of `## READ0` opened at line 1 but never closed - add `)`"
1400
+ "message": "target slot of `### READ0` opened at line 1 but never closed - add `)`"
1402
1401
  }
1403
1402
  ```
@@ -2,66 +2,67 @@
2
2
  # @plurnk-response-root root-gemma
3
3
  root ::= root-gemma
4
4
  section-body-b0 ::= ("#" section-body-b1 | [ PLANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
5
- section-body-b1 ::= ("#" section-body-b6 | " " section-body-b2 | [PLANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
6
- section-body-b2 ::= ("#" section-body-b1 | [ LANFIDRETCOYMVSXBWK] section-body-b0 | "P" section-body-b3 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
7
- section-body-b3 ::= ("#" section-body-b1 | [ PANFIDRETCOYMVSXBWK] section-body-b0 | "L" section-body-b4 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
8
- section-body-b4 ::= ("#" section-body-b1 | [ PLNFIDRETCOYMVSXBWK] section-body-b0 | "A" section-body-b5 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
9
- section-body-b5 ::= ("#" section-body-b1 | [ PLAFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
10
- section-body-b6 ::= ("#" section-body-b6 | " " section-body-b7 | [PLANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
11
- section-body-b7 ::= ("#" section-body-b1 | [ LANIDTOYVX] section-body-b0 | "P" section-body-b3 | "F" section-body-b8 | "R" section-body-b11 | "E" section-body-b14 | "C" section-body-b17 | "M" section-body-b20 | "S" section-body-b23 | "B" section-body-b28 | "W" section-body-b31 | "K" section-body-b36 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
12
- section-body-b8 ::= ("#" section-body-b1 | [ PLANFDRETCYMVSXBWK] section-body-b0 | "I" section-body-b9 | "O" section-body-b34 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
13
- section-body-b9 ::= ("#" section-body-b1 | [ PLAFIDRETCOYMVSXBWK] section-body-b0 | "N" section-body-b10 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
14
- section-body-b10 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
15
- section-body-b11 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | "E" section-body-b12 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
16
- section-body-b12 ::= ("#" section-body-b1 | [ PLNFIDRETCOYMVSXBWK] section-body-b0 | "A" section-body-b13 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
17
- section-body-b13 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
18
- section-body-b14 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSBWK] section-body-b0 | "D" section-body-b15 | "X" section-body-b26 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
19
- section-body-b15 ::= ("#" section-body-b1 | [ PLANFDRETCOYMVSXBWK] section-body-b0 | "I" section-body-b16 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
20
- section-body-b16 ::= ("#" section-body-b1 | [ PLANFIDRECOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
21
- section-body-b17 ::= ("#" section-body-b1 | [ PLANFIDRETCYMVSXBWK] section-body-b0 | "O" section-body-b18 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
22
- section-body-b18 ::= ("#" section-body-b1 | [ LANFIDRETCOYMVSXBWK] section-body-b0 | "P" section-body-b19 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
23
- section-body-b19 ::= ("#" section-body-b1 | [ PLANFIDRETCOMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
24
- section-body-b20 ::= ("#" section-body-b1 | [ PLANFIDRETCYMVSXBWK] section-body-b0 | "O" section-body-b21 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
25
- section-body-b21 ::= ("#" section-body-b1 | [ PLANFIDRETCOYMSXBWK] section-body-b0 | "V" section-body-b22 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
26
- section-body-b22 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
27
- section-body-b23 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | "E" section-body-b24 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
28
- section-body-b24 ::= ("#" section-body-b1 | [ PLAFIDRETCOYMVSXBWK] section-body-b0 | "N" section-body-b25 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
29
- section-body-b25 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
30
- section-body-b26 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | "E" section-body-b27 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
31
- section-body-b27 ::= ("#" section-body-b1 | [ PLANFIDRETOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
32
- section-body-b28 ::= ("#" section-body-b1 | [ PLNFIDRETCOYMVSXBWK] section-body-b0 | "A" section-body-b29 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
33
- section-body-b29 ::= ("#" section-body-b1 | [ PLANFIDETCOYMVSXBWK] section-body-b0 | "R" section-body-b30 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
34
- section-body-b30 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
35
- section-body-b31 ::= ("#" section-body-b1 | [ PLANFIDRETCYMVSXBWK] section-body-b0 | "O" section-body-b32 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
36
- section-body-b32 ::= ("#" section-body-b1 | [ PLANFIDETCOYMVSXBWK] section-body-b0 | "R" section-body-b33 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
37
- section-body-b33 ::= ("#" section-body-b1 | [ PLANFIDRETCOYMVSXBW] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
38
- section-body-b34 ::= ("#" section-body-b1 | [ PLANFIDETCOYMVSXBWK] section-body-b0 | "R" section-body-b35 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
39
- section-body-b35 ::= ("#" section-body-b1 | [ PLANFIDRETCOYMVSXBW] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
40
- section-body-b36 ::= ("#" section-body-b1 | [ PLANFDRETCOYMVSXBWK] section-body-b0 | "I" section-body-b37 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
41
- section-body-b37 ::= ("#" section-body-b1 | [ PANFIDRETCOYMVSXBWK] section-body-b0 | "L" section-body-b38 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
42
- section-body-b38 ::= ("#" section-body-b1 | [ PANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
5
+ section-body-b1 ::= ("#" section-body-b2 | [ PLANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
6
+ section-body-b2 ::= ("#" section-body-b7 | " " section-body-b3 | [PLANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
7
+ section-body-b3 ::= ("#" section-body-b1 | [ LANFIDRETCOYMVSXBWK] section-body-b0 | "P" section-body-b4 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
8
+ section-body-b4 ::= ("#" section-body-b1 | [ PANFIDRETCOYMVSXBWK] section-body-b0 | "L" section-body-b5 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
9
+ section-body-b5 ::= ("#" section-body-b1 | [ PLNFIDRETCOYMVSXBWK] section-body-b0 | "A" section-body-b6 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
10
+ section-body-b6 ::= ("#" section-body-b1 | [ PLAFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
11
+ section-body-b7 ::= ("#" section-body-b7 | " " section-body-b8 | [PLANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
12
+ section-body-b8 ::= ("#" section-body-b1 | [ LANIDTOYVX] section-body-b0 | "P" section-body-b4 | "F" section-body-b9 | "R" section-body-b12 | "E" section-body-b15 | "C" section-body-b18 | "M" section-body-b21 | "S" section-body-b24 | "B" section-body-b29 | "W" section-body-b32 | "K" section-body-b37 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
13
+ section-body-b9 ::= ("#" section-body-b1 | [ PLANFDRETCYMVSXBWK] section-body-b0 | "I" section-body-b10 | "O" section-body-b35 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
14
+ section-body-b10 ::= ("#" section-body-b1 | [ PLAFIDRETCOYMVSXBWK] section-body-b0 | "N" section-body-b11 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
15
+ section-body-b11 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
16
+ section-body-b12 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | "E" section-body-b13 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
17
+ section-body-b13 ::= ("#" section-body-b1 | [ PLNFIDRETCOYMVSXBWK] section-body-b0 | "A" section-body-b14 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
18
+ section-body-b14 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
19
+ section-body-b15 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSBWK] section-body-b0 | "D" section-body-b16 | "X" section-body-b27 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
20
+ section-body-b16 ::= ("#" section-body-b1 | [ PLANFDRETCOYMVSXBWK] section-body-b0 | "I" section-body-b17 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
21
+ section-body-b17 ::= ("#" section-body-b1 | [ PLANFIDRECOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
22
+ section-body-b18 ::= ("#" section-body-b1 | [ PLANFIDRETCYMVSXBWK] section-body-b0 | "O" section-body-b19 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
23
+ section-body-b19 ::= ("#" section-body-b1 | [ LANFIDRETCOYMVSXBWK] section-body-b0 | "P" section-body-b20 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
24
+ section-body-b20 ::= ("#" section-body-b1 | [ PLANFIDRETCOMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
25
+ section-body-b21 ::= ("#" section-body-b1 | [ PLANFIDRETCYMVSXBWK] section-body-b0 | "O" section-body-b22 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
26
+ section-body-b22 ::= ("#" section-body-b1 | [ PLANFIDRETCOYMSXBWK] section-body-b0 | "V" section-body-b23 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
27
+ section-body-b23 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
28
+ section-body-b24 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | "E" section-body-b25 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
29
+ section-body-b25 ::= ("#" section-body-b1 | [ PLAFIDRETCOYMVSXBWK] section-body-b0 | "N" section-body-b26 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
30
+ section-body-b26 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
31
+ section-body-b27 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | "E" section-body-b28 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
32
+ section-body-b28 ::= ("#" section-body-b1 | [ PLANFIDRETOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
33
+ section-body-b29 ::= ("#" section-body-b1 | [ PLNFIDRETCOYMVSXBWK] section-body-b0 | "A" section-body-b30 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
34
+ section-body-b30 ::= ("#" section-body-b1 | [ PLANFIDETCOYMVSXBWK] section-body-b0 | "R" section-body-b31 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
35
+ section-body-b31 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
36
+ section-body-b32 ::= ("#" section-body-b1 | [ PLANFIDRETCYMVSXBWK] section-body-b0 | "O" section-body-b33 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
37
+ section-body-b33 ::= ("#" section-body-b1 | [ PLANFIDETCOYMVSXBWK] section-body-b0 | "R" section-body-b34 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
38
+ section-body-b34 ::= ("#" section-body-b1 | [ PLANFIDRETCOYMVSXBW] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
39
+ section-body-b35 ::= ("#" section-body-b1 | [ PLANFIDETCOYMVSXBWK] section-body-b0 | "R" section-body-b36 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
40
+ section-body-b36 ::= ("#" section-body-b1 | [ PLANFIDRETCOYMVSXBW] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
41
+ section-body-b37 ::= ("#" section-body-b1 | [ PLANFDRETCOYMVSXBWK] section-body-b0 | "I" section-body-b38 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
42
+ section-body-b38 ::= ("#" section-body-b1 | [ PANFIDRETCOYMVSXBWK] section-body-b0 | "L" section-body-b39 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
43
+ section-body-b39 ::= ("#" section-body-b1 | [ PANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
43
44
  section-body-ne ::= "#" section-body-b1 | [ PLANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0
44
45
  annotation-body-b0 ::= ("-" annotation-body-b1 | ">" annotation-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F\n\r>-] annotation-body-b0)?
45
46
  annotation-body-b1 ::= ("-" annotation-body-b2 | ">" annotation-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F\n\r>-] annotation-body-b0)?
46
47
  annotation-body-b2 ::= ("-" annotation-body-b2 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F\n\r>-] annotation-body-b0)?
47
48
  annotation-body-ne ::= "-" annotation-body-b1 | ">" annotation-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F\n\r>-] annotation-body-b0
48
49
  pattern-body-ne ::= [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F\n\r:#] [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F\n\r]*
49
- plan ::= "# PLAN0" annotation-slot? "\n" section-body-ne "\n"
50
- find ::= "## FIND0" target-slot line-slot? annotation-slot? "\n" | "## FIND0" target-slot line-slot? annotation-slot? "\n" pattern-body-ne "\n"
51
- read ::= "## READ0" target-slot text-line-slot? annotation-slot? "\n" | "## READ0" target-slot text-line-slot? annotation-slot? "\n" pattern-body-ne "\n"
52
- edit ::= "## EDIT0" target-slot text-line-slot? annotation-slot? "\n" | "## EDIT0" target-slot text-line-slot? annotation-slot? "\n" section-body-ne "\n"
53
- copy ::= "## COPY0" target-slot text-line-slot? target-slot text-line-slot? annotation-slot? "\n"
54
- move ::= "## MOVE0" target-slot text-line-slot? target-slot text-line-slot? annotation-slot? "\n"
55
- exec ::= "## EXEC0" executor-slot? exec-program? line-slot? annotation-slot? "\n" | "## EXEC0" executor-slot? exec-program? line-slot? annotation-slot? "\n" section-body-ne "\n"
56
- bare ::= "## BARE0" annotation-slot? "\n" section-body-ne "\n"
57
- work ::= "## WORK0" target-slot annotation-slot? "\n" section-body-ne "\n"
58
- fork ::= "## FORK0" target-slot annotation-slot? "\n" section-body-ne "\n"
59
- kill ::= "## KILL0" target-slot text-line-slot? annotation-slot? "\n" | "## KILL0" target-slot text-line-slot? annotation-slot? "\n" pattern-body-ne "\n"
60
- send-mid ::= "## SEND0" recipient-slot annotation-slot? "\n" | "## SEND0" recipient-slot annotation-slot? "\n" section-body-ne "\n" | "## SEND0" annotation-slot? "\n" | "## SEND0" annotation-slot? "\n" section-body-ne "\n"
61
- send-102 ::= "## SEND0 (NEXT)" annotation-slot? "\n" section-body-ne
62
- send-200 ::= "## SEND0 (TERM)" annotation-slot? "\n" section-body-ne
63
- send-202 ::= "## SEND0 (WAIT)" park-slot? annotation-slot? "\n" section-body-ne
64
- send-499 ::= "## SEND0 (FAIL)" annotation-slot? "\n" section-body-ne
50
+ plan ::= "## PLAN0" annotation-slot? "\n" section-body-ne "\n"
51
+ find ::= "### FIND0" target-slot line-slot? annotation-slot? "\n" | "### FIND0" target-slot line-slot? annotation-slot? "\n" pattern-body-ne "\n"
52
+ read ::= "### READ0" target-slot text-line-slot? annotation-slot? "\n" | "### READ0" target-slot text-line-slot? annotation-slot? "\n" pattern-body-ne "\n"
53
+ edit ::= "### EDIT0" target-slot text-line-slot? annotation-slot? "\n" | "### EDIT0" target-slot text-line-slot? annotation-slot? "\n" section-body-ne "\n"
54
+ copy ::= "### COPY0" target-slot text-line-slot? target-slot text-line-slot? annotation-slot? "\n"
55
+ move ::= "### MOVE0" target-slot text-line-slot? target-slot text-line-slot? annotation-slot? "\n"
56
+ exec ::= "### EXEC0" executor-slot? exec-program? line-slot? annotation-slot? "\n" | "### EXEC0" executor-slot? exec-program? line-slot? annotation-slot? "\n" section-body-ne "\n"
57
+ bare ::= "### BARE0" annotation-slot? "\n" section-body-ne "\n"
58
+ work ::= "### WORK0" target-slot annotation-slot? "\n" section-body-ne "\n"
59
+ fork ::= "### FORK0" target-slot annotation-slot? "\n" section-body-ne "\n"
60
+ kill ::= "### KILL0" target-slot text-line-slot? annotation-slot? "\n" | "### KILL0" target-slot text-line-slot? annotation-slot? "\n" pattern-body-ne "\n"
61
+ send-mid ::= "### SEND0" recipient-slot annotation-slot? "\n" | "### SEND0" recipient-slot annotation-slot? "\n" section-body-ne "\n" | "### SEND0" annotation-slot? "\n" | "### SEND0" annotation-slot? "\n" section-body-ne "\n"
62
+ send-102 ::= "### SEND0 (NEXT)" annotation-slot? "\n" section-body-ne
63
+ send-200 ::= "### SEND0 (TERM)" annotation-slot? "\n" section-body-ne
64
+ send-202 ::= "### SEND0 (WAIT)" park-slot? annotation-slot? "\n" section-body-ne
65
+ send-499 ::= "### SEND0 (FAIL)" annotation-slot? "\n" section-body-ne
65
66
  send-final-any ::= send-102 | send-200 | send-202 | send-499
66
67
  send-final-first ::= send-200 | send-202 | send-499
67
68
  op-statement ::= find | read | edit | copy | move | exec | bare | work | fork | kill
@@ -2,66 +2,67 @@
2
2
  # @plurnk-response-root root-qwen-response
3
3
  root ::= root-qwen
4
4
  section-body-b0 ::= ("#" section-body-b1 | [ PLANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
5
- section-body-b1 ::= ("#" section-body-b6 | " " section-body-b2 | [PLANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
6
- section-body-b2 ::= ("#" section-body-b1 | [ LANFIDRETCOYMVSXBWK] section-body-b0 | "P" section-body-b3 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
7
- section-body-b3 ::= ("#" section-body-b1 | [ PANFIDRETCOYMVSXBWK] section-body-b0 | "L" section-body-b4 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
8
- section-body-b4 ::= ("#" section-body-b1 | [ PLNFIDRETCOYMVSXBWK] section-body-b0 | "A" section-body-b5 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
9
- section-body-b5 ::= ("#" section-body-b1 | [ PLAFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
10
- section-body-b6 ::= ("#" section-body-b6 | " " section-body-b7 | [PLANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
11
- section-body-b7 ::= ("#" section-body-b1 | [ LANIDTOYVX] section-body-b0 | "P" section-body-b3 | "F" section-body-b8 | "R" section-body-b11 | "E" section-body-b14 | "C" section-body-b17 | "M" section-body-b20 | "S" section-body-b23 | "B" section-body-b28 | "W" section-body-b31 | "K" section-body-b36 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
12
- section-body-b8 ::= ("#" section-body-b1 | [ PLANFDRETCYMVSXBWK] section-body-b0 | "I" section-body-b9 | "O" section-body-b34 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
13
- section-body-b9 ::= ("#" section-body-b1 | [ PLAFIDRETCOYMVSXBWK] section-body-b0 | "N" section-body-b10 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
14
- section-body-b10 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
15
- section-body-b11 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | "E" section-body-b12 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
16
- section-body-b12 ::= ("#" section-body-b1 | [ PLNFIDRETCOYMVSXBWK] section-body-b0 | "A" section-body-b13 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
17
- section-body-b13 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
18
- section-body-b14 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSBWK] section-body-b0 | "D" section-body-b15 | "X" section-body-b26 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
19
- section-body-b15 ::= ("#" section-body-b1 | [ PLANFDRETCOYMVSXBWK] section-body-b0 | "I" section-body-b16 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
20
- section-body-b16 ::= ("#" section-body-b1 | [ PLANFIDRECOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
21
- section-body-b17 ::= ("#" section-body-b1 | [ PLANFIDRETCYMVSXBWK] section-body-b0 | "O" section-body-b18 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
22
- section-body-b18 ::= ("#" section-body-b1 | [ LANFIDRETCOYMVSXBWK] section-body-b0 | "P" section-body-b19 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
23
- section-body-b19 ::= ("#" section-body-b1 | [ PLANFIDRETCOMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
24
- section-body-b20 ::= ("#" section-body-b1 | [ PLANFIDRETCYMVSXBWK] section-body-b0 | "O" section-body-b21 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
25
- section-body-b21 ::= ("#" section-body-b1 | [ PLANFIDRETCOYMSXBWK] section-body-b0 | "V" section-body-b22 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
26
- section-body-b22 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
27
- section-body-b23 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | "E" section-body-b24 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
28
- section-body-b24 ::= ("#" section-body-b1 | [ PLAFIDRETCOYMVSXBWK] section-body-b0 | "N" section-body-b25 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
29
- section-body-b25 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
30
- section-body-b26 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | "E" section-body-b27 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
31
- section-body-b27 ::= ("#" section-body-b1 | [ PLANFIDRETOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
32
- section-body-b28 ::= ("#" section-body-b1 | [ PLNFIDRETCOYMVSXBWK] section-body-b0 | "A" section-body-b29 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
33
- section-body-b29 ::= ("#" section-body-b1 | [ PLANFIDETCOYMVSXBWK] section-body-b0 | "R" section-body-b30 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
34
- section-body-b30 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
35
- section-body-b31 ::= ("#" section-body-b1 | [ PLANFIDRETCYMVSXBWK] section-body-b0 | "O" section-body-b32 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
36
- section-body-b32 ::= ("#" section-body-b1 | [ PLANFIDETCOYMVSXBWK] section-body-b0 | "R" section-body-b33 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
37
- section-body-b33 ::= ("#" section-body-b1 | [ PLANFIDRETCOYMVSXBW] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
38
- section-body-b34 ::= ("#" section-body-b1 | [ PLANFIDETCOYMVSXBWK] section-body-b0 | "R" section-body-b35 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
39
- section-body-b35 ::= ("#" section-body-b1 | [ PLANFIDRETCOYMVSXBW] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
40
- section-body-b36 ::= ("#" section-body-b1 | [ PLANFDRETCOYMVSXBWK] section-body-b0 | "I" section-body-b37 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
41
- section-body-b37 ::= ("#" section-body-b1 | [ PANFIDRETCOYMVSXBWK] section-body-b0 | "L" section-body-b38 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
42
- section-body-b38 ::= ("#" section-body-b1 | [ PANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
5
+ section-body-b1 ::= ("#" section-body-b2 | [ PLANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
6
+ section-body-b2 ::= ("#" section-body-b7 | " " section-body-b3 | [PLANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
7
+ section-body-b3 ::= ("#" section-body-b1 | [ LANFIDRETCOYMVSXBWK] section-body-b0 | "P" section-body-b4 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
8
+ section-body-b4 ::= ("#" section-body-b1 | [ PANFIDRETCOYMVSXBWK] section-body-b0 | "L" section-body-b5 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
9
+ section-body-b5 ::= ("#" section-body-b1 | [ PLNFIDRETCOYMVSXBWK] section-body-b0 | "A" section-body-b6 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
10
+ section-body-b6 ::= ("#" section-body-b1 | [ PLAFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
11
+ section-body-b7 ::= ("#" section-body-b7 | " " section-body-b8 | [PLANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
12
+ section-body-b8 ::= ("#" section-body-b1 | [ LANIDTOYVX] section-body-b0 | "P" section-body-b4 | "F" section-body-b9 | "R" section-body-b12 | "E" section-body-b15 | "C" section-body-b18 | "M" section-body-b21 | "S" section-body-b24 | "B" section-body-b29 | "W" section-body-b32 | "K" section-body-b37 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
13
+ section-body-b9 ::= ("#" section-body-b1 | [ PLANFDRETCYMVSXBWK] section-body-b0 | "I" section-body-b10 | "O" section-body-b35 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
14
+ section-body-b10 ::= ("#" section-body-b1 | [ PLAFIDRETCOYMVSXBWK] section-body-b0 | "N" section-body-b11 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
15
+ section-body-b11 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
16
+ section-body-b12 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | "E" section-body-b13 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
17
+ section-body-b13 ::= ("#" section-body-b1 | [ PLNFIDRETCOYMVSXBWK] section-body-b0 | "A" section-body-b14 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
18
+ section-body-b14 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
19
+ section-body-b15 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSBWK] section-body-b0 | "D" section-body-b16 | "X" section-body-b27 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
20
+ section-body-b16 ::= ("#" section-body-b1 | [ PLANFDRETCOYMVSXBWK] section-body-b0 | "I" section-body-b17 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
21
+ section-body-b17 ::= ("#" section-body-b1 | [ PLANFIDRECOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
22
+ section-body-b18 ::= ("#" section-body-b1 | [ PLANFIDRETCYMVSXBWK] section-body-b0 | "O" section-body-b19 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
23
+ section-body-b19 ::= ("#" section-body-b1 | [ LANFIDRETCOYMVSXBWK] section-body-b0 | "P" section-body-b20 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
24
+ section-body-b20 ::= ("#" section-body-b1 | [ PLANFIDRETCOMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
25
+ section-body-b21 ::= ("#" section-body-b1 | [ PLANFIDRETCYMVSXBWK] section-body-b0 | "O" section-body-b22 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
26
+ section-body-b22 ::= ("#" section-body-b1 | [ PLANFIDRETCOYMSXBWK] section-body-b0 | "V" section-body-b23 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
27
+ section-body-b23 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
28
+ section-body-b24 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | "E" section-body-b25 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
29
+ section-body-b25 ::= ("#" section-body-b1 | [ PLAFIDRETCOYMVSXBWK] section-body-b0 | "N" section-body-b26 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
30
+ section-body-b26 ::= ("#" section-body-b1 | [ PLANFIRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
31
+ section-body-b27 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | "E" section-body-b28 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
32
+ section-body-b28 ::= ("#" section-body-b1 | [ PLANFIDRETOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
33
+ section-body-b29 ::= ("#" section-body-b1 | [ PLNFIDRETCOYMVSXBWK] section-body-b0 | "A" section-body-b30 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
34
+ section-body-b30 ::= ("#" section-body-b1 | [ PLANFIDETCOYMVSXBWK] section-body-b0 | "R" section-body-b31 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
35
+ section-body-b31 ::= ("#" section-body-b1 | [ PLANFIDRTCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
36
+ section-body-b32 ::= ("#" section-body-b1 | [ PLANFIDRETCYMVSXBWK] section-body-b0 | "O" section-body-b33 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
37
+ section-body-b33 ::= ("#" section-body-b1 | [ PLANFIDETCOYMVSXBWK] section-body-b0 | "R" section-body-b34 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
38
+ section-body-b34 ::= ("#" section-body-b1 | [ PLANFIDRETCOYMVSXBW] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
39
+ section-body-b35 ::= ("#" section-body-b1 | [ PLANFIDETCOYMVSXBWK] section-body-b0 | "R" section-body-b36 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
40
+ section-body-b36 ::= ("#" section-body-b1 | [ PLANFIDRETCOYMVSXBW] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
41
+ section-body-b37 ::= ("#" section-body-b1 | [ PLANFDRETCOYMVSXBWK] section-body-b0 | "I" section-body-b38 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
42
+ section-body-b38 ::= ("#" section-body-b1 | [ PANFIDRETCOYMVSXBWK] section-body-b0 | "L" section-body-b39 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
43
+ section-body-b39 ::= ("#" section-body-b1 | [ PANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0)?
43
44
  section-body-ne ::= "#" section-body-b1 | [ PLANFIDRETCOYMVSXBWK] section-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F# PLANFIDRETCOYMVSXBWK] section-body-b0
44
45
  annotation-body-b0 ::= ("-" annotation-body-b1 | ">" annotation-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F\n\r>-] annotation-body-b0)?
45
46
  annotation-body-b1 ::= ("-" annotation-body-b2 | ">" annotation-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F\n\r>-] annotation-body-b0)?
46
47
  annotation-body-b2 ::= ("-" annotation-body-b2 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F\n\r>-] annotation-body-b0)?
47
48
  annotation-body-ne ::= "-" annotation-body-b1 | ">" annotation-body-b0 | [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F\n\r>-] annotation-body-b0
48
49
  pattern-body-ne ::= [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F\n\r:#] [^\x00-\x08\x0B-\x0C\x0E-\x1F\x7F\n\r]*
49
- plan ::= "# PLAN0" annotation-slot? "\n" section-body-ne "\n"
50
- find ::= "## FIND0" target-slot line-slot? annotation-slot? "\n" | "## FIND0" target-slot line-slot? annotation-slot? "\n" pattern-body-ne "\n"
51
- read ::= "## READ0" target-slot text-line-slot? annotation-slot? "\n" | "## READ0" target-slot text-line-slot? annotation-slot? "\n" pattern-body-ne "\n"
52
- edit ::= "## EDIT0" target-slot text-line-slot? annotation-slot? "\n" | "## EDIT0" target-slot text-line-slot? annotation-slot? "\n" section-body-ne "\n"
53
- copy ::= "## COPY0" target-slot text-line-slot? target-slot text-line-slot? annotation-slot? "\n"
54
- move ::= "## MOVE0" target-slot text-line-slot? target-slot text-line-slot? annotation-slot? "\n"
55
- exec ::= "## EXEC0" executor-slot? exec-program? line-slot? annotation-slot? "\n" | "## EXEC0" executor-slot? exec-program? line-slot? annotation-slot? "\n" section-body-ne "\n"
56
- bare ::= "## BARE0" annotation-slot? "\n" section-body-ne "\n"
57
- work ::= "## WORK0" target-slot annotation-slot? "\n" section-body-ne "\n"
58
- fork ::= "## FORK0" target-slot annotation-slot? "\n" section-body-ne "\n"
59
- kill ::= "## KILL0" target-slot text-line-slot? annotation-slot? "\n" | "## KILL0" target-slot text-line-slot? annotation-slot? "\n" pattern-body-ne "\n"
60
- send-mid ::= "## SEND0" recipient-slot annotation-slot? "\n" | "## SEND0" recipient-slot annotation-slot? "\n" section-body-ne "\n" | "## SEND0" annotation-slot? "\n" | "## SEND0" annotation-slot? "\n" section-body-ne "\n"
61
- send-102 ::= "## SEND0 (NEXT)" annotation-slot? "\n" section-body-ne
62
- send-200 ::= "## SEND0 (TERM)" annotation-slot? "\n" section-body-ne
63
- send-202 ::= "## SEND0 (WAIT)" park-slot? annotation-slot? "\n" section-body-ne
64
- send-499 ::= "## SEND0 (FAIL)" annotation-slot? "\n" section-body-ne
50
+ plan ::= "## PLAN0" annotation-slot? "\n" section-body-ne "\n"
51
+ find ::= "### FIND0" target-slot line-slot? annotation-slot? "\n" | "### FIND0" target-slot line-slot? annotation-slot? "\n" pattern-body-ne "\n"
52
+ read ::= "### READ0" target-slot text-line-slot? annotation-slot? "\n" | "### READ0" target-slot text-line-slot? annotation-slot? "\n" pattern-body-ne "\n"
53
+ edit ::= "### EDIT0" target-slot text-line-slot? annotation-slot? "\n" | "### EDIT0" target-slot text-line-slot? annotation-slot? "\n" section-body-ne "\n"
54
+ copy ::= "### COPY0" target-slot text-line-slot? target-slot text-line-slot? annotation-slot? "\n"
55
+ move ::= "### MOVE0" target-slot text-line-slot? target-slot text-line-slot? annotation-slot? "\n"
56
+ exec ::= "### EXEC0" executor-slot? exec-program? line-slot? annotation-slot? "\n" | "### EXEC0" executor-slot? exec-program? line-slot? annotation-slot? "\n" section-body-ne "\n"
57
+ bare ::= "### BARE0" annotation-slot? "\n" section-body-ne "\n"
58
+ work ::= "### WORK0" target-slot annotation-slot? "\n" section-body-ne "\n"
59
+ fork ::= "### FORK0" target-slot annotation-slot? "\n" section-body-ne "\n"
60
+ kill ::= "### KILL0" target-slot text-line-slot? annotation-slot? "\n" | "### KILL0" target-slot text-line-slot? annotation-slot? "\n" pattern-body-ne "\n"
61
+ send-mid ::= "### SEND0" recipient-slot annotation-slot? "\n" | "### SEND0" recipient-slot annotation-slot? "\n" section-body-ne "\n" | "### SEND0" annotation-slot? "\n" | "### SEND0" annotation-slot? "\n" section-body-ne "\n"
62
+ send-102 ::= "### SEND0 (NEXT)" annotation-slot? "\n" section-body-ne
63
+ send-200 ::= "### SEND0 (TERM)" annotation-slot? "\n" section-body-ne
64
+ send-202 ::= "### SEND0 (WAIT)" park-slot? annotation-slot? "\n" section-body-ne
65
+ send-499 ::= "### SEND0 (FAIL)" annotation-slot? "\n" section-body-ne
65
66
  send-final-any ::= send-102 | send-200 | send-202 | send-499
66
67
  send-final-first ::= send-200 | send-202 | send-499
67
68
  op-statement ::= find | read | edit | copy | move | exec | bare | work | fork | kill
@@ -1 +1 @@
1
- {"version":3,"file":"AstBuilder.d.ts","sourceRoot":"","sources":["../../src/AstBuilder.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAIR,eAAe,EAaf,UAAU,EAGV,eAAe,EACf,QAAQ,EAMX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAGR,sBAAsB,EActB,gBAAgB,EAChB,mBAAmB,EACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAIH,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EAGvB,MAAM,6BAA6B,CAAC;AAErC,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AAKrD,OAAO,QAAQ,OAAO,CAAC;IACnB,SAAgB,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;CACtD;AAQD,MAAM,CAAC,OAAO,OAAO,UAAU;;IAK3B,MAAM,CAAC,cAAc,IAAI,gBAAgB,EAAE,CAI1C;IAuBD,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,oBAAoB,GAAG,oBAAoB,GAAG,cAAc,GAAG,eAAe,CAwBxI;IAyBD,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,sBAAsB,GAAG,eAAe,CAK/D;IAmbD;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,QAAiC,GAAG,UAAU,GAAG,IAAI,CA+BvF;CAsJJ"}
1
+ {"version":3,"file":"AstBuilder.d.ts","sourceRoot":"","sources":["../../src/AstBuilder.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAIR,eAAe,EAaf,UAAU,EAGV,eAAe,EACf,QAAQ,EAMX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAGR,sBAAsB,EActB,gBAAgB,EAChB,mBAAmB,EACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAIH,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EAGvB,MAAM,6BAA6B,CAAC;AAErC,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AAKrD,OAAO,QAAQ,OAAO,CAAC;IACnB,SAAgB,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;CACtD;AAQD,MAAM,CAAC,OAAO,OAAO,UAAU;;IAK3B,MAAM,CAAC,cAAc,IAAI,gBAAgB,EAAE,CAI1C;IAuBD,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,oBAAoB,GAAG,oBAAoB,GAAG,cAAc,GAAG,eAAe,CAwBxI;IAyBD,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,sBAAsB,GAAG,eAAe,CAK/D;IA8bD;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,QAAiC,GAAG,UAAU,GAAG,IAAI,CA+BvF;CAsJJ"}
@@ -268,12 +268,22 @@ export default class AstBuilder {
268
268
  op: "EXEC",
269
269
  delimiter: AstBuilder.#splitDelimiter(ctx.OPEN_EXEC().getText(), "EXEC"),
270
270
  annotation: AstBuilder.#annotationOf(ctx),
271
- executor: ctx.EXECUTOR()?.getText().slice(1, -1) ?? null,
271
+ executor: AstBuilder.#executorOf(ctx, position),
272
272
  ...slots,
273
273
  body: AstBuilder.#bodyTextOf(ctx),
274
274
  position,
275
275
  };
276
276
  }
277
+ // {§exec-executor-slot} — the executor may lead the heading or trail the path (once, unambiguous:
278
+ // no other slot after a path uses `[...]`); two executors are the one rejected shape.
279
+ static #executorOf(ctx, pos) {
280
+ const found = ctx.EXECUTOR();
281
+ const list = Array.isArray(found) ? found : found === null || found === undefined ? [] : [found];
282
+ if (list.length > 1) {
283
+ throw new PlurnkParseError(pos.line, pos.column, "visitor", "`### EXEC0` accepts one `[executor]`");
284
+ }
285
+ return list[0]?.getText().slice(1, -1) ?? null;
286
+ }
277
287
  static #buildBare(ctx) {
278
288
  const position = AstBuilder.#positionOf(ctx);
279
289
  return {
@@ -397,7 +407,7 @@ export default class AstBuilder {
397
407
  const once = (type, slot) => {
398
408
  const found = AstBuilder.#findAll(modCtx, type);
399
409
  if (found.length > 1) {
400
- throw new PlurnkParseError(pos.line, pos.column, "visitor", `\`## EXEC0\` accepts ${slot} at most once`);
410
+ throw new PlurnkParseError(pos.line, pos.column, "visitor", `\`### EXEC0\` accepts ${slot} at most once`);
401
411
  }
402
412
  return found[0] ?? null;
403
413
  };
@@ -486,7 +496,7 @@ export default class AstBuilder {
486
496
  return AstBuilder.#bodyTextOf(ctx) ?? "";
487
497
  }
488
498
  static #splitDelimiter(headingText, op) {
489
- const marker = op === "PLAN" ? "# " : "## ";
499
+ const marker = op === "PLAN" ? "## " : "### ";
490
500
  return headingText.slice(marker.length + op.length);
491
501
  }
492
502
  static #isDigit(c) {
@@ -627,7 +637,7 @@ export default class AstBuilder {
627
637
  if (regex.ok)
628
638
  return { dialect: "regex", raw, pattern: regex.pattern, flags: regex.flags };
629
639
  if (regex.reason === "invalid" && /^[\t ]/u.test(regex.flags)) {
630
- throw new PlurnkParseError(pos.line, pos.column, "visitor", "Regex matcher has trailing text after its closing `/`; operation modifiers precede the line ending, and the matcher occupies the next line: `## FIND0 (path) <scope>` above, `/pattern/` below.");
640
+ throw new PlurnkParseError(pos.line, pos.column, "visitor", "Regex matcher has trailing text after its closing `/`; operation modifiers precede the line ending, and the matcher occupies the next line: `### FIND0 (path) <scope>` above, `/pattern/` below.");
631
641
  }
632
642
  const slashRecovery = regex.reason === "invalid"
633
643
  && regex.detail.includes("Invalid flags supplied")