on master help sign in
Harden the parser after two independent audits

One audit derived trees by hand and compared them with an independent reference parser over about 19,000 generated programs. The other read the code against the EBNF, judged the error messages, fuzzed, and timed it. Fixes: - Three literal forms crashed the eval inside Hoon's own date and @c code (a ~0 blob, a fifth sub-second group, an @c control character). They are now errors before nuck:so reads them. - +check-spans now checks each node's end exactly, from the tokens. - Errors follow 2.0's rule (the first character where the text stops being valid) in more places: tight forms at the end of a line, a space before a lexer error, lines that can't be completed. - Hints for stray closers and for the Hoon runes Jibb leaves out. - The tree printer stays linear on deep nesting. - Literals print as written. The ship's Hoon prints @da zero-padded (~2026.01.05) where urbit eval's prints ~2026.1.5, so golden output no longer depends on the Hoon version. 26 new golden cases pin these. All 253 pass under urbit eval and as -test arms on a fake ~zod. tools/hoon --cord binds a file as one literal per line, since Hoon reads one long cord literal in more than linear time. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SRcThHuWjFX8MWUDBeWfyn

commit7c739b7d03471efd98f6e9fcbe0cc501205586cd authorClaude <noreply@anthropic.com> dateFri 30 Oct 2026, 02:27 (2 days ago) parent3c5f50a
121 files changed+2590−788
jibb-dev/lib/jibb.hoon+1221−344 tests/golden/inline-import-root-bad/about.txt+3 tests/golden/inline-import-root-bad/source.jibb+1 tests/golden/inline-import-root-bad/tokens.txt+4 tests/golden/inline-import-root-bad/tree.txt+3 tests/golden/inline-leftout-barcen-2/about.txt+3 tests/golden/inline-leftout-barcen-2/source.jibb+1 tests/golden/inline-leftout-barcen-2/tokens.txt+3 tests/golden/inline-leftout-barcen-2/tree.txt+3 tests/golden/inline-leftout-barcen-3/about.txt+3 tests/golden/inline-leftout-barcen-3/source.jibb+1 tests/golden/inline-leftout-barcen-3/tokens.txt+3 tests/golden/inline-leftout-barcen-3/tree.txt+3 tests/golden/inline-leftout-buc-paren-2/about.txt+3 tests/golden/inline-leftout-buc-paren-2/source.jibb+1 tests/golden/inline-leftout-buc-paren-2/tokens.txt+3 tests/golden/inline-leftout-buc-paren-2/tree.txt+3 tests/golden/inline-leftout-buc-paren/tokens.txt+2−2 tests/golden/inline-leftout-buc-paren/tree.txt+1−1 tests/golden/inline-leftout-cencol/tokens.txt+1−1 tests/golden/inline-leftout-cencol/tree.txt+1−1 tests/golden/inline-leftout-cenhep/about.txt+3 tests/golden/inline-leftout-cenhep/source.jibb+1 tests/golden/inline-leftout-cenhep/tokens.txt+3 tests/golden/inline-leftout-cenhep/tree.txt+3 tests/golden/inline-leftout-colhep/about.txt+3 tests/golden/inline-leftout-colhep/source.jibb+1 tests/golden/inline-leftout-colhep/tokens.txt+3 tests/golden/inline-leftout-colhep/tree.txt+3 tests/golden/inline-leftout-miccol/about.txt+3 tests/golden/inline-leftout-miccol/source.jibb+1 tests/golden/inline-leftout-miccol/tokens.txt+3 tests/golden/inline-leftout-miccol/tree.txt+3 tests/golden/inline-leftout-sigpam-wide/about.txt+3 tests/golden/inline-leftout-sigpam-wide/source.jibb+1 tests/golden/inline-leftout-sigpam-wide/tokens.txt+8 tests/golden/inline-leftout-sigpam-wide/tree.txt+3 tests/golden/inline-leftout-tisgal-2/about.txt+3 tests/golden/inline-leftout-tisgal-2/source.jibb+1 tests/golden/inline-leftout-tisgal-2/tokens.txt+3 tests/golden/inline-leftout-tisgal-2/tree.txt+3 tests/golden/inline-leftout-tisgal/tokens.txt+2−2 tests/golden/inline-leftout-tisgal/tree.txt+1−1 tests/golden/inline-leftout-tisgar/tokens.txt+2−2 tests/golden/inline-leftout-tisgar/tree.txt+1−1 tests/golden/inline-leftout-tislus/about.txt+3 tests/golden/inline-leftout-tislus/source.jibb+1 tests/golden/inline-leftout-tislus/tokens.txt+9 tests/golden/inline-leftout-tislus/tree.txt+3 tests/golden/inline-leftout-tistis/tokens.txt+2−2 tests/golden/inline-leftout-tistis/tree.txt+1−1 tests/golden/inline-leftout-wutcol-2/about.txt+3 tests/golden/inline-leftout-wutcol-2/source.jibb+1 tests/golden/inline-leftout-wutcol-2/tokens.txt+3 tests/golden/inline-leftout-wutcol-2/tree.txt+3 tests/golden/inline-leftout-wutsig/about.txt+3 tests/golden/inline-leftout-wutsig/source.jibb+1 tests/golden/inline-leftout-wutsig/tokens.txt+3 tests/golden/inline-leftout-wutsig/tree.txt+3 tests/golden/inline-pattern-duration-bad/about.txt+3 tests/golden/inline-pattern-duration-bad/source.jibb+3 tests/golden/inline-pattern-duration-bad/tokens.txt+11 tests/golden/inline-pattern-duration-bad/tree.txt+3 tests/golden/inline-pattern-face-bad/about.txt+3 tests/golden/inline-pattern-face-bad/source.jibb+3 tests/golden/inline-pattern-face-bad/tokens.txt+15 tests/golden/inline-pattern-face-bad/tree.txt+3 tests/golden/lex-blob-bad-1/about.txt+3 tests/golden/lex-blob-bad-1/source.jibb+1 tests/golden/lex-blob-bad-1/tokens.txt+3 tests/golden/lex-blob-bad-1/tree.txt+3 tests/golden/lex-closer-bad-1/about.txt+3 tests/golden/lex-closer-bad-1/source.jibb+1 tests/golden/lex-closer-bad-1/tokens.txt+8 tests/golden/lex-closer-bad-1/tree.txt+3 tests/golden/lex-closer-bad-2/about.txt+3 tests/golden/lex-closer-bad-2/source.jibb+4 tests/golden/lex-closer-bad-2/tokens.txt+3 tests/golden/lex-closer-bad-2/tree.txt+3 tests/golden/lex-closer-bad-3/about.txt+3 tests/golden/lex-closer-bad-3/source.jibb+3 tests/golden/lex-closer-bad-3/tokens.txt+9 tests/golden/lex-closer-bad-3/tree.txt+3 tests/golden/lex-codepoint-bad-1/about.txt+3 tests/golden/lex-codepoint-bad-1/source.jibb+1 tests/golden/lex-codepoint-bad-1/tokens.txt+3 tests/golden/lex-codepoint-bad-1/tree.txt+3 tests/golden/lex-date-bad-3/about.txt+3 tests/golden/lex-date-bad-3/source.jibb+1 tests/golden/lex-date-bad-3/tokens.txt+3 tests/golden/lex-date-bad-3/tree.txt+3 tests/golden/lex-duration-bad-2/about.txt+3 tests/golden/lex-duration-bad-2/source.jibb+1 tests/golden/lex-duration-bad-2/tokens.txt+3 tests/golden/lex-duration-bad-2/tree.txt+3 tests/golden/lex-name-bad-5/about.txt+3 tests/golden/lex-name-bad-5/source.jibb+1 tests/golden/lex-name-bad-5/tokens.txt+3 tests/golden/lex-name-bad-5/tree.txt+3 tests/golden/lex-name-bad-6/about.txt+3 tests/golden/lex-name-bad-6/source.jibb+1 tests/golden/lex-name-bad-6/tokens.txt+4 tests/golden/lex-name-bad-6/tree.txt+3 tests/golden/lex-open-bracket-bad-4/about.txt+1−1 tests/golden/lex-open-bracket-bad-4/tree.txt+3−3 tests/golden/lex-open-bracket-bad-5/about.txt+3 tests/golden/lex-open-bracket-bad-5/source.jibb+3 tests/golden/lex-open-bracket-bad-5/tokens.txt+13 tests/golden/lex-open-bracket-bad-5/tree.txt+3 tests/golden/lex-tight-ctor-bad-1/tree.txt+1−1 tests/golden/lex-tight-opener-bad-2/tree.txt+1−1 tests/golden/lex-tight-pair-bad-2/about.txt+3 tests/golden/lex-tight-pair-bad-2/source.jibb+2 tests/golden/lex-tight-pair-bad-2/tokens.txt+9 tests/golden/lex-tight-pair-bad-2/tree.txt+3 tests/golden/lex-tight-pair-bad-3/about.txt+3 tests/golden/lex-tight-pair-bad-3/source.jibb+1 tests/golden/lex-tight-pair-bad-3/tokens.txt+3 tests/golden/lex-tight-pair-bad-3/tree.txt+3 tests/lib/jibb.hoon+1007−423 tools/hoon+10−1
jibb-dev/lib/jibb.hoon+1221−344
@@ -26,7 +26,9 @@
2626:: likely reading and are listed, with the doc's words, for the doc's
2727:: author to settle. The golden corpus's "expect:" lines give each
2828:: error's position. The layout pass's errors sit there, except where
29−:: the parser finds an earlier error first, as in `++ 2nd 5` (2.0, 2.8).
29+:: the parser finds an earlier error first, as in `++ 2nd 5`, or moves
30+:: one back to the start of its text, as in `++ x @sd` (2.0, 2.8, and
31+:: section 3, Errors).
3032::
3133:: ===================================================================
3234:: 1. Positions
@@ -52,7 +54,12 @@
5254:: only, and milestone 1's errors use starts only, so ends are first
5355:: used by milestone 2's excerpts. Until then +check-spans tests the two
5456:: rules above on every tree +golden prints, and a tree that breaks one
55−:: ends with a line "SPAN ERROR: (<kind> <start> to <end>) <why>".
57+:: ends with a line "SPAN ERROR: (<kind> <start> to <end>) <why>". It
58+:: finds each node's end from the tokens alone, matching each opener
59+:: with its closer on the line, so a node that stops at a child where
60+:: its closer follows fails it, and +check-spans-test plants such
61+:: wrong ends to show that it does (tools/hoon check-spans-test prints
62+:: the empty list, <<>>, when it passes).
5663::
5764:: ===================================================================
5865:: 2. The layout pass (+layout)
@@ -62,17 +69,22 @@
6269:: crosses a line break, and only layout tokens join lines.
6370::
6471:: 2.0 Errors. +layout never fails. Where the text breaks a rule of this
65−:: section, it emits one error token, [%error msg], at the first
66−:: character that breaks it, and stops reading. The parser accepts no
67−:: error token, so it reports whichever comes first, its own error or
68−:: this one (section 3, Errors). Every error, from either stage, points
69−:: at the first character where the text stops being the start of any
70−:: valid module: everything before it could still be right. Hoon's
71−:: parser reports errors the same way, and the golden corpus's expect
72−:: lines assume it. It also puts `++ x ]` on line 1 before a bad string
73−:: on line 9, which a lexer that failed first would report instead. The
74−:: positions below follow from it. Messages quote code in backticks, as
75−:: the parser's do (section 3, Errors).
72+:: section, it emits one error token, [%error msg from c], at the first
73+:: character that breaks it, and stops reading. from is where the text
74+:: it was reading began, c is that text's first character, and the
75+:: token is tight when that text follows the previous token with no
76+:: space. The parser accepts no error token, so it reports whichever
77+:: comes first, its own error or this one (section 3, Errors). Every
78+:: error, from either stage, points at the first character where the
79+:: text stops being the start of any valid module: everything before
80+:: it could still be right. Hoon's parser reports errors the same way,
81+:: and the golden corpus's expect lines assume it. It also puts `++ x
82+:: ]` on line 1 before a bad string on line 9, which a lexer that
83+:: failed first would report instead. The positions below follow from
84+:: it, for text that could begin a token where it stands; where the
85+:: parser's place can't begin with c at all, the parser moves the
86+:: error back to from, as `++ x @sd` at the @ (section 3, Errors).
87+:: Messages quote code in backticks, as the parser's do.
7688::
7789:: 2.1 Lines. The text is split at every \0a. A final \0a ends the last
7890:: line rather than starting an empty one. Lines are numbered from 1.
@@ -164,7 +176,8 @@
164176:: $?( $? $-( glyphs; $- followed by anything but ( is an error
165177:: at 3rd, "`$-` has only the wide form `$-(sample
166178:: product)`"
167−:: ^- ?- !! ? glyphs (? alone is the loobean mold)
179+:: ^- ?- !! ? glyphs (? alone is the loobean mold; ? then a
180+:: character of Hoon's other ? runes is left out, below)
168181:: @ aura: @, then [a-z]*, then at most one [A-Z]; the
169182:: token holds the text after @. An aura starting @s or
170183:: @r is an error at 2nd: "signed and floating-point
@@ -186,8 +199,8 @@
186199:: an error at 2nd, "`|` begins `|=`, `|=(` or `|$`",
187200:: "`$` begins `$?`, `$?(` or `$-(`", "`^` begins `^-`"
188201:: : followed by anything but :, an error at 2nd: the
189−:: table's :~ :* and a:b, else "a comment starts with
190−:: `::`"
202+:: table's :~ :* :- :+ :^ :_ and a:b, else "a comment
203+:: starts with `::`"
191204:: anything else an error at it, naming it: "unexpected `,`", with a
192205:: hint where one helps (+unexpected): for , . - and <,
193206:: what Jibb writes instead
@@ -195,32 +208,46 @@
195208:: Hoon forms the doc leaves out are errors with the doc's reason, as
196209:: "`|%` is left out: modules are records". Each points where the text
197210:: stops being Jibb: at its second character when its first can begin
198−:: Jibb there, else at its first.
211+:: some Jibb token, else at its first. Where the parser's place can't
212+:: begin with that first character, the parser moves the error to it
213+:: (2.0): `|%` at the top of a file fails at the |, `++ x |%` at the %.
214+:: The doc's list says "such as" of the tall forms and the wide ones,
215+:: so Hoon's runes of the same kinds get the same reason (doc
216+:: question):
199217::
200218:: |% |_ |* 2nd modules are records
201219:: |- 2nd gates recurse by name
202−:: $( 1st gates recurse by name; no expression starts $
220+:: $( 2nd gates recurse by name (at the $ where an
221+:: expression goes, as no expression starts $)
203222:: $% 2nd $? covers unions
204−:: ?+ ?: 2nd ?- is the branch (?:: is ? and a comment)
223+:: ?: ?+ 2nd ?- is the branch, and so for Hoon's other ?
224+:: runes, ?~ ?= ?. ?@ ?^ ?& ?| ?< ?> (?:: is ?
225+:: and a comment)
205226:: ?! 2nd eq and not are gates
206227:: .= 1st eq and not are gates
207228:: !x 2nd not is a gate: ! then anything but ! or >
208229:: !> /+ 2nd code also runs in the browser
209−:: =< => .* 1st names never shadow, and . reads imports too
230+:: =< => 2nd names never shadow, and . reads imports too
231+:: .* 1st the same
210232:: a:b 2nd of the :, right after a name: names never
211233:: shadow, and . reads imports too; write a.b
212234:: :~ :* 2nd indentation covers them; write ~[…] or […]
213−:: %: %= 2nd indentation covers them
214−:: == -- 1st the closers are left out: indentation covers
215−:: them
235+:: :- :+ :^ :_ 2nd indentation covers them; write a cell as [a b]
236+:: %: %- %+ 2nd indentation covers them; a call is (f a b)
237+:: %^ %~
238+:: %= 2nd indentation covers it; write a change, m(a=b)
239+:: == 2nd the closers are left out: indentation covers
240+:: -- 1st them
216241:: ~| 2nd ~& covers debugging
242+:: ;: 1st nest the calls, as (add a (add b c))
217243:: ; 1st Sail's ; runes are left out: layout is Jibb's
218244:: elements
219245:: ' 1st there is no '…' form: strings are "…"
220246::
221247:: The parser finds the doc's other left-out forms (section 3, Errors):
222−:: =(a b), =/, *mold, ^-(…) and ?-(…). The lexer can't, since =( =/ and *
223−:: begin valid Jibb too: open=(not open.s), scry=/todos, a * mold.
248+:: =(a b), =/, *mold, ^-(…), ?-(…) and ~&(…), and Hoon's =+ =? and =.
249+:: The lexer can't, since = and * begin valid Jibb too: open=(not
250+:: open.s), scry=/todos, a * mold.
224251::
225252:: 2.7 Paths. Right after a / or %/ glyph, a run of knot characters
226253:: [a-z0-9._~-] is one knot token, tight. So /posts/~zod is / knot / knot;
@@ -241,17 +268,38 @@
241268::
242269:: 2.8 Literals. The lexer takes a literal's run (2.6), then reads it
243270:: with Hoon's own parser, (nuck:so [[line col] run]), whose edge says
244−:: how much it read and how far it looked (p.edge):
271+:: how much it read and how far it looked (p.edge). Some runs never
272+:: reach it, since they begin an aura Jibb doesn't write, whatever
273+:: follows, or text Hoon's parser crashes on:
274+:: - 0b, 0c, 0i and 0w: an error at 2nd, "Jibb writes no @uw
275+:: literals" and so on. Hoon's parser would read 0b, or a 0c1 whose
276+:: checksum fails, as the number 0 and an error past the run.
277+:: - ~- (a @c), "Jibb writes no @c literals", and ~~ (a cord), "Jibb
278+:: writes no @t literals; strings are "…"", at 2nd. Hoon's reader of
279+:: @c crashes on a control character, as in ~-~1.
280+:: - ~0 and a base-32 digit, at 3rd: Hoon's parser reads a blob there
281+:: and cues it, which can run out of memory, past what mule catches.
282+:: No Jibb literal goes on so, since a year has no leading 0: after
283+:: a letter it is "Jibb writes no blob literals", after a digit the
284+:: date's message (+literal-msg). ~0.1.1 is a date (below).
285+:: - A year BC of 0 or past 292.277.024.401, as in ~0-.1.1, at the -
286+:: that makes it BC: Hoon's +year crashes on it (+year-bc).
287+:: - A fifth sub-second group, after a duration's .. or a date's
288+:: second .., at the dot that begins it: "a date or duration takes
289+:: at most four sub-second groups", as Hoon's do, since its +yule
290+:: crashes on a fifth (+fifth-group).
291+:: A date or duration is also read under mule, so that any other crash
292+:: is an error at the run's start, "Jibb can't read this literal"; other
293+:: runs aren't, since mule costs about a millisecond a call. Then:
245294:: - It read the whole run, as an aura Jibb takes: the token. Numbers
246295:: take %ud, %ux and %uv: 1.000, 0x1f, 0v5.fdf99 (Hoon reads 0x1F
247296:: too). ~ runs take %p, %da, %dr and %ta: ~zod, ~sampel-palnet,
248−:: ~2026.10.23..14.30.00, ~h1.m30, ~.my-post.
249−:: - It read the run or part of it as an aura Jibb doesn't take: 0w1,
250−:: 0i1, ~~a (a cord), ~-a (a @c). An error at 2nd, "Jibb writes no
251−:: @uw literals". A run starting 0b, 0c, 0i or 0w gets that error
252−:: before nuck:so reads it, since no Jibb literal goes on that way:
253−:: Hoon's parser would read 0b, or a 0c1 whose checksum fails, as
254−:: the number 0 and an error past the run.
297+:: ~2026.10.23..14.30.00, ~h1.m30, ~.my-post. Its value is Hoon's:
298+:: ~0.1.1 is 1 BC and prints as ~1-.1.1, and ~2026.2.31 is
299+:: ~2026.3.3 (doc question).
300+:: - It read the run or part of it as another aura Jibb doesn't take:
301+:: an error at 2nd that names the aura, as "Jibb writes no @if
302+:: literals".
255303:: - It read only part of the run, as an aura Jibb takes: that part is
256304:: a token, then an error token at p.edge, the furthest character
257305:: Hoon's parser looked at, where Hoon reports it too. 1000 is the
@@ -267,13 +315,12 @@
267315:: d h m or s, if that is later: Hoon's parser reads a syllable's
268316:: three letters before it looks them up, so it looks past that
269317:: letter. `++ x ~x` fails at the x, 1:7, as no syllable starts with
270−:: x, and ~sampel-palnez at the z.
271−:: A run that starts as a date BC does, ~ and a year then -, fails at the
272−:: - if the year is 0 or past 292.277.024.401, before nuck:so sees it:
273−:: Hoon's +year crashes on those years, as in ~0-.1.1 (+year-bc).
274−:: The token is [%lit [form aura val]]: form names the literal rule that
275−:: matched, aura and val are the dime Hoon's parser gives. Terms,
276−:: loobeans and the bare ~ are read by hand (2.6).
318+:: x, and ~sampel-palnez at the z. The error token's from is the
319+:: run's start, since the whole run is what fails (2.0).
320+:: The token is [%lit [form aura val txt]]: form names the literal rule
321+:: that matched, aura and val are the dime Hoon's parser gives, and txt
322+:: is the literal as written. Terms, loobeans and the bare ~ are read by
323+:: hand (2.6).
277324::
278325:: 2.9 Strings. A " starts a string, which ends on the same line. Up to
279326:: the closing ":
@@ -342,14 +389,15 @@
342389:: descent is shorter, and each error names what its construct expected.
343390:: An operand that isn't where an expression starts (a call's argument,
344391:: an item, a pair's or unit's operand, the wide gate's body) can't be a
345−:: rune, so there |= is a constructor and needs its term at once:
346−:: (state.cart |= %got) is an error at the space after |=, 1:20. A loop
347−:: over many items (definitions, arms, lines, items) is a trap whose
348−:: every step, through +then, is a tail call, so a long module grows no
349−:: stack. Nesting does, by a few frames a level: 100.000 nested
350−:: parentheses parse, and so does a 20.000-line module. +golden's tree
351−:: is another matter: its indent grows with depth, so 7.000 nested
352−:: parentheses print as 49 MB and 10.000 run out of memory.
392+:: rune, so there |= is a constructor and needs its term at once, or
393+:: the ( of the wide gate: in ++ x (state.cart |= %got) the space after
394+:: |= is an error, 1:20. A loop over many items (definitions, arms,
395+:: lines, items) is a trap whose every step, through +then, is a tail
396+:: call, so a long module grows no stack. Nesting does, by a few frames
397+:: a level: 100.000 nested parentheses parse, and so does a 20.000-line
398+:: module. +golden's tree stops indenting past 64 levels (4.2), so its
399+:: size grows with the text's, not with its square: tools/golden takes
400+:: 8 s on 10.000 nested parentheses, 5.5 s of it building the library.
353401::
354402:: The EBNF and its nodes (see the types below):
355403:: module { import NEWLINE } { definition NEWLINE }, then the end
@@ -357,7 +405,9 @@
357405:: "expected a definition, found `/-`; imports come first"
358406:: import /- name -> %sur; /% term -> %mark; /= name pathlit ->
359407:: %jibb. /% takes % and a name only: no mark is called %0,
360−:: %& or %| (doc question)
408+:: %& or %| (doc question). /='s path has a segment, as it
409+:: names a module's file: /= card / is an error just past
410+:: the / (doc question)
361411:: definition +$ name mold, or the mold alone on a deeper line ->
362412:: %mold (both layouts give one node); ++ name expr or body
363413:: -> %value (a body becomes a %body expr)
@@ -404,13 +454,15 @@
404454:: - Spaces, comments and blank lines: the layout pass, and Spacing
405455:: below.
406456:: - pathlit as an operand (above), with / alone the empty path.
407−:: - knot may be empty: only / alone uses that, as the empty path; //
408−:: and a trailing / are errors (doc question).
457+:: - knot may be empty: only / alone uses that, as the empty path in
458+:: an expression or a mold, not in an import; // and a trailing /
459+:: are errors (doc question).
409460:: - Open brackets in molds: mold has no open form, so a mold's [ or (
410461:: closes on its line, and only $? takes lines below (doc question).
411462:: - Two brackets left open on one line, as (column ~[: the last one
412463:: takes the deeper lines, and the other is then unclosed, an error
413−:: (doc question).
464+:: at the end of that line, where nothing can close it any more
465+:: (doc question; Errors below).
414466:: - Local definitions: the EBNF takes them in every body (of ++, |=,
415467:: ^-, ~& and arms), the Runes prose says "inside a gate"; the parser
416468:: takes them in every body and leaves the rest to the checker (doc
@@ -428,12 +480,13 @@
428480:: right before a closer ) ] or } (the theme example writes `[ space=`),
429481:: the ( and ) of an application path's segment included; inside
430482:: them the expression is spaced as anywhere else, as %/x/(f a)
431−:: A missing space is an error at the tight token, and so is a space
432−:: inside a tight form, at the space (Errors). A rune with children, and
433−:: an import glyph, is followed by a space (or, for $? with its cases
434−:: below, the end of the line). Items are separated by one or more
435−:: spaces; how many isn't checked. This is how the parser makes "one
436−:: space between items; more for alignment" precise (doc question).
483+:: A missing space is an error at the tight token, and a space inside
484+:: a tight form, or the end of the line there, is one where it starts
485+:: (Errors). A rune with children, and an import glyph, is followed by
486+:: a space (or, for $? with its cases below, the end of the line).
487+:: Items are separated by one or more spaces; how many isn't checked.
488+:: This is how the parser makes "one space between items; more for
489+:: alignment" precise (doc question).
437490::
438491:: Errors. The parser stops at the first token it can't accept and
439492:: reports "expected <what>, found <token>", with an optional "; <hint>",
@@ -444,30 +497,78 @@
444497:: the same depth" (NEWLINE), "a shallower line" (DEDENT), or "the end of
445498:: the file" (an empty span, 2.5). Each error points at the first
446499:: character that can't begin a valid module (2.0):
447−:: - At the token's start; for a layout token, at the start of the
448−:: line it begins, or just past the last token at the end of the
449−:: file (+where). So `++ view` above `++ main view` is an error at
450−:: 2:1, the line that isn't deeper.
500+:: - At a token the place can't take: just past the part of it that
501+:: could still begin what the place takes (+fail-in, +prefix). That
502+:: is none when the place can't begin with its first character, so
503+:: `++ 2nd 5` fails at the 2, 1:4; a wing's first name where a name
504+:: goes, so `++ a.b 1` fails at the dot, 1:5; else one character,
505+:: as the % of %.y where a term goes, the ~ of ~zod where a mold
506+:: goes (~ alone is one), or a + or ? alone. A layout token is at
507+:: the start of the line it begins, or just past the last token at
508+:: the end of the file (+where). So `++ view` above `++ main view`
509+:: is an error at 2:1, the line that isn't deeper.
451510:: - Where a tight form needs its next token at once (after name+, `,
452−:: |= in an operand, name=, the = of a pun, a path's / and %/, a
453−:: typed segment's parts) and finds a space: at the end of the
454−:: previous token, where the space starts, "expected a term right
455−:: after `|=`, found a space" (+fail-space). A wing and a ( after a
456−:: space are no error: that is a call.
457−:: - At an error token: the lexer's position and message, unchanged.
458−:: - Three pattern errors point inside their token, where it stops
459−:: being a pattern: a date, duration or knot at its second character
460−:: (~ alone is null, and no ship goes on so), ~[ at its [, and a
461−:: string with {…} at its {.
511+:: |= in an operand, name=, the = of a pun, a / after a path
512+:: segment, a typed segment's parts) and finds a space or the end
513+:: of the line: at the end of the previous token, where the space or
514+:: the line's end starts, as "expected an operand right after `+`,
515+:: found the end of the line" (+fail-space). No later line can give
516+:: a tight form its next token. A wing and a ( after a space are no
517+:: error: that is a call; nor is / or %/ alone, a whole path.
518+:: - At an error token: the lexer's position and message, unless the
519+:: text it was reading begins with a character the place can't
520+:: begin with. Then at that character, the lexer's message after
521+:: the parser's (+moved): `++ x @sd` is "expected an expression,
522+:: found `@`; signed and floating-point auras are left out of Jibb"
523+:: at the @, while `+$ x @sd` fails at the s. The place includes
524+:: what could still go on before it: after a call's operand and a
525+:: space, another operand, so `++ x a ?:` fails at the ? and `++ x
526+:: a |%` at the % (+read-operands); after a mold, an import or !!
527+:: that ends a line, nothing, so `+$ x @ |%` fails at the |
528+:: (+bad-end-in); tight after an item, a closer, or after a name
529+:: the ( . + or = of a change, wing, pair or face (+tight-error,
530+:: which doesn't look at what the item was, though it takes no =
531+:: after a call's operand). A : stays where the lexer put it, since
532+:: it could begin a comment. An error token after a space or on a
533+:: later line, where a tight form needed its next token, comes after
534+:: the tight form's error (+fail-space).
535+:: - At layout tokens followed by an error token whose text begins
536+:: the line, both errors are at the line's start, and the lexer's
537+:: message, about that text, says more: a line `==` that closes a
538+:: ?- is "the closer `==` is left out: indentation covers it", not
539+:: "expected the end of the body" (+lexer-error).
540+:: - Where a line's last open bracket or rune took the deeper lines
541+:: while something opened before it on the line still needs a
542+:: closer there or deeper lines of its own: at the end of that
543+:: line, since no later line can supply them (+doomed). `++ x
544+:: (column ~[` above deeper lines is "expected `)` to close the `(`
545+:: at 1:6, found the end of the line; the deeper lines go to the
546+:: last bracket or rune left open on this line", at 1:16.
547+:: - Pattern errors point inside their token, where it stops being a
548+:: pattern: a date or knot at its second character (~ alone is
549+:: null, and no ship goes on so), a duration just past its unit
550+:: letter (~d begins ships, as ~dur), ~[ at its [, and a string
551+:: with {…} at its {.
462552:: In a bracket, a closer that doesn't match is "expected `]` to close
463553:: the `~[` at 1:6, found `)`", checked before spacing; after an item, a
464554:: tight token that isn't a closer is "expected a space between items,
465−:: found `M`". Hints name the left-out forms the lexer can't see (2.6):
466−:: where an expression starts, = followed tight by ( is "=(a b) is left
467−:: out: eq is a gate", = followed tight by / is "=/ is left out: ++
468−:: defines values", and * is "*mold is left out: no defaults"; ^- or ?-
469−:: followed tight by ( is "the wide form ^-(…) is left out: indentation
470−:: covers it". The messages quote that code in backticks (2.0), as in
555+:: found `M`". A ) or ] that closes no bracket opened before it on its
556+:: line adds "this `)` closes no bracket" (+stray), and a closer on a
557+:: line of an open bracket "a bracket open at the end of its line takes
558+:: no closer: its items end at the first line that isn't deeper". Hints
559+:: name the left-out forms the lexer can't see (2.6): where an
560+:: expression starts, = followed tight by ( is "=(a b) is left out: eq
561+:: is a gate"; = followed tight by / is "=/ is left out: ++ defines
562+:: values", and so for Hoon's =+ =? and =.; * is "*mold is left out: no
563+:: defaults"; ^-, ?- or ~& followed tight by ( is "the wide form ^-(…)
564+:: is left out: indentation covers it". Others name likely slips: |=
565+:: and a space where an operand goes, "a gate in an operand is |=(a
566+:: body)", or before a term "a case's constructor takes its term with
567+:: no space, as |=%got"; name= in a pattern, "patterns take no
568+:: `name=`: a bare name binds, as [a b]"; a capital or a wing where a
569+:: name goes, "a name starts with a lowercase letter" and "a name has
570+:: no `.`"; a lone + where a definition goes, "`+` begins `++` or
571+:: `+$`". The messages quote that code in backticks (2.0), as in
471572:: "`=(a b)` is left out: eq is a gate". Examples:
472573:: expected `]` or an item on a deeper line, found a line at the same
473574:: depth
@@ -524,7 +625,10 @@
524625:: (a string's quoted text, an application path's knots). A node whose
525626:: kids are all leaves prints on one line; otherwise each kid goes on its
526627:: own line, indented two more spaces, and the closing parens end the
527−:: last kid's line. (module …) always breaks. Bare fields and samples
628+:: last kid's line. (module …) always breaks. Past 64 levels the indent
629+:: stops growing: a deeper line starts with 128 spaces and its depth
630+:: between bars, as `|65| (group 1:69`, so the printed tree's size is
631+:: linear in the text's however deep it nests. Bare fields and samples
528632:: print as their mold, and a cell sample as (cell …) of its samples, a
529633:: bare name there as (bind …); unnamed items print as their expr;
530634:: strings print text pieces quoted, between their interpolated exprs;
@@ -627,7 +731,7 @@
627731 [%knot p=@ta] :: path segment
628732 [%aura p=@ta] :: @ud as 'ud', @ as ''
629733 [%tvar p=@t] :: M
630− [%error p=tape] :: 2.0: what broke
734+ [%error p=tape from=loc c=@] :: 2.0: what broke
631735 ==
632736::
633737:: +glyph: a token that is its text, and the layout tokens
@@ -646,8 +750,10 @@
646750::
647751:: +lit: a literal other than a string, as Hoon's parsers read it
648752::
649−:: form is the literal rule that matched; aura and val are the dime
650−:: nuck:so gives, or for terms and loobeans:
753+:: form is the literal rule that matched; txt is the literal as
754+:: written, which the printers show, since Hoon's own printing of
755+:: some auras (@da) differs between Hoon versions; aura and val are
756+:: the dime nuck:so gives, or for terms and loobeans:
651757:: %number 1.000 0x1f 0v5.fdf99 %ud %ux %uv
652758:: %ship ~zod %p
653759:: %date ~2026.10.23 %da
@@ -657,7 +763,7 @@
657763:: %loobean %.y %.n %f 0, %f 1
658764:: %null ~ %n 0
659765::
660−+$ lit [form=lit-form aura=@ta val=@]
766++$ lit [form=lit-form aura=@ta val=@ txt=@t]
661767+$ lit-form
662768 ?(%number %ship %date %duration %knot %term %loobean %null)
663769::
@@ -794,8 +900,8 @@
794900::
795901:: +layout: source to tokens (design: section 2)
796902::
797−:: Never fails: an error it finds is its last token, [%error msg], at
798−:: the error's position (2.0). +lexer does the work.
903+:: Never fails: an error it finds is its last token, [%error msg from
904+:: c], at the error's position (2.0). +lexer does the work.
799905::
800906++ layout
801907 |= [file=path src=@t]
@@ -827,7 +933,7 @@
827933++ parse-tokens
828934 |= [file=path toks=(list token)]
829935 ^- (each module error)
830− (~(read-module parser file) toks)
936+ (~(read-module parser file toks) toks)
831937::
832938:: +golden: both stages printed, or the rendered error
833939::
@@ -962,10 +1068,23 @@
9621068 ::
9631069 :: +err: the error token, at column c of this line (2.0)
9641070 ::
1071+ :: It also records where the text it was reading began, from, and
1072+ :: that text's first character: the parser moves the error there
1073+ :: when the place it is in can't begin with that character (section
1074+ :: 3, Errors). Like any token, it is tight when that text follows the
1075+ :: last token with no space.
1076+ ::
9651077 ++ err
9661078 |= [c=@ud msg=tape]
9671079 ^+ cor
968− cor(out [[[[lin c] [lin c]] | [%error msg]] out])
1080+ (err-from c msg [lin col] ?~(cs 0 i.cs))
1081+ ::
1082+ :: +err-from: +err, where the text began at from with first
1083+ ::
1084+ ++ err-from
1085+ |= [c=@ud msg=tape from=loc first=@]
1086+ ^+ cor
1087+ cor(out [[[[lin c] [lin c]] =(from pend) [%error msg from first]] out])
9691088 ::
9701089 :: +put: a token from beg to end on this line, with rest the text
9711090 :: after it, which starts at end
@@ -1023,10 +1142,10 @@
10231142 ?: =('%' a) (percent b c)
10241143 ?: =('=' a)
10251144 ?: |(=('<' b) =('>' b))
1026− %+ err col
1145+ %+ err +(col)
10271146 "`={[b ~]}` is left out: names never shadow, and `.` reads imports too"
10281147 ?: =('=' b)
1029− (err col "the closer `==` is left out: indentation covers it")
1148+ (err +(col) "the closer `==` is left out: indentation covers it")
10301149 (emit 1 %'=')
10311150 ?: =('`' a) (emit 1 %'`')
10321151 ?: =('*' a) (emit 1 %'*')
@@ -1035,7 +1154,7 @@
10351154 ?: =('&' b) (emit 2 %'~&')
10361155 ?: =('|' b) (err +(col) "`~|` is left out: `~&` covers debugging")
10371156 =/ n=@ud (run-len t.cs knot-mask)
1038− ?: =(0 n) (emit 1 [%lit %null %n 0])
1157+ ?: =(0 n) (emit 1 [%lit %null %n 0 '~'])
10391158 (literal +(n))
10401159 ?: =('/' a)
10411160 ?: &(=(1 col) |(=('-' b) =('%' b) =('=' b)))
@@ -1061,7 +1180,7 @@
10611180 ?: &(=('-' b) =('(' c)) (emit 3 %'$-(')
10621181 ?: =('-' b)
10631182 (err (add 2 col) "`$-` has only the wide form `$-(sample product)`")
1064− ?: =('(' b) (err col "`$(…)` is left out: gates recurse by name")
1183+ ?: =('(' b) (err +(col) "`$(…)` is left out: gates recurse by name")
10651184 ?: =('%' b) (err +(col) "`$%` is left out: `$?` covers unions")
10661185 (err +(col) "`$` begins `$?`, `$?(` or `$-(`")
10671186 ?: =('^' a)
@@ -1069,10 +1188,12 @@
10691188 (err +(col) "`^` begins `^-`")
10701189 ?: =('?' a)
10711190 ?: =('-' b) (emit 2 %'?-')
1072− ?: =('+' b) (err +(col) "`?+` is left out: `?-` is the branch")
10731191 ?: &(=(':' b) !=(':' c))
10741192 (err +(col) "`?:` is left out: `?-` is the branch")
10751193 ?: =('!' b) (err +(col) "`?!` is left out: eq and not are gates")
1194+ :: Hoon's other ? runes; nothing in Jibb goes tight after a ? mold
1195+ ?: (in b wut-mask)
1196+ (err +(col) "`?{[b ~]}` is left out: `?-` is the branch")
10761197 (emit 1 %'?')
10771198 ?: =('!' a)
10781199 ?: =('!' b) (emit 2 %'!!')
@@ -1098,6 +1219,9 @@
10981219 (err +(col) "`:~` is left out: indentation covers it; write ~[…]")
10991220 ?: =('*' b)
11001221 (err +(col) "`:*` is left out: indentation covers it; write […]")
1222+ ?: |(=('-' b) =('+' b) =('^' b) =('_' b))
1223+ %+ err +(col)
1224+ "`:{[b ~]}` is left out: indentation covers it; write a cell as [a b]"
11011225 ?: &(=(pend [lin col]) ?=([[* * ?([%name *] [%wing *])] *] out))
11021226 %+ err +(col)
11031227 %+ weld "`a:b` is left out: names never shadow, "
@@ -1114,6 +1238,8 @@
11141238 (err col "the closer `--` is left out: indentation covers it")
11151239 (err col (unexpected a))
11161240 ?: =(';' a)
1241+ ?: =(':' b)
1242+ (err col "`;:` is left out: nest the calls, as (add a (add b c))")
11171243 (err col "Sail's `;` runes are left out: layout is Jibb's elements")
11181244 ?: =('\'' a) (err col "there is no '…' form: strings are \"…\"")
11191245 ?: =('{' a)
@@ -1146,24 +1272,28 @@
11461272 ^+ cor
11471273 ?: =('/' b) segment:(emit 2 %'%/')
11481274 ?: =('.' b)
1149− ?: =('y' c) (emit 3 [%lit %loobean %f 0])
1150− ?: =('n' c) (emit 3 [%lit %loobean %f 1])
1275+ ?: =('y' c) (emit 3 [%lit %loobean %f 0 '%.y'])
1276+ ?: =('n' c) (emit 3 [%lit %loobean %f 1 '%.n'])
11511277 (err (add 2 col) "the loobeans are `%.y` and `%.n`")
1152− ?: =('&' b) (emit 2 [%lit %term %f 0])
1153− ?: =('|' b) (emit 2 [%lit %term %f 1])
1154− ?: =(':' b) (err +(col) "`%:` is left out: indentation covers it")
1278+ ?: =('&' b) (emit 2 [%lit %term %f 0 '%&'])
1279+ ?: =('|' b) (emit 2 [%lit %term %f 1 '%|'])
1280+ ?: |(=(':' b) =('-' b) =('+' b) =('^' b) =('~' b))
1281+ %+ err +(col)
1282+ "`%{[b ~]}` is left out: indentation covers it; a call is (f a b)"
11551283 ?: =('=' b)
11561284 %+ err +(col)
11571285 "`%=` is left out: indentation covers it; write a change, as m(a=b)"
11581286 =/ rest=tape ?~(cs ~ t.cs)
11591287 ?: (is-lower b)
11601288 =/ n=@ud (run-len rest name-mask)
1161− => (emit +(n) [%lit %term %tas (crip (scag n rest))])
1289+ =/ nam=tape (scag n rest)
1290+ => (emit +(n) [%lit %term %tas (crip nam) (crip ['%' nam])])
11621291 ?. &(?=(^ cs) |((is-upper i.cs) =('_' i.cs))) cor
11631292 (err col "names are lowercase letters, digits and -")
11641293 ?: (is-digit b)
11651294 =/ n=@ud (run-len rest digit-mask)
1166− => (emit +(n) [%lit %term %ud (decimal (scag n rest))])
1295+ =/ dig=tape (scag n rest)
1296+ => (emit +(n) [%lit %term %ud (decimal dig) (crip ['%' dig])])
11671297 ?. &(?=(^ cs) (in i.cs term-tail-mask)) cor
11681298 %+ err col
11691299 "unexpected `{[i.cs ~]}`: a numeric term is `%` and digits only, as %1000"
@@ -1217,9 +1347,20 @@
12171347 =/ run=tape (scag n cs)
12181348 =/ a=@ ?~(run 0 i.run)
12191349 =/ b=@ ?~(run 0 ?~(t.run 0 i.t.run))
1220− :: 0b 0c 0i 0w begin auras Jibb doesn't write, whatever follows
1350+ :: 0b 0c 0i 0w, ~- and ~~ begin auras Jibb doesn't write, whatever
1351+ :: follows; Hoon's reader of ~- (@c) crashes on a control character
12211352 ?: &(=('0' a) |(=('b' b) =('c' b) =('i' b) =('w' b)))
12221353 (err +(col) "Jibb writes no @u{[b ~]} literals")
1354+ ?: &(=('~' a) =('-' b)) (err +(col) "Jibb writes no @c literals")
1355+ ?: &(=('~' a) =('~' b))
1356+ (err +(col) "Jibb writes no @t literals; strings are \"…\"")
1357+ :: ~0 and a base-32 digit begin a blob, which Hoon's reader cues, and
1358+ :: cue can run out of memory, which nothing catches; no Jibb literal
1359+ :: goes on so (a date's year has no leading 0)
1360+ =/ c=@ ?~(run 0 ?~(t.run 0 ?~(t.t.run 0 i.t.t.run)))
1361+ ?: &(=('~' a) =('0' b) (in c b32-mask))
1362+ ?: (is-digit c) (err (add 2 col) (literal-msg run %da))
1363+ (err (add 2 col) "Jibb writes no blob literals")
12231364 :: a year BC that Hoon's dates can't hold, which its date code
12241365 :: crashes on: an error at the - that makes it BC
12251366 =/ bc=(unit [at=@ud y=@ud]) (year-bc col run)
@@ -1227,7 +1368,18 @@
12271368 (err at.u.bc "there is no year 0 BC: 1 BC is ~1-, as ~1-.1.1")
12281369 ?: &(?=(^ bc) (gth y.u.bc 292.277.024.401))
12291370 (err at.u.bc "Hoon's dates begin in 292.277.024.401 BC")
1230− =/ ed (nuck:so [[lin col] run])
1371+ :: a fifth sub-second group, which Hoon's +yule crashes on
1372+ =/ five=(unit @ud) (fifth-group run)
1373+ ?^ five
1374+ %+ err (add col u.five)
1375+ "a date or duration takes at most four sub-second groups"
1376+ :: Hoon's date code reads dates and durations, and has crashed on
1377+ :: forms the checks above now stop; it runs under mule, in case
1378+ =/ try=(each (like coin) tang)
1379+ ?. (is-time run) [%& (nuck:so [[lin col] run])]
1380+ (mule |.((nuck:so [[lin col] run])))
1381+ ?: ?=(%| -.try) (err col "Jibb can't read this literal")
1382+ =/ ed=(like coin) p.try
12311383 ?~ q.ed (err q.p.ed (literal-msg run %$))
12321384 =/ used=@ud (sub n (lent q.q.u.q.ed))
12331385 =/ con=coin p.u.q.ed
@@ -1238,7 +1390,7 @@
12381390 %+ err +(col)
12391391 %+ weld "Jibb writes no @{(trip p.p.con)} literals"
12401392 ?:(=(%t p.p.con) "; strings are \"…\"" "")
1241− =/ lex=lexeme [%lit u.form p.p.con q.p.con]
1393+ =/ lex=lexeme [%lit u.form p.p.con q.p.con (crip (scag used run))]
12421394 ?: =(used n)
12431395 ?. =(%ta p.p.con) (emit n lex)
12441396 :: a ~. knot is followed as a path segment is (2.7)
@@ -1255,7 +1407,9 @@
12551407 =? at &(=('~' a) (is-lower b) ?=(?(%n %p) p.p.con))
12561408 =/ dur=@ud ?:(|(=('d' b) =('h' b) =('m' b) =('s' b)) 2 1)
12571409 (min at (add col (max dur (ship-stop run))))
1258− (err:(emit used lex) at (literal-msg run p.p.con))
1410+ :: the text that fails is the whole run, from its start, though its
1411+ :: first part is a token
1412+ (err-from:(emit used lex) at (literal-msg run p.p.con) [lin col] a)
12591413 ::
12601414 :: +text: a string's text, from its opening " or the } that closes
12611415 :: an interpolation, through the " or { that ends it (2.9). mid: it
@@ -1336,6 +1490,31 @@
13361490++ seg-bad-mask 0x1800.0001.57ff.ffff.f800.1cfe.0000.0000
13371491:: after a numeric term: a-z A-Z _ - .
13381492++ term-tail-mask 0x7ff.fffe.87ff.fffe.0000.6000.0000.0000
1493+:: after a ? glyph, Hoon's ? runes but ?- ?: and ?! (2.6): + ~ = . @ ^ & | < >
1494+++ wut-mask 0x5000.0000.4000.0001.7000.4840.0000.0000
1495+:: base-32 digits: 0-9 a-v
1496+++ b32-mask 0x7f.fffe.0000.0000.03ff.0000.0000.0000
1497+::
1498+:: What may begin each place the parser reads (section 3, Errors):
1499+:: an expression a-z 0-9 " ( [ ~ % / ` | ^ ? !
1500+:: an operand a-z 0-9 " ( [ ~ % / ` |
1501+:: a mold a-z A-Z @ * ! ? ~ % / ( [ $ |
1502+:: a pattern a-z 0-9 " ~ % * [
1503+:: and what may go tight after an operand: . ( + = after a name, a
1504+:: closer ) ] }, or the : of a comment
1505+::
1506+++ expr-mask 0x57ff.ffff.4800.0000.83ff.8126.0000.0000
1507+++ operand-mask 0x57ff.ffff.0800.0000.03ff.8124.0000.0000
1508+++ mold-mask 0x57ff.fffe.0fff.ffff.8000.8532.0000.0000
1509+++ pattern-mask 0x47ff.fffe.0800.0000.03ff.0424.0000.0000
1510+++ after-mask 0x2000.0000.2000.0000.2400.4b00.0000.0000
1511+++ plus-mask 0x800.0000.0000 :: +
1512+++ cen-mask 0x20.0000.0000 :: %
1513+++ fas-mask 0x8000.0000.0000 :: /
1514+++ tis-mask 0x2000.0000.0000.0000 :: =
1515+++ pat-mask 0x1.0000.0000.0000.0000 :: @
1516+++ sel-mask 0x800.0000.0000.0000.0000.0000 :: [
1517+++ ser-mask 0x2000.0000.0000.0000.0000.0000 :: ]
13391518::
13401519:: +cont-mask: UTF-8 continuation bytes, 10xx.xxxx, which start no
13411520:: column (1)
@@ -1437,6 +1616,62 @@
14371616 ?. ?=([%'-' *] rest) ~
14381617 `[(add col +((lent ds))) (decimal ds)]
14391618::
1619+:: +fifth-group: where in a ~ literal's run, counting from its ~, the
1620+:: dot that begins a fifth sub-second group is, if the first four are
1621+:: well formed
1622+::
1623+:: Sub-seconds follow a duration's first .. or a date's second, as in
1624+:: ~s1..0000 and ~2026.10.23..14.30.00..0000: groups of four
1625+:: lowercase hex digits joined by dots. Hoon's reader takes any
1626+:: number, and its +yule crashes on a fifth (2.8).
1627+::
1628+++ fifth-group
1629+ |= run=tape
1630+ ^- (unit @ud)
1631+ =/ b=@ ?.(?=([%'~' @ *] run) 0 i.t.run)
1632+ =/ k=@ud
1633+ ?: (is-digit b) 2
1634+ ?:(|(=('d' b) =('h' b) =('m' b) =('s' b)) 1 0)
1635+ ?: =(0 k) ~
1636+ =/ past=(unit [i=@ud cs=tape]) (past-dots k 0 run)
1637+ ?~ past ~
1638+ =/ i=@ud i.u.past
1639+ =/ cs=tape cs.u.past
1640+ =/ g=@ud 1
1641+ |- ^- (unit @ud)
1642+ =/ quad=tape (scag 4 cs)
1643+ ?. &(=(4 (lent quad)) (levy quad is-hex)) ~
1644+ =. cs (slag 4 cs)
1645+ =. i (add 4 i)
1646+ ?. ?=([%'.' *] cs) ~
1647+ ?: =(4 g) `i
1648+ $(g +(g), i +(i), cs t.cs)
1649+::
1650+:: +past-dots: where the text past the k-th .. of cs starts, counting
1651+:: from i, and that text
1652+::
1653+++ past-dots
1654+ |= [k=@ud i=@ud cs=tape]
1655+ ^- (unit [i=@ud cs=tape])
1656+ ?~ cs ~
1657+ ?. &(=('.' i.cs) ?=(^ t.cs) =('.' i.t.cs))
1658+ $(i +(i), cs t.cs)
1659+ ?: =(1 k) `[(add 2 i) t.t.cs]
1660+ $(k (dec k), i (add 2 i), cs t.t.cs)
1661+::
1662+:: +is-time: whether a ~ literal's run starts as a date or a duration
1663+:: does, which Hoon's date code reads (2.8)
1664+::
1665+++ is-time
1666+ |= run=tape
1667+ ^- ?
1668+ ?. ?=([%'~' @ *] run) |
1669+ ?: (is-digit i.t.run) &
1670+ ?& |(=('d' i.t.run) =('h' i.t.run) =('m' i.t.run) =('s' i.t.run))
1671+ ?=([@ @ @ *] run)
1672+ (is-digit i.t.t.run)
1673+ ==
1674+::
14401675:: +ship-stop: how many characters of a ~ literal's run, from its ~,
14411676:: could still begin a ship (2.8)
14421677::
@@ -1554,11 +1789,8 @@
15541789 ^- @t
15551790 =/ kids=(list sexp)
15561791 (weld (turn imports.mod sexp-import) (turn defs.mod sexp-def))
1557− =/ lines=wall
1558− ?~ kids ~["(module)"]
1559− :- "(module"
1560− (close (zing (turn kids |=(k=sexp (render 2 k)))))
1561− (of-wain:format (turn lines crip))
1792+ ?~ kids '(module)'
1793+ (of-wain:format (turn (render kids) crip))
15621794::
15631795:: +show-error: "<file>:<line>:<col>: <message>", the line, a caret
15641796::
@@ -1654,17 +1886,15 @@
16541886 ?~ t.ns (trip i.ns)
16551887 "{(trip i.ns)}.{$(ns t.ns)}"
16561888::
1657−:: +show-lit: a literal as Hoon prints it
1889+:: +show-lit: a literal as written for atoms read by nuck:so, whose
1890+:: printing differs between Hoon versions (@da); terms, loobeans and ~
1891+:: in their one form
16581892::
16591893++ show-lit
16601894 |= l=lit
16611895 ^- tape
16621896 ?- form.l
1663− %number (scow aura.l val.l)
1664− %ship (scow %p val.l)
1665− %date (scow %da val.l)
1666− %duration (scow %dr val.l)
1667− %knot (scow %ta val.l)
1897+ ?(%number %ship %date %duration %knot) (trip txt.l)
16681898 %loobean ?:(=(0 val.l) "%.y" "%.n")
16691899 %null "~"
16701900 %term
@@ -1726,20 +1956,57 @@
17261956 [%node head=tape kids=(list sexp)]
17271957 ==
17281958::
1729−:: +render: a node as lines, at an indent
1959+:: +render: a module's kids as the tree's lines (4.2)
17301960::
1731−:: On one line when every kid is a leaf: an atom, or a node whose kids
1732−:: are all atoms (a string's text, a path's knots). Else each kid on
1733−:: its own lines, two spaces deeper.
1961+:: A node whose kids are all leaves goes on one line; else its head,
1962+:: then each kid a level deeper, and its ) at the end of its last
1963+:: kid's last line; (module …) always breaks. Each line is built once,
1964+:: from its depth: a line deeper than 64 levels keeps 64 levels'
1965+:: indent and says its depth, as |65| (group 3:1 …), so printing is
1966+:: linear in the tree's size however deep it nests.
17341967::
17351968++ render
1736− |= [ind=@ud s=sexp]
1969+ |= kids=(list sexp)
17371970 ^- wall
1738− =/ pad=tape (reap ind ' ')
1739− ?: ?=(%atom -.s) ~[(weld pad p.s)]
1740− ?: (levy kids.s is-leaf) ~[(weld pad (flat s))]
1741− :- "{pad}({head.s}"
1742− (close (zing (turn kids.s |=(k=sexp (render (add ind 2) k)))))
1971+ =/ acc=(list pline) ~[[0 "(module" 0]]
1972+ =. acc
1973+ |- ^- (list pline)
1974+ ?~ kids acc
1975+ $(kids t.kids, acc (put-sexp 1 i.kids acc))
1976+ (flop (turn (shut-last acc) show-pline))
1977+::
1978+:: +pline: a printed line: its depth, its text, and how many )s end it
1979+::
1980++$ pline [dep=@ud txt=tape shut=@ud]
1981+::
1982+:: +put-sexp: a node's lines at depth dep, last first, onto acc
1983+::
1984+++ put-sexp
1985+ |= [dep=@ud s=sexp acc=(list pline)]
1986+ ^- (list pline)
1987+ ?: ?=(%atom -.s) [[dep p.s 0] acc]
1988+ ?: (levy kids.s is-leaf) [[dep (flat s) 0] acc]
1989+ =/ ks=(list sexp) kids.s
1990+ =. acc [[dep "({head.s}" 0] acc]
1991+ |- ^- (list pline)
1992+ ?~ ks (shut-last acc)
1993+ $(ks t.ks, acc (put-sexp +(dep) i.ks acc))
1994+::
1995+:: +shut-last: one more ) at the end of the last line
1996+::
1997+++ shut-last
1998+ |= acc=(list pline)
1999+ ^- (list pline)
2000+ ?~ acc ~
2001+ [i.acc(shut +(shut.i.acc)) t.acc]
2002+::
2003+++ show-pline
2004+ |= l=pline
2005+ ^- tape
2006+ =/ pad=tape
2007+ ?: (lte dep.l 64) (reap (mul 2 dep.l) ' ')
2008+ "{(reap 128 ' ')}|{(a-co:co dep.l)}| "
2009+ :(weld pad txt.l (reap shut.l ')'))
17432010::
17442011++ is-leaf
17452012 |= s=sexp
@@ -1753,15 +2020,6 @@
17532020 ?: ?=(%atom -.s) p.s
17542021 "({head.s}{(zing (turn kids.s |=(k=sexp (weld " " (flat k)))))})"
17552022::
1756−:: +close: end the last line with )
1757−::
1758−++ close
1759− |= w=wall
1760− ^- wall
1761− ?~ w ~
1762− ?~ t.w ~[(weld i.w ")")]
1763− [i.w $(w t.w)]
1764−::
17652023:: +nod: a node's sexp: "kind line:col extra" and its kids
17662024::
17672025++ nod
@@ -1927,49 +2185,195 @@
19272185::
19282186:: +fail: the error "expected <want>, found <the next token>"
19292187::
1930−:: At an error token, the layout pass's error instead (2.0). The token
1931−:: list always ends with NEWLINE or an error token (2.5), and the
1932−:: parser stops at either, so it never runs out; if it did, the error
1933−:: would sit at 1:1.
2188+:: At the layout pass's error instead (+lexer-error). The token list
2189+:: always ends with NEWLINE or an error token (2.5), and the parser
2190+:: stops at either, so it never runs out; if it did, the error would
2191+:: sit at 1:1.
19342192::
19352193++ fail
19362194 |= [file=path toks=(list token) want=tape]
19372195 ^- [%| p=error]
19382196 ?~ toks [%| file 1 1 "expected {want}, found the end of the tokens"]
1939− ?: ?=([%error *] lex.i.toks)
1940− [%| file line.beg.at.i.toks col.beg.at.i.toks p.lex.i.toks]
2197+ =/ lex=(unit error) (lexer-error file toks)
2198+ ?^ lex [%| u.lex]
19412199 =/ l=loc (where i.toks)
19422200 [%| file line.l col.l "expected {want}, found {(show-found i.toks)}"]
19432201::
1944−:: +fail-space: a tight form found a space before its next token
2202+:: +lexer-error: the layout pass's error, where the parser fails at it
19452203::
1946−:: The error sits where the space starts, just past prev, the token
1947−:: that needs its next one at once (section 3, Errors). If the next
1948−:: token is a layout or error token, it is +fail's error instead.
2204+:: At an error token, its error. At layout tokens followed by an error
2205+:: token whose text begins the line, both errors point at the line's
2206+:: start (+where), and the layout pass's message, about that text,
2207+:: says more: a line `==` closing a ?- is "the closer `==` is left
2208+:: out", not "expected the end of the body".
2209+::
2210+++ lexer-error
2211+ |= [file=path toks=(list token)]
2212+ ^- (unit error)
2213+ ?~ toks ~
2214+ ?: ?=([%error *] lex.i.toks)
2215+ `[file line.beg.at.i.toks col.beg.at.i.toks p.lex.i.toks]
2216+ ?. (is-layout i.toks) ~
2217+ =/ l=loc (where i.toks)
2218+ =/ rest=(list token) t.toks
2219+ |- ^- (unit error)
2220+ ?~ rest ~
2221+ ?: (is-layout i.rest) $(rest t.rest)
2222+ ?. ?=([%error *] lex.i.rest) ~
2223+ ?. =(l from.lex.i.rest) ~
2224+ `[file line.l col.l p.lex.i.rest]
2225+::
2226+:: +fail-in: +fail where the next token begins a place, such as an
2227+:: expression or a mold, whose first character is one of the mask can
2228+::
2229+:: The error points at the first character where the text stops being
2230+:: the start of any valid module (2.0), so at a token the place can't
2231+:: take, just past the part of it the place could: none if the place
2232+:: can't begin with its first character; a wing's first name, as in
2233+:: `++ a.b`, where a name goes; else that first character, as the ~ of
2234+:: ~zod where a mold goes (~ alone is one). At an error token whose
2235+:: text begins with a character the place can't, the error moves to
2236+:: that character, with the layout pass's message: `++ x @sd` fails
2237+:: at the @, since no expression begins with @, while `+$ x @sd`
2238+:: fails at the s.
2239+::
2240+++ fail-in
2241+ |= [file=path toks=(list token) want=tape can=@]
2242+ ^- [%| p=error]
2243+ ?~ toks (fail file toks want)
2244+ =* t i.toks
2245+ ?: ?=([%error *] lex.t)
2246+ :: a : could begin a comment anywhere, which this leaves out
2247+ ?: |(=(':' c.lex.t) (in c.lex.t can)) (fail file toks want)
2248+ [%| (moved file want t)]
2249+ ?: (is-layout t) (fail file toks want)
2250+ =/ n=@ud (prefix t can)
2251+ =/ e=[%| p=error] (fail file toks want)
2252+ e(col.p (add n col.p.e))
2253+::
2254+:: +prefix: how many of the first characters of a token that a place
2255+:: can't take could still begin it, the place beginning with a
2256+:: character of the mask can (+fail-in)
2257+::
2258+++ prefix
2259+ |= [t=token can=@]
2260+ ^- @ud
2261+ ?. (in (first-char t) can) 0
2262+ ?. ?=([%wing *] lex.t) 1
2263+ ?~(p.lex.t 1 (met 3 i.p.lex.t))
2264+::
2265+:: +first-char: a token's first character, or one like it: a number
2266+:: begins with a digit, ~zod with ~ and %add with %
2267+::
2268+++ first-char
2269+ |= t=token
2270+ ^- @
2271+ =/ x=lexeme lex.t
2272+ ?@ x ?:(?=(?(%indent %dedent %newline) x) 0 (end 3 x))
2273+ ?- -.x
2274+ %name (end 3 p.x)
2275+ %wing ?~(p.x 0 (end 3 i.p.x))
2276+ %str '"'
2277+ %str-head '"'
2278+ %str-mid '}'
2279+ %str-tail '}'
2280+ %knot (end 3 p.x)
2281+ %aura '@'
2282+ %tvar (end 3 p.x)
2283+ %error c.x
2284+ ::
2285+ %lit
2286+ ?- form.p.x
2287+ %number '0'
2288+ ?(%term %loobean) '%'
2289+ ?(%ship %date %duration %knot %null) '~'
2290+ ==
2291+ ==
2292+::
2293+:: +fail-space: a tight form found no next token right after prev
2294+::
2295+:: The error sits just past prev, the token that needs its next one
2296+:: at once, where the space or the end of the line starts (section 3,
2297+:: Errors): no deeper line can supply a tight form's next token. So
2298+:: does an error token past a space or on a later line, whose error
2299+:: comes after. A tight error token's text begins right after prev,
2300+:: and its error is +fail's. why is a hint, if not empty.
19492301::
19502302++ fail-space
1951− |= [file=path prev=token toks=(list token) want=tape]
2303+ |= [file=path prev=token toks=(list token) want=tape why=tape]
19522304 ^- [%| p=error]
1953− ?: ?| ?=(~ toks)
1954− ?=(?(%indent %dedent %newline) lex.i.toks)
1955− ?=([%error *] lex.i.toks)
1956− ==
2305+ =/ at=loc end.at.prev
2306+ ?: &(?=(^ toks) ?=([%error *] lex.i.toks) =(at from.lex.i.toks))
19572307 (fail file toks want)
1958− :+ %| file
1959− :+ line.end.at.prev col.end.at.prev
1960− "expected {want} right after {(show-found prev)}, found a space"
2308+ =/ found=tape
2309+ ?~ toks "the end of the file"
2310+ =* t i.toks
2311+ ?: (is-layout t)
2312+ ?:(=(beg.at.t end.at.t) "the end of the file" "the end of the line")
2313+ ?: &(?=([%error *] lex.t) !=(line.at line.from.lex.t))
2314+ "the end of the line"
2315+ "a space"
2316+ =/ msg=tape
2317+ "expected {want} right after {(show-found prev)}, found {found}"
2318+ [%| file line.at col.at ?~(why msg "{msg}; {why}")]
19612319::
19622320:: +fail-why: +fail with a hint after its message, "; <why>"
19632321::
1964−:: The layout pass's error, at an error token, stays as it is (2.0).
2322+:: The layout pass's error (+lexer-error) stays as it is (2.0).
19652323::
19662324++ fail-why
19672325 |= [file=path toks=(list token) want=tape why=tape]
19682326 ^- [%| p=error]
19692327 =/ e=[%| p=error] (fail file toks want)
2328+ ?^ (lexer-error file toks) e
2329+ e(msg.p (weld msg.p.e "; {why}"))
2330+::
2331+:: +fail-in-why: +fail-in with a hint, as +fail-why
2332+::
2333+++ fail-in-why
2334+ |= [file=path toks=(list token) want=tape can=@ why=tape]
2335+ ^- [%| p=error]
2336+ =/ e=[%| p=error] (fail-in file toks want can)
19702337 ?: &(?=(^ toks) ?=([%error *] lex.i.toks)) e
2338+ ?^ (lexer-error file toks) e
19712339 e(msg.p (weld msg.p.e "; {why}"))
19722340::
2341+:: +tight-error: the error at an error token tight after an operand or
2342+:: an item, if its text's first character can't go there: the layout
2343+:: pass's message, at that character (+fail-in)
2344+::
2345+:: What may go tight after an item is a closer, a comment's :, or,
2346+:: after a name, the ( . + or = of a change, a wing, a pair or a face
2347+:: (after-mask, which doesn't look at what the item was).
2348+::
2349+++ tight-error
2350+ |= [file=path toks=(list token)]
2351+ ^- (unit error)
2352+ (tight-error-in file toks after-mask)
2353+::
2354+:: +tight-error-in: +tight-error where what may go tight is can, as no
2355+:: = goes tight after a call's operand, which takes no face
2356+::
2357+++ tight-error-in
2358+ |= [file=path toks=(list token) can=@]
2359+ ^- (unit error)
2360+ ?. ?=([[* %& [%error *]] *] toks) ~
2361+ ?: (in c.lex.i.toks can) ~
2362+ `(moved file "a space between items" i.toks)
2363+::
2364+:: +moved: an error token's error, moved to the first character of the
2365+:: text it was reading, which can't go where it is (+fail-in): "expected
2366+:: <want>, found <that character>; <the layout pass's message>"
2367+::
2368+++ moved
2369+ |= [file=path want=tape t=token]
2370+ ^- error
2371+ ?. ?=([%error *] lex.t) [file line.beg.at.t col.beg.at.t "expected {want}"]
2372+ =* x lex.t
2373+ ?: =(from.x beg.at.t) [file line.from.x col.from.x p.x]
2374+ =/ what=tape ?:(=('"' c.x) "a string" "`{[c.x ~]}`")
2375+ [file line.from.x col.from.x "expected {want}, found {what}; {p.x}"]
2376+::
19732377:: Token tests for the parser
19742378::
19752379:: +is-layout: INDENT, DEDENT or NEWLINE
@@ -2001,6 +2405,28 @@
20012405 ?=([%error *] lex.t)
20022406 ==
20032407::
2408+:: +tail-can: what may begin text that goes on, on its line, after an
2409+:: expression: more operands after a call, nothing after !! (+bad-end-in)
2410+::
2411+++ tail-can
2412+ |= e=expr
2413+ ^- @
2414+ ?+ -.e operand-mask
2415+ %crash 0
2416+ %cast $(e val.e)
2417+ %gate $(e body.e)
2418+ ==
2419+::
2420+:: +def-can: +tail-can after a definition: nothing after a mold
2421+::
2422+++ def-can
2423+ |= d=def
2424+ ^- @
2425+ ?- -.d
2426+ %mold 0
2427+ %value (tail-can val.d)
2428+ ==
2429+::
20042430:: +is-operand-start: a token an operand starts with; where an operand
20052431:: goes, |= is the constructor's (section 3)
20062432::
@@ -2093,10 +2519,11 @@
20932519:: (section 3), so it never backtracks. A loop over items is a trap
20942520:: whose every step, through +then, is a tail call, so a long module
20952521:: grows no stack; only nesting does, and a line's nesting is bounded
2096−:: by its length.
2522+:: by its length. all is the whole token list, which only errors
2523+:: read (+stray).
20972524::
20982525++ parser
2099− |_ file=path
2526+ |_ [file=path all=(list token)]
21002527 ::
21012528 :: +bad: "expected <want>, found <the next token>" (+fail)
21022529 ::
@@ -2112,82 +2539,161 @@
21122539 ^- [%| p=error]
21132540 (fail-why file ts want why)
21142541 ::
2115− :: +bad-space: a tight form that found a space after prev
2542+ :: +bad-in: +bad where a place begins whose first characters are the
2543+ :: mask can (+fail-in)
2544+ ::
2545+ ++ bad-in
2546+ |= [ts=(list token) want=tape can=@]
2547+ ^- [%| p=error]
2548+ (fail-in file ts want can)
2549+ ::
2550+ :: +bad-in-why: +bad-in with a hint (+fail-in-why)
2551+ ::
2552+ ++ bad-in-why
2553+ |= [ts=(list token) want=tape can=@ why=tape]
2554+ ^- [%| p=error]
2555+ (fail-in-why file ts want can why)
2556+ ::
2557+ :: +bad-space: a tight form that found no next token right after prev
21162558 :: (+fail-space)
21172559 ::
21182560 ++ bad-space
21192561 |= [prev=token ts=(list token) want=tape]
21202562 ^- [%| p=error]
2121− (fail-space file prev ts want)
2563+ (fail-space file prev ts want "")
21222564 ::
2123− :: +bad-at: an error inside a token (section 3, Errors)
2565+ :: +bad-at: an error inside a token, or at the end of a line
21242566 ::
21252567 ++ bad-at
21262568 |= [at=loc msg=tape]
21272569 ^- [%| p=error]
21282570 [%| file line.at col.at msg]
21292571 ::
2130− :: +bad-end: a line that should end and goes on
2572+ :: +closing: what a bracket op still needs, its closer close
2573+ ::
2574+ ++ closing
2575+ |= [op=token close=tape]
2576+ ^- tape
2577+ "`{close}` to close the {(show-found op)} at {(show-loc beg.at.op)}"
2578+ ::
2579+ :: +bad-end: a line that should end and goes on, after a call
21312580 ::
21322581 ++ bad-end
21332582 |= ts=(list token)
21342583 ^- [%| p=error]
2135− ?. ?=([[* * %indent] *] ts) (bad ts "the end of the line")
2136− %^ bad-why ts "the end of the line"
2137− %+ weld "only a bracket open at the end of a line, "
2138− "or a rune's body, takes deeper lines"
2584+ (bad-end-in ts operand-mask)
2585+ ::
2586+ :: +bad-end-in: +bad-end after a construct that text beginning with
2587+ :: a character of the mask can could still go on, as more operands go
2588+ :: on a call; at an error token whose text can't, at that text's
2589+ :: start (+fail-in): +$ x @ ?: fails at the ?
2590+ ::
2591+ ++ bad-end-in
2592+ |= [ts=(list token) can=@]
2593+ ^- [%| p=error]
2594+ =/ want=tape "the end of the line"
2595+ ?: ?=([[* * %indent] *] ts)
2596+ %^ bad-why ts want
2597+ %+ weld "only a bracket open at the end of a line, "
2598+ "or a rune's body, takes deeper lines"
2599+ ?: &(?=(^ ts) (stray i.ts))
2600+ (bad-why ts want "this {(show-found i.ts)} closes no bracket")
2601+ ?. ?=([[* * [%error *]] *] ts) (bad ts want)
2602+ =/ ok=@ ?:(tight.i.ts after-mask can)
2603+ ?: |(=(':' c.lex.i.ts) (in c.lex.i.ts ok)) (bad ts want)
2604+ [%| (moved file want i.ts)]
2605+ ::
2606+ :: +no-gap: a token tight where a space goes, after a rune, a name, a
2607+ :: sample or a pattern; at an error token, whose text can't go tight
2608+ :: there unless it is a comment's :, at that text's start (+fail-in)
2609+ ::
2610+ ++ no-gap
2611+ |= [ts=(list token) want=tape]
2612+ ^- [%| p=error]
2613+ ?. &(?=([[* * [%error *]] *] ts) !=(':' c.lex.i.ts)) (bad ts want)
2614+ [%| (moved file want i.ts)]
21392615 ::
21402616 :: +no-space: a token tight after an item, where a space goes
21412617 ::
21422618 ++ no-space
21432619 |= ts=(list token)
21442620 ^- [%| p=error]
2621+ =/ te=(unit error) (tight-error file ts)
2622+ ?^ te [%| u.te]
21452623 ?. ?=([[* * %'='] *] ts) (bad ts "a space between items")
21462624 %^ bad-why ts "a space between items"
21472625 "`name=value` goes in a cell, as [a=1], or a change, as m(a=1)"
21482626 ::
2149− :: +no-operand: a token where an operand goes that starts none, with
2150− :: a hint for the left-out forms the lexer can't see (2.6)
2627+ :: +no-space-pattern: +no-space in a cell pattern
21512628 ::
2152− ++ no-operand
2629+ ++ no-space-pattern
21532630 |= ts=(list token)
21542631 ^- [%| p=error]
2632+ ?. ?=([[* * %'='] *] ts) (no-space ts)
2633+ %^ bad-why ts "a space between items"
2634+ "patterns take no `name=`: a bare name binds, as [a b]"
2635+ ::
2636+ :: +no-operand: a token where an expression or an operand goes that
2637+ :: starts none (can: what may start one), with a hint for the left-out
2638+ :: forms the lexer can't see (2.6) and other likely slips
2639+ ::
2640+ ++ no-operand
2641+ |= [ts=(list token) can=@]
2642+ ^- [%| p=error]
21552643 =/ want=tape "an expression"
21562644 ?: ?=([[* * %'='] [* %& %'('] *] ts)
21572645 (bad-why ts want "`=(a b)` is left out: eq is a gate")
21582646 ?: ?=([[* * %'='] [* %& %'/'] *] ts)
21592647 (bad-why ts want "`=/` is left out: `++` defines values")
2648+ ?: ?=([[* * %'='] [* %& %'+'] *] ts)
2649+ (bad-why ts want "`=+` is left out: `++` defines values")
2650+ ?: ?=([[* * %'='] [* %& %'?'] *] ts)
2651+ (bad-why ts want "`=?` is left out: `++` defines values")
2652+ ?: ?& ?=([[* * %'='] [* %& [%error *]] *] ts)
2653+ =('.' c.lex.i.t.ts)
2654+ ==
2655+ (bad-why ts want "`=.` is left out: `++` defines values")
21602656 ?: ?=([[* * %'*'] *] ts)
21612657 (bad-why ts want "`*mold` is left out: no defaults")
21622658 ?: ?=([[* * %'+'] *] ts)
21632659 (bad-why ts want "a pair takes no spaces, as gap+%s2")
2660+ ?: ?=([[* * %'?'] *] ts)
2661+ %: bad-in-why ts want can
2662+ "`?` alone is the loobean mold, and `?-` the branch"
2663+ ==
21642664 ?: &(?=(^ ts) (is-rune i.ts))
2165− (bad-why ts want "a rune here goes in parentheses")
2166− (bad ts want)
2665+ (bad-in-why ts want can "a rune here goes in parentheses")
2666+ ?: &(?=(^ ts) (stray i.ts))
2667+ (bad-why ts want "this {(show-found i.ts)} closes no bracket")
2668+ (bad-in ts want can)
2669+ ::
2670+ :: +no-name: a token where a name goes that isn't one
2671+ ::
2672+ ++ no-name
2673+ |= ts=(list token)
2674+ ^- [%| p=error]
2675+ ?: ?=([[* * [%tvar *]] *] ts)
2676+ (bad-why ts "a name" "a name starts with a lowercase letter")
2677+ ?: ?=([[* * [%wing *]] *] ts)
2678+ (bad-in-why ts "a name" lower-mask "a name has no `.`")
2679+ (bad-in ts "a name" lower-mask)
21672680 ::
21682681 :: +unclosed: where the closer of the bracket op opened should be
21692682 ::
21702683 ++ unclosed
21712684 |= [op=token close=tape ts=(list token)]
21722685 ^- [%| p=error]
2173− =/ want=tape
2174− "`{close}` to close the {(show-found op)} at {(show-loc beg.at.op)}"
2686+ =/ want=tape (closing op close)
21752687 ?. ?=([[* * %indent] *] ts) (bad ts want)
21762688 (bad-why ts want "this bracket closes on its line")
21772689 ::
21782690 :: +unclosed-open: a bracket that may be left open, whose line ends
2179− :: with neither its closer nor deeper lines; last is its last item's
2180− :: span, and noun names its items
2691+ :: with neither its closer nor deeper lines; noun names its items
21812692 ::
21822693 ++ unclosed-open
2183− |= [op=token close=tape noun=tape last=(unit span) ts=(list token)]
2694+ |= [op=token close=tape noun=tape ts=(list token)]
21842695 ^- [%| p=error]
21852696 ?. ?=([[* * ?(%newline %dedent)] *] ts) (unclosed op close ts)
2186− :: its last item ends on a later line: an item left open took them
2187− ?: &(?=(^ last) (gth line.end.u.last line.beg.at.op))
2188− %^ bad-why ts
2189− "`{close}` to close the {(show-found op)} at {(show-loc beg.at.op)}"
2190− "only the last bracket open at the end of a line takes the deeper lines"
21912697 (bad ts "`{close}` or {noun} on a deeper line")
21922698 ::
21932699 :: +wide-rune: a rune followed tight; txt( is a left-out wide form
@@ -2196,7 +2702,7 @@
21962702 |= [txt=tape ts=(list token)]
21972703 ^- [%| p=error]
21982704 =/ want=tape "a space after `{txt}`"
2199− ?. ?=([[* * %'('] *] ts) (bad ts want)
2705+ ?. ?=([[* * %'('] *] ts) (no-gap ts want)
22002706 %^ bad-why ts want
22012707 "the wide form `{txt}(…)` is left out: indentation covers it"
22022708 ::
@@ -2208,6 +2714,62 @@
22082714 %^ bad-why ts "a named item"
22092715 "a change's items are named, as in m(done=%.y)"
22102716 ::
2717+ :: +doomed: where a part of a line, read from ts up to after, took
2718+ :: the deeper lines while what holds it needs more: a closer on the
2719+ :: line, or deeper lines of its own. No later line can give it that,
2720+ :: so the error is at the end of the line that took them (section 3,
2721+ :: Errors). want is what it needs. Only an error path calls this, and
2722+ :: it looks only when after begins with NEWLINE or DEDENT, so it
2723+ :: costs nothing on the way to a tree.
2724+ ::
2725+ ++ doomed
2726+ |= [ts=(list token) after=(list token) want=tape]
2727+ ^- (unit [%| p=error])
2728+ ?. ?=([[* * ?(%newline %dedent)] *] after) ~
2729+ =/ ind=(unit token) (took ts after)
2730+ ?~ ind ~
2731+ :- ~
2732+ %+ bad-at beg.at.u.ind
2733+ ;: weld
2734+ "expected {want}, found the end of the line; the deeper lines "
2735+ "go to the last bracket or rune left open on this line"
2736+ ==
2737+ ::
2738+ :: +took: the INDENT among the tokens from ts up to after, if any
2739+ ::
2740+ ++ took
2741+ |= [ts=(list token) after=(list token)]
2742+ ^- (unit token)
2743+ ?~ after ~
2744+ =/ stop=loc beg.at.i.after
2745+ |- ^- (unit token)
2746+ ?~ ts ~
2747+ ?. (loc-lth beg.at.i.ts stop) ~
2748+ ?: ?=(%indent lex.i.ts) `i.ts
2749+ $(ts t.ts)
2750+ ::
2751+ :: +stray: whether a ) or ] closes no bracket opened before it on its
2752+ :: line, or none inside the interpolation it is in
2753+ ::
2754+ ++ stray
2755+ |= t=token
2756+ ^- ?
2757+ ?. ?=(?(%')' %']') lex.t) |
2758+ =| open=(list ?)
2759+ =/ ts=(list token) all
2760+ |- ^- ?
2761+ ?~ ts |
2762+ =* u i.ts
2763+ ?: =(at.u at.t) |(?=(~ open) !i.open)
2764+ ?: (is-layout u) $(ts t.ts, open ~)
2765+ ?: ?=(?(%'(' %'[' %'~[' %'|=(' %'$?(' %'$-(') lex.u)
2766+ $(ts t.ts, open [& open])
2767+ ?: ?=([%str-head *] lex.u) $(ts t.ts, open [| open])
2768+ ?: ?=([%str-mid *] lex.u) $(ts t.ts, open [| ?~(open ~ t.open)])
2769+ ?: |(?=(?(%')' %']') lex.u) ?=([%str-tail *] lex.u))
2770+ $(ts t.ts, open ?~(open ~ t.open))
2771+ $(ts t.ts)
2772+ ::
22112773 :: +read-module: { import NEWLINE } { definition NEWLINE }, then the
22122774 :: end of the tokens
22132775 ::
@@ -2218,15 +2780,17 @@
22182780 |- ^- (each module error)
22192781 ?: ?=([[* * ?(%'/-' %'/%' %'/=')] *] ts)
22202782 ;< [im=import after=(list token)] then (read-import ts)
2221− ?. ?=([[* * %newline] *] after) (bad-end after)
2783+ ?. ?=([[* * %newline] *] after) (bad-end-in after 0)
22222784 $(ims [im ims], ts t.after)
22232785 =| defs=(list def)
22242786 |- ^- (each module error)
22252787 ?~ ts [%& (flop ims) (flop defs)]
22262788 ?: ?=([[* * ?(%'/-' %'/%' %'/=')] *] ts)
22272789 (bad-why ts "a definition" "imports come first")
2228− ;< [d=def after=(list token)] then (read-def ts)
2229− ?. ?=([[* * %newline] *] after) (bad-end after)
2790+ :: what may begin the line: a definition, or before any, an import
2791+ =/ can=@ ?~(defs (con plus-mask fas-mask) plus-mask)
2792+ ;< [d=def after=(list token)] then (read-def ts can)
2793+ ?. ?=([[* * %newline] *] after) (bad-end-in after (def-can d))
22302794 $(defs [d defs], ts t.after)
22312795 ::
22322796 :: +read-import: /- name, /% term, or /= name pathlit
@@ -2238,34 +2802,36 @@
22382802 =* g i.ts
22392803 =/ rest=(list token) t.ts
22402804 ?: &(?=(^ rest) tight.i.rest)
2241− (bad rest "a space after {(show-found g)}")
2805+ (no-gap rest "a space after {(show-found g)}")
22422806 ?: =(%'/%' lex.g)
22432807 ?: ?=([[* * [%lit %term %tas *]] *] rest)
22442808 [%& [%mark [beg.at.g end.at.i.rest] val.p.lex.i.rest] t.rest]
22452809 =/ want=tape "a mark's term, as `%todo-action`"
2246− ?. ?=([[* * [%name *]] *] rest) (bad rest want)
2810+ ?. ?=([[* * [%name *]] *] rest) (bad-in rest want cen-mask)
22472811 (bad-why rest want "`/%` takes no face: it names the type after its mark")
2248− ?. ?=([[* * [%name *]] *] rest) (bad rest "a name")
2812+ ?. ?=([[* * [%name *]] *] rest) (no-name rest)
22492813 =* nam i.rest
22502814 ?. =(%'/=' lex.g)
22512815 [%& [%sur [beg.at.g end.at.nam] p.lex.nam] t.rest]
22522816 =/ more=(list token) t.rest
2253− ?: &(?=(^ more) tight.i.more) (bad more "a space after the name")
2817+ ?: &(?=(^ more) tight.i.more) (no-gap more "a space after the name")
22542818 ?. ?=([[* * %'/'] *] more)
2255− (bad more "a module's path, as /ui/components/card")
2819+ (bad-in more "a module's path, as /ui/components/card" fas-mask)
22562820 ;< [[sp=span segs=(list @ta)] after=(list token)] then
2257− (read-pathlit i.more t.more)
2821+ (read-pathlit i.more t.more |)
22582822 [%& [%jibb [beg.at.g end.sp] p.lex.nam segs] after]
22592823 ::
22602824 :: +read-pathlit: after a path's /, its knots, each after a tight /
2261− :: and tight itself; / alone is the empty path
2825+ :: and tight itself; / alone is the empty path where empty allows it,
2826+ :: in an expression but not an import (doc question)
22622827 ::
22632828 ++ read-pathlit
2264− |= [sl=token ts=(list token)]
2829+ |= [sl=token ts=(list token) empty=?]
22652830 ^- (pare [span (list @ta)])
22662831 ?. ?=([[* %& [%knot *]] *] ts)
22672832 ?: &(?=(^ ts) tight.i.ts !(is-closer i.ts))
22682833 (bad ts "a path segment")
2834+ ?. empty (bad-space sl ts "a path segment")
22692835 [%& [at.sl ~] ts]
22702836 =/ segs=(list @ta) ~[p.lex.i.ts]
22712837 =/ fin=loc end.at.i.ts
@@ -2280,10 +2846,11 @@
22802846 (bad-space i.rest nex "a path segment")
22812847 ::
22822848 :: +read-def: ++ name, then an expression or a body; +$ name, then a
2283− :: mold on its line or alone on a deeper one
2849+ :: mold on its line or alone on a deeper one. can is what may begin
2850+ :: a line where a definition goes (+fail-in).
22842851 ::
22852852 ++ read-def
2286− |= ts=(list token)
2853+ |= [ts=(list token) can=@]
22872854 ^- (pare def)
22882855 ?~ ts (bad ts "a definition")
22892856 =* rune i.ts
@@ -2295,18 +2862,23 @@
22952862 ?: (is-closer rune)
22962863 %^ bad-why ts "a definition"
22972864 "this closes no bracket, as one open at the end of its line needs none"
2298− ?. =(%'+$' lex.rune) (bad ts "a definition")
2865+ =/ want=tape
2866+ ?.((in '/' can) "a definition" "an import or a definition")
2867+ ?: =(%'+' lex.rune)
2868+ (bad-in-why ts want can "`+` begins `++` or `+$`")
2869+ ?. =(%'+$' lex.rune) (bad-in ts want can)
22992870 ;< [nam=term after=(list token)] then (read-def-name rune t.ts)
23002871 ?: ?=([[* * %indent] *] after)
23012872 ;< [s=shape more=(list token)] then (read-mold t.after)
23022873 ?: ?=([[* * %dedent] *] more)
23032874 [%& [%mold [beg.at.rune end:(span-of s)] nam s] t.more]
2304− ?. ?=([[* * %newline] *] more) (bad-end more)
2875+ ?. ?=([[* * %newline] *] more) (bad-end-in more 0)
23052876 %^ bad-why more "the end of the mold"
23062877 "a `+$` takes one mold; a union is `$?` with its cases below"
23072878 ?: ?=([[* * ?(%newline %dedent)] *] after)
23082879 (bad after "a mold, on its line or a deeper one")
2309− ?: &(?=(^ after) tight.i.after) (bad after "a space after the name")
2880+ ?: &(?=(^ after) tight.i.after)
2881+ (no-gap after "a space after the name")
23102882 ;< [s=shape more=(list token)] then (read-mold after)
23112883 [%& [%mold [beg.at.rune end:(span-of s)] nam s] more]
23122884 ::
@@ -2316,8 +2888,8 @@
23162888 |= [rune=token ts=(list token)]
23172889 ^- (pare term)
23182890 ?: &(?=(^ ts) tight.i.ts)
2319− (bad ts "a space after {(show-found rune)}")
2320− ?. ?=([[* * [%name *]] *] ts) (bad ts "a name")
2891+ (no-gap ts "a space after {(show-found rune)}")
2892+ ?. ?=([[* * [%name *]] *] ts) (no-name ts)
23212893 [%& p.lex.i.ts t.ts]
23222894 ::
23232895 :: +read-expr-or-body: a space and an expression on the line, or a
@@ -2329,7 +2901,7 @@
23292901 ?: ?=([[* * %indent] *] ts) (read-body t.ts)
23302902 ?: ?=([[* * ?(%newline %dedent)] *] ts)
23312903 (bad ts "an expression, or a body on deeper lines")
2332− ?: &(?=(^ ts) tight.i.ts) (bad ts "a space after {what}")
2904+ ?: &(?=(^ ts) tight.i.ts) (no-gap ts "a space after {what}")
23332905 (read-expr ts)
23342906 ::
23352907 :: +read-body: after its INDENT, { definition NEWLINE } expr DEDENT
@@ -2340,16 +2912,20 @@
23402912 =| defs=(list def)
23412913 |- ^- (pare expr)
23422914 ?: ?=([[* * ?(%'++' %'+$')] *] ts)
2343− ;< [d=def after=(list token)] then (read-def ts)
2915+ ;< [d=def after=(list token)] then (read-def ts plus-mask)
23442916 ?: ?=([[* * %newline] *] after) $(defs [d defs], ts t.after)
2345− ?. ?=([[* * %dedent] *] after) (bad-end after)
2917+ ?. ?=([[* * %dedent] *] after) (bad-end-in after (def-can d))
23462918 (bad after "the body's final expression, after its definitions")
2919+ ?: ?=([[* * %'+'] *] ts)
2920+ %: bad-in-why ts "a definition or an expression" plus-mask
2921+ "`+` begins `++` or `+$`"
2922+ ==
23472923 ;< [e=expr after=(list token)] then (read-expr ts)
23482924 ?: ?=([[* * %dedent] *] after)
23492925 =/ ds=(list def) (flop defs)
23502926 =/ beg=loc ?~(ds beg:(span-of e) beg:(span-of i.ds))
23512927 [%& [%body [beg end:(span-of e)] ds e] t.after]
2352− ?. ?=([[* * %newline] *] after) (bad-end after)
2928+ ?. ?=([[* * %newline] *] after) (bad-end-in after (tail-can e))
23532929 %^ bad-why after "the end of the body"
23542930 "a body's final expression is its last line"
23552931 ::
@@ -2374,7 +2950,7 @@
23742950 |= ts=(list token)
23752951 ^- (pare expr)
23762952 ;< [els=(list expr) after=(list token)] then (read-operands ts)
2377− ?~ els (no-operand ts)
2953+ ?~ els (no-operand ts expr-mask)
23782954 [%& (call-of els) after]
23792955 ::
23802956 :: +read-operands: a call's operands, or those on a group's first
@@ -2387,15 +2963,27 @@
23872963 |- ^- (pare (list expr))
23882964 ?~ ts [%& (flop els) ts]
23892965 =* t i.ts
2390− ?: (ends-call t) [%& (flop els) ts]
2966+ ?: (ends-call t)
2967+ :: an error token whose text can't go tight after an operand
2968+ =/ te=(unit error)
2969+ :: after-mask without its =
2970+ ?~(els ~ (tight-error-in file ts (mix after-mask tis-mask)))
2971+ ?^ te [%| u.te]
2972+ :: or, past a space, can't begin one (+fail-in)
2973+ ?: ?& ?=(^ els) ?=([%error *] lex.t) !tight.t
2974+ !=(':' c.lex.t) !(in c.lex.t operand-mask)
2975+ ==
2976+ [%| (moved file "an expression" t)]
2977+ [%& (flop els) ts]
23912978 ?: &(tight.t ?=(^ els)) (no-space ts)
23922979 ?: (is-operand-start t)
23932980 ;< [e=expr more=(list token)] then (read-operand ts)
23942981 $(els [e els], ts more)
23952982 ?: &(?=(^ els) (is-rune t))
2396− %^ bad-why ts "an expression"
2397− "inside a call, a rune goes in parentheses"
2398− (no-operand ts)
2983+ %: bad-in-why ts "an expression" operand-mask
2984+ "inside a call, a rune goes in parentheses"
2985+ ==
2986+ (no-operand ts ?~(els expr-mask operand-mask))
23992987 ::
24002988 :: +read-operand: one operand, told by its first token and, after a
24012989 :: name or a wing, by a tight ( or +
@@ -2405,7 +2993,7 @@
24052993 ^- (pare expr)
24062994 ?~ ts (bad ts "an expression")
24072995 =* t i.ts
2408− ?+ lex.t (no-operand ts)
2996+ ?+ lex.t (no-operand ts operand-mask)
24092997 [%lit *] [%& [%lit at.t p.lex.t] t.ts]
24102998 [%str *] [%& [%str at.t (text-piece p.lex.t)] t.ts]
24112999 [%str-head *] (read-string t t.ts)
@@ -2454,11 +3042,19 @@
24543042 ::
24553043 :: +read-ctor: |= and a term, with no space: a case's constructor
24563044 ::
3045+ :: Where an operand goes, |= can only be a constructor or begin |=(,
3046+ :: so a tall gate there fails at the space after |=.
3047+ ::
24573048 ++ read-ctor
24583049 |= [bar=token ts=(list token)]
24593050 ^- (pare expr)
2460− ?: |(?=(~ ts) !tight.i.ts) (bad-space bar ts "a term")
2461− ?. ?=([[* * [%lit %term *]] *] ts) (bad ts "a term")
3051+ ?: |(?=(~ ts) !tight.i.ts)
3052+ %: fail-space file bar ts "`(` or a term"
3053+ ?: ?=([[* * [%lit %term *]] *] ts)
3054+ "a case's constructor takes its term with no space, as |=%got"
3055+ "a gate in an operand is |=(a body)"
3056+ ==
3057+ ?. ?=([[* * [%lit %term *]] *] ts) (bad-in ts "a term" cen-mask)
24623058 [%& [%ctor [beg.at.bar end.at.i.ts] p.lex.i.ts] t.ts]
24633059 ::
24643060 :: +read-path: a path literal, as /posts/~zod (doc question)
@@ -2467,7 +3063,7 @@
24673063 |= [sl=token ts=(list token)]
24683064 ^- (pare expr)
24693065 ;< [[sp=span segs=(list @ta)] after=(list token)] then
2470− (read-pathlit sl ts)
3066+ (read-pathlit sl ts &)
24713067 [%& [%path sp segs] after]
24723068 ::
24733069 :: +read-qath: %/, then its segments, knots or (expr), each after a
@@ -2502,7 +3098,10 @@
25023098 ?. ?=([[* * %'('] *] ts) (bad ts "a path segment")
25033099 =* par i.ts
25043100 ;< [e=expr after=(list token)] then (read-expr t.ts)
2505− ?. ?=([[* * %')'] *] after) (unclosed par ")" after)
3101+ ?. ?=([[* * %')'] *] after)
3102+ =/ dm (doomed t.ts after (closing par ")"))
3103+ ?^ dm u.dm
3104+ (unclosed par ")" after)
25063105 [%& [[%expr e] end.at.i.after] t.after]
25073106 ::
25083107 :: +read-string: after its str-head, a string's interpolations and
@@ -2521,7 +3120,10 @@
25213120 $(ps (weld (text-piece p.lex.i.after) ps), op i.after, ts t.after)
25223121 ?. ?=([[* * [%str-tail *]] *] after)
25233122 =/ brace=loc [line.end.at.op (dec (max 2 col.end.at.op))]
2524− (bad after "`}` to close the `\{` at {(show-loc brace)}")
3123+ =/ want=tape "`}` to close the `\{` at {(show-loc brace)}"
3124+ =/ dm (doomed ts after want)
3125+ ?^ dm u.dm
3126+ (bad after want)
25253127 =. ps (weld (text-piece p.lex.i.after) ps)
25263128 [%& [%str [beg.at.head end.at.i.after] (flop ps)] t.after]
25273129 ::
@@ -2537,15 +3139,19 @@
25373139 ^- (pare expr)
25383140 ?: (is-rune-start ts)
25393141 ;< [e=expr after=(list token)] then (read-expr ts)
2540− ?. ?=([[* * %')'] *] after) (unclosed par ")" after)
3142+ ?. ?=([[* * %')'] *] after)
3143+ =/ dm (doomed ts after (closing par ")"))
3144+ ?^ dm u.dm
3145+ (unclosed par ")" after)
25413146 [%& [%group [beg.at.par end.at.i.after] e] t.after]
25423147 ;< [els=(list expr) after=(list token)] then (read-operands ts)
25433148 ?: ?=([[* * %')'] *] after)
25443149 ?~ els (bad after "an expression")
25453150 [%& [%group [beg.at.par end.at.i.after] (call-of els)] t.after]
25463151 ?. ?=([[* * %indent] *] after)
2547− =/ last=(unit span) ?~(els ~ `(span-of (rear els)))
2548− (unclosed-open par ")" "an argument" last after)
3152+ =/ dm (doomed ts after (closing par ")"))
3153+ ?^ dm u.dm
3154+ (unclosed-open par ")" "an argument" after)
25493155 ;< [ls=(list item) more=(list token)] then
25503156 (read-lines %group t.after)
25513157 =/ inner=expr (call-of (weld els (turn ls |=(i=item val.i))))
@@ -2554,6 +3160,8 @@
25543160 :: +read-bracket: a tuple's, list's or change's items, to its closer
25553161 :: on the line, or to the end of its lines below when left open
25563162 ::
3163+ :: pre is the tokens from the last item on, for +doomed.
3164+ ::
25573165 ++ read-bracket
25583166 |= $: kind=?(%tuple %list %change)
25593167 op=token
@@ -2563,6 +3171,7 @@
25633171 ^- (pare expr)
25643172 =/ close=?(%')' %']') ?:(?=(%change kind) %')' %']')
25653173 =| its=(list item)
3174+ =| pre=(list token)
25663175 |- ^- (pare expr)
25673176 ?~ ts (bad ts "an item")
25683177 =* t i.ts
@@ -2571,15 +3180,16 @@
25713180 ?: (is-closer t) (unclosed op (trip close) ts)
25723181 ?: ?=(%indent lex.t)
25733182 ;< [ls=(list item) more=(list token)] then (read-lines kind t.ts)
2574− =/ all=(list item) (weld (flop its) ls)
2575− =/ fin=loc ?~(all end.at.op end.at:(rear all))
2576− [%& (bracket-node kind op target all fin) more]
3183+ =/ every=(list item) (weld (flop its) ls)
3184+ =/ fin=loc ?~(every end.at.op end.at:(rear every))
3185+ [%& (bracket-node kind op target every fin) more]
25773186 ?: ?=(?(%newline %dedent) lex.t)
2578− =/ last=(unit span) ?~(its ~ `at.i.its)
2579− (unclosed-open op (trip close) "an item" last ts)
3187+ =/ dm (doomed pre ts (closing op (trip close)))
3188+ ?^ dm u.dm
3189+ (unclosed-open op (trip close) "an item" ts)
25803190 ?: &(tight.t ?=(^ its)) (no-space ts)
25813191 ;< [i=item more=(list token)] then (read-item kind ts)
2582− $(its [i its], ts more)
3192+ $(its [i its], ts more, pre ts)
25833193 ::
25843194 :: +read-item: [ name= ] operand; a tuple's item may be named, a
25853195 :: change's must be, a list's is not
@@ -2595,8 +3205,9 @@
25953205 [%& [[beg.at.nam end:(span-of v)] `p.lex.nam v] after]
25963206 ?: ?=(%change kind) (unnamed ts)
25973207 ?: &(?=(^ ts) (is-rune i.ts))
2598− %^ bad-why ts "an expression"
2599− "inside brackets, a rune goes in parentheses"
3208+ %: bad-in-why ts "an expression" operand-mask
3209+ "inside brackets, a rune goes in parentheses"
3210+ ==
26003211 ;< [v=expr after=(list token)] then (read-operand ts)
26013212 [%& [(span-of v) ~ v] after]
26023213 ::
@@ -2611,7 +3222,7 @@
26113222 ;< [l=item after=(list token)] then (read-line kind ts)
26123223 ?: ?=([[* * %newline] *] after) $(ls [l ls], ts t.after)
26133224 ?: ?=([[* * %dedent] *] after) [%& (flop [l ls]) t.after]
2614− ?. ?=([[* * ?(%')' %']')] *] after) (bad-end after)
3225+ ?. ?=([[* * ?(%')' %']')] *] after) (bad-end-in after (tail-can val.l))
26153226 %^ bad-why after "the end of the line"
26163227 "a bracket open at the end of its line takes no closer"
26173228 ::
@@ -2622,6 +3233,10 @@
26223233 ++ read-line
26233234 |= [kind=?(%tuple %list %change %group) ts=(list token)]
26243235 ^- (pare item)
3236+ ?: ?=([[* * ?(%')' %']')] *] ts)
3237+ %^ bad-why ts "an item"
3238+ %+ weld "a bracket open at the end of its line takes no closer: "
3239+ "its items end at the first line that isn't deeper"
26253240 ?: ?& ?=(?(%tuple %change) kind)
26263241 ?=([[* * [%name *]] [* %& %'='] *] ts)
26273242 ==
@@ -2641,17 +3256,22 @@
26413256 ^- (pare expr)
26423257 ;< [s=sample after=(list token)] then (read-sample ts)
26433258 ?: ?=([[* * %')'] *] after) (bad after "the gate's body")
2644− ?: &(?=(^ after) tight.i.after) (bad after "a space after the sample")
3259+ ?: &(?=(^ after) tight.i.after)
3260+ (no-gap after "a space after the sample")
3261+ =/ dm (doomed ts after "the gate's body")
3262+ ?^ dm u.dm
26453263 ?: &(?=(^ after) (is-rune i.after))
2646− %^ bad-why after "an expression"
2647− "the wide gate's body is an operand, so a rune goes in parentheses"
3264+ %: bad-in-why after "an expression" operand-mask
3265+ "the wide gate's body is an operand, so a rune goes in parentheses"
3266+ ==
26483267 ;< [b=expr more=(list token)] then (read-operand after)
26493268 ?: ?=([[* * %')'] *] more)
26503269 [%& [%gate-wide [beg.at.op end.at.i.more] s b] t.more]
3270+ =/ dn (doomed after more (closing op ")"))
3271+ ?^ dn u.dn
26513272 ?. &(?=(^ more) !tight.i.more (is-operand-start i.more))
26523273 (unclosed op ")" more)
2653− %^ bad-why more
2654− "`)` to close the `|=(` at {(show-loc beg.at.op)}"
3274+ %^ bad-why more (closing op ")")
26553275 "the wide gate's body is one operand, so a call goes in parentheses"
26563276 ::
26573277 :: +read-gate: |= sample, then an expression or a body
@@ -2659,8 +3279,13 @@
26593279 ++ read-gate
26603280 |= [bar=token ts=(list token)]
26613281 ^- (pare expr)
2662− ?: &(?=(^ ts) tight.i.ts) (bad ts "a space after `|=`")
3282+ ?: &(?=(^ ts) tight.i.ts)
3283+ :: a % could begin a constructor's term, as |=%got
3284+ ?: =('%' (first-char i.ts)) (bad-in ts "a term" cen-mask)
3285+ (no-gap ts "a space after `|=`")
26633286 ;< [s=sample after=(list token)] then (read-sample ts)
3287+ =/ dm (doomed ts after "an expression, or a body on deeper lines")
3288+ ?^ dm u.dm
26643289 ;< [e=expr more=(list token)] then
26653290 (read-expr-or-body "the sample" after)
26663291 [%& [%gate [beg.at.bar end:(span-of e)] s e] more]
@@ -2672,6 +3297,8 @@
26723297 ^- (pare expr)
26733298 ?: &(?=(^ ts) tight.i.ts) (wide-rune "^-" ts)
26743299 ;< [s=shape after=(list token)] then (read-mold ts)
3300+ =/ dm (doomed ts after "an expression, or a body on deeper lines")
3301+ ?^ dm u.dm
26753302 ;< [e=expr more=(list token)] then
26763303 (read-expr-or-body "the mold" after)
26773304 [%& [%cast [beg.at.ket end:(span-of e)] s e] more]
@@ -2681,9 +3308,11 @@
26813308 ++ read-trace
26823309 |= [sig=token ts=(list token)]
26833310 ^- (pare expr)
2684− ?: &(?=(^ ts) tight.i.ts) (bad ts "a space after `~&`")
3311+ ?: &(?=(^ ts) tight.i.ts) (wide-rune "~&" ts)
26853312 ;< [v=expr after=(list token)] then (read-expr ts)
26863313 ?. ?=([[* * %indent] *] after)
3314+ =/ dm (doomed ts after "`~&`'s body on deeper lines")
3315+ ?^ dm u.dm
26873316 (bad after "`~&`'s body on deeper lines")
26883317 ;< [b=expr more=(list token)] then (read-body t.after)
26893318 [%& [%trace [beg.at.sig end:(span-of b)] v b] more]
@@ -2696,13 +3325,15 @@
26963325 ?: &(?=(^ ts) tight.i.ts) (wide-rune "?-" ts)
26973326 ;< [s=expr after=(list token)] then (read-expr ts)
26983327 ?. ?=([[* * %indent] *] after)
3328+ =/ dm (doomed ts after "`?-`'s arms on deeper lines")
3329+ ?^ dm u.dm
26993330 (bad after "`?-`'s arms on deeper lines")
27003331 =| arms=(list arm)
27013332 =/ rest=(list token) t.after
27023333 |- ^- (pare expr)
27033334 ;< [a=arm more=(list token)] then (read-arm rest)
27043335 ?: ?=([[* * %newline] *] more) $(arms [a arms], rest t.more)
2705− ?. ?=([[* * %dedent] *] more) (bad-end more)
3336+ ?. ?=([[* * %dedent] *] more) (bad-end-in more (tail-can val.a))
27063337 [%& [%branch [beg.at.wut end.at.a] s (flop [a arms])] t.more]
27073338 ::
27083339 :: +read-arm: a pattern, then an expression or a body
@@ -2714,6 +3345,9 @@
27143345 ?: ?=([[* %& %'+'] *] after)
27153346 %^ bad-why after "a space after the pattern"
27163347 "patterns take no pairs: write a cell, as [%gap %s2]"
3348+ ?: ?=([[* %& %'='] *] after)
3349+ %^ bad-why after "a space after the pattern"
3350+ "patterns take no `name=`: a bare name binds, as [a b]"
27173351 ;< [e=expr more=(list token)] then
27183352 (read-expr-or-body "the pattern" after)
27193353 [%& [[beg:(span-of p) end:(span-of e)] p e] more]
@@ -2721,17 +3355,18 @@
27213355 :: +read-pattern: a term, number, string, ship, loobean, ~, * or name,
27223356 :: or a cell of patterns
27233357 ::
2724− :: A date, duration or knot fails at its second character, since ~
2725− :: alone is null and no ship goes on so; ~[ at its [; and a string
2726− :: with {…} at its { (section 3, Errors).
3358+ :: Where a pattern can't take a token, the error points where the
3359+ :: token stops being a pattern's start (+fail-in): a date or knot
3360+ :: at its second character, since ~ alone is null; a duration at its
3361+ :: third, as ~s could begin the ship ~sev; ~[ at its [; a string
3362+ :: with {…} at its {; a wing at its first dot.
27273363 ::
27283364 ++ read-pattern
27293365 |= ts=(list token)
27303366 ^- (pare pattern)
27313367 ?~ ts (bad ts "a pattern")
27323368 =* t i.ts
2733− =/ next=loc [line.beg.at.t +(col.beg.at.t)]
2734− ?+ lex.t (bad ts "a pattern")
3369+ ?+ lex.t (bad-in ts "a pattern" pattern-mask)
27353370 [%lit *]
27363371 =* l p.lex.t
27373372 ?: ?=(?(%number %ship %term %loobean %null) form.l)
@@ -2742,7 +3377,8 @@
27423377 %duration "durations"
27433378 %knot "knots"
27443379 ==
2745− %+ bad-at next
3380+ =/ n=@ud ?:(?=(%duration form.l) 2 1)
3381+ %+ bad-at [line.beg.at.t (add n col.beg.at.t)]
27463382 ;: weld
27473383 "expected a pattern, found {(show-found t)}; patterns take no "
27483384 what
@@ -2754,6 +3390,11 @@
27543390 [%name *] [%& [%bind at.t p.lex.t] t.ts]
27553391 %'[' (read-cell-pattern t t.ts)
27563392 %'`' (bad-why ts "a pattern" "patterns take no units: write [~ x]")
3393+ ::
3394+ [%wing *]
3395+ %: bad-in-why ts "a pattern" pattern-mask
3396+ "a name in a pattern binds anew, so it has no `.`"
3397+ ==
27573398 ::
27583399 [%str-head *]
27593400 %+ bad-at [line.end.at.t (dec (max 2 col.end.at.t))]
@@ -2761,7 +3402,7 @@
27613402 "patterns take strings without `\{…}`"
27623403 ::
27633404 %'~['
2764− %+ bad-at next
3405+ %+ bad-at [line.beg.at.t +(col.beg.at.t)]
27653406 "expected a pattern, found `~[`; patterns take no lists"
27663407 ==
27673408 ::
@@ -2777,7 +3418,7 @@
27773418 [%& [%cell [beg.at.op end.at.i.ts] (flop ps)] t.ts]
27783419 ?: &(?=(^ ts) |((is-closer i.ts) (is-layout i.ts)))
27793420 (unclosed op "]" ts)
2780− ?: &(?=(^ ps) ?=(^ ts) tight.i.ts) (no-space ts)
3421+ ?: &(?=(^ ps) ?=(^ ts) tight.i.ts) (no-space-pattern ts)
27813422 ;< [p=pattern after=(list token)] then (read-pattern ts)
27823423 $(ps [p ps], ts after)
27833424 ::
@@ -2791,21 +3432,26 @@
27913432 ?: ?=([[* * [%name *]] *] ts) [%& [%bind at.i.ts p.lex.i.ts] t.ts]
27923433 ?: ?=([[* * %'='] *] ts) (read-pun i.ts t.ts)
27933434 ?: &(?=(^ ts) (is-layout i.ts)) (bad ts "a sample")
3435+ ?: ?=([[* * [%error *]] *] ts)
3436+ (bad-in ts "a mold" (con mold-mask tis-mask))
27943437 ?. ?=([[* * %'['] *] ts)
27953438 ;< [s=shape after=(list token)] then (read-mold ts)
27963439 [%& [%bare (span-of s) s] after]
27973440 =* op i.ts
27983441 =| ss=(list sample)
3442+ =| pre=(list token)
27993443 =/ rest=(list token) t.ts
28003444 |- ^- (pare sample)
28013445 ?: ?=([[* * %']'] *] rest)
28023446 ?~ ss (bad rest "a sample")
28033447 [%& [%cell [beg.at.op end.at.i.rest] (flop ss)] t.rest]
28043448 ?: &(?=(^ rest) |((is-closer i.rest) (is-layout i.rest)))
3449+ =/ dm (doomed pre rest (closing op "]"))
3450+ ?^ dm u.dm
28053451 (unclosed op "]" rest)
28063452 ?: &(?=(^ ss) ?=(^ rest) tight.i.rest) (no-space rest)
28073453 ;< [s=sample after=(list token)] then (read-sample rest)
2808− $(ss [s ss], rest after)
3454+ $(ss [s ss], rest after, pre rest)
28093455 ::
28103456 :: +read-field: a cell mold's field: name=mold, =name, or a mold
28113457 ::
@@ -2814,6 +3460,9 @@
28143460 ^- (pare field)
28153461 ?: ?=([[* * [%name *]] [* %& %'='] *] ts) (read-face ts)
28163462 ?: ?=([[* * %'='] *] ts) (read-pun i.ts t.ts)
3463+ :: = begins a pun here, as a mold's first characters begin a mold
3464+ ?: ?=([[* * [%error *]] *] ts)
3465+ (bad-in ts "a mold" (con mold-mask tis-mask))
28173466 ;< [s=shape after=(list token)] then (read-mold ts)
28183467 [%& [%bare (span-of s) s] after]
28193468 ::
@@ -2835,7 +3484,7 @@
28353484 |= [tis=token ts=(list token)]
28363485 ^- (pare field)
28373486 ?: |(?=(~ ts) !tight.i.ts) (bad-space tis ts "a name")
2838− ?. ?=([[* * [%name *]] *] ts) (bad ts "a name")
3487+ ?. ?=([[* * [%name *]] *] ts) (no-name ts)
28393488 [%& [%pun [beg.at.tis end.at.i.ts] p.lex.i.ts] t.ts]
28403489 ::
28413490 :: +read-mold: one mold
@@ -2845,7 +3494,7 @@
28453494 ^- (pare shape)
28463495 ?~ ts (bad ts "a mold")
28473496 =* t i.ts
2848− ?+ lex.t (bad ts "a mold")
3497+ ?+ lex.t (bad-in ts "a mold" mold-mask)
28493498 [%aura *] [%& [%aura at.t p.lex.t] t.ts]
28503499 %'*' [%& [%noun at.t ~] t.ts]
28513500 %'!!' [%& [%void at.t ~] t.ts]
@@ -2860,9 +3509,15 @@
28603509 %'$?(' (read-union-wide t t.ts)
28613510 %'$-(' (read-fn t t.ts)
28623511 %'|$' (read-generic t t.ts)
3512+ ::
3513+ ?(%'|=' %'|=(')
3514+ %: bad-in-why ts "a mold" mold-mask
3515+ "a gate's mold is $-(sample product)"
3516+ ==
28633517 ::
28643518 [%lit *]
2865− ?. ?=(?(%null %term %loobean) form.p.lex.t) (bad ts "a mold")
3519+ ?. ?=(?(%null %term %loobean) form.p.lex.t)
3520+ (bad-in ts "a mold" mold-mask)
28663521 [%& [%const at.t p.lex.t] t.ts]
28673522 ==
28683523 ::
@@ -2873,15 +3528,18 @@
28733528 |= [op=token spaced=? ts=(list token)]
28743529 ^- (pare [(list shape) loc])
28753530 =| ms=(list shape)
3531+ =| pre=(list token)
28763532 |- ^- (pare [(list shape) loc])
28773533 ?: ?=([[* * %')'] *] ts)
28783534 ?~ ms (bad ts "a mold")
28793535 [%& [(flop ms) end.at.i.ts] t.ts]
28803536 ?: &(?=(^ ts) |((is-closer i.ts) (is-layout i.ts)))
3537+ =/ dm (doomed pre ts (closing op ")"))
3538+ ?^ dm u.dm
28813539 (unclosed op ")" ts)
28823540 ?: &(?=(^ ts) tight.i.ts |(spaced ?=(^ ms))) (no-space ts)
28833541 ;< [m=shape after=(list token)] then (read-mold ts)
2884− $(ms [m ms], ts after)
3542+ $(ms [m ms], ts after, pre ts)
28853543 ::
28863544 :: +read-apply: ( ref mold { mold } )
28873545 ::
@@ -2889,7 +3547,7 @@
28893547 |= [op=token ts=(list token)]
28903548 ^- (pare shape)
28913549 ?. ?=([[* * ?([%name *] [%wing *])] *] ts)
2892− (bad ts "a mold's name, as in (list @t)")
3550+ (bad-in ts "a mold's name, as in (list @t)" lower-mask)
28933551 ;< [[ms=(list shape) fin=loc] after=(list token)] then
28943552 (read-molds op & t.ts)
28953553 [%& [%apply [beg.at.op fin] (names-of lex.i.ts) ms] after]
@@ -2911,10 +3569,15 @@
29113569 ;< [a=shape after=(list token)] then (read-mold ts)
29123570 ?: ?=([[* * %')'] *] after) (bad after "a mold, the product")
29133571 ?: &(?=(^ after) |((is-closer i.after) (is-layout i.after)))
3572+ =/ dm (doomed ts after (closing op ")"))
3573+ ?^ dm u.dm
29143574 (unclosed op ")" after)
29153575 ?: &(?=(^ after) tight.i.after) (no-space after)
29163576 ;< [b=shape more=(list token)] then (read-mold after)
2917− ?. ?=([[* * %')'] *] more) (unclosed op ")" more)
3577+ ?. ?=([[* * %')'] *] more)
3578+ =/ dn (doomed after more (closing op ")"))
3579+ ?^ dn u.dn
3580+ (unclosed op ")" more)
29183581 [%& [%fn [beg.at.op end.at.i.more] a b] t.more]
29193582 ::
29203583 :: +read-cell-mold: [ field { field } ]
@@ -2923,15 +3586,18 @@
29233586 |= [op=token ts=(list token)]
29243587 ^- (pare shape)
29253588 =| fs=(list field)
3589+ =| pre=(list token)
29263590 |- ^- (pare shape)
29273591 ?: ?=([[* * %']'] *] ts)
29283592 ?~ fs (bad ts "a mold")
29293593 [%& [%cell [beg.at.op end.at.i.ts] (flop fs)] t.ts]
29303594 ?: &(?=(^ ts) |((is-closer i.ts) (is-layout i.ts)))
3595+ =/ dm (doomed pre ts (closing op "]"))
3596+ ?^ dm u.dm
29313597 (unclosed op "]" ts)
29323598 ?: &(?=(^ fs) ?=(^ ts) tight.i.ts) (no-space ts)
29333599 ;< [f=field after=(list token)] then (read-field ts)
2934− $(fs [f fs], ts after)
3600+ $(fs [f fs], ts after, pre ts)
29353601 ::
29363602 :: +read-union: $?, then its cases below, one mold per line
29373603 ::
@@ -2951,6 +3617,7 @@
29513617 ?: ?=([[* * %dedent] *] after)
29523618 [%& [%union [beg.at.buc end:(span-of c)] (flop [c cs])] t.after]
29533619 ?: ?=([[* * %indent] *] after) (bad-end after)
3620+ ?: &(?=(^ after) (stray i.after)) (bad-end after)
29543621 (bad-why after "the end of the line" "a union takes one case per line")
29553622 ::
29563623 :: +read-generic: |$ [ typevar { typevar } ] mold
@@ -2958,9 +3625,9 @@
29583625 ++ read-generic
29593626 |= [bar=token ts=(list token)]
29603627 ^- (pare shape)
2961− ?: &(?=(^ ts) tight.i.ts) (bad ts "a space after `|$`")
3628+ ?: &(?=(^ ts) tight.i.ts) (wide-rune "|$" ts)
29623629 ?. ?=([[* * %'['] *] ts)
2963− (bad ts "`[` and its type variables, as in |$ [M]")
3630+ (bad-in ts "`[` and its type variables, as in |$ [M]" sel-mask)
29643631 =* op i.ts
29653632 =| vs=(list @t)
29663633 =/ rest=(list token) t.ts
@@ -2968,13 +3635,14 @@
29683635 ?: ?=([[* * %']'] *] rest)
29693636 ?~ vs (bad rest "a type variable")
29703637 =/ more=(list token) t.rest
2971− ?: &(?=(^ more) tight.i.more) (bad more "a space after `]`")
3638+ ?: &(?=(^ more) tight.i.more) (no-gap more "a space after `]`")
29723639 ;< [b=shape after=(list token)] then (read-mold more)
29733640 [%& [%generic [beg.at.bar end:(span-of b)] (flop vs) b] after]
29743641 ?: &(?=(^ rest) |((is-closer i.rest) (is-layout i.rest)))
29753642 (unclosed op "]" rest)
29763643 ?: &(?=(^ vs) ?=(^ rest) tight.i.rest) (no-space rest)
2977− ?. ?=([[* * [%tvar *]] *] rest) (bad rest "a type variable")
3644+ ?. ?=([[* * [%tvar *]] *] rest)
3645+ (bad-in rest "a type variable" upper-mask)
29783646 $(vs [p.lex.i.rest vs], rest t.rest)
29793647 ::
29803648 :: +read-pathmold: / [ segment { / segment } ], each / and segment
@@ -3010,16 +3678,16 @@
30103678 =* op i.ts
30113679 =/ r1=(list token) t.ts
30123680 ?: |(?=(~ r1) !tight.i.r1) (bad-space op r1 "a name")
3013− ?. ?=([[* * [%name *]] *] r1) (bad r1 "a name")
3681+ ?. ?=([[* * [%name *]] *] r1) (no-name r1)
30143682 =/ r2=(list token) t.r1
30153683 ?: |(?=(~ r2) !tight.i.r2) (bad-space i.r1 r2 "`=`")
3016− ?. ?=([[* * %'='] *] r2) (bad r2 "`=`")
3684+ ?. ?=([[* * %'='] *] r2) (bad-in r2 "`=`" tis-mask)
30173685 =/ r3=(list token) t.r2
30183686 ?: |(?=(~ r3) !tight.i.r3) (bad-space i.r2 r3 "an aura")
3019− ?. ?=([[* * [%aura *]] *] r3) (bad r3 "an aura")
3687+ ?. ?=([[* * [%aura *]] *] r3) (bad-in r3 "an aura" pat-mask)
30203688 =/ r4=(list token) t.r3
30213689 ?: |(?=(~ r4) !tight.i.r4) (bad-space i.r3 r4 "`]`")
3022− ?. ?=([[* * %']'] *] r4) (bad r4 "`]`")
3690+ ?. ?=([[* * %']'] *] r4) (bad-in r4 "`]`" ser-mask)
30233691 =/ at=span [beg.at.op end.at.i.r4]
30243692 [%& [[%typed at p.lex.i.r1 p.lex.i.r3] end.at.i.r4] t.r4]
30253693 --
@@ -3029,38 +3697,97 @@
30293697:: +outline: a node as +check-spans sees it
30303698::
30313699:: lead lists the kinds (+kind-of) of token the node may start with,
3032−:: or is ~ when it starts with its first child; last likewise for its
3033−:: end, and open lets a bracket that may be left open end with its
3034−:: last child instead.
3700+:: or is ~ when it starts with its first child; stop says where it
3701+:: ends (+stop).
30353702::
30363703+$ outline
3037− $~ [%$ *span ~ ~ | ~]
3704+ $~ [%$ *span ~ %kid ~]
30383705 $: kind=@tas
30393706 at=span
30403707 lead=(list @)
3041− last=(list @)
3042− open=?
3708+ =stop
30433709 kids=(list outline)
30443710 ==
30453711::
3712+:: +stop: where a node ends, by the tokens of its text alone
3713+::
3714+:: %kid with its last child
3715+:: %one where its first token ends: a name, a literal
3716+:: %two where the token after its first ends: |=%got, =msg, /- todo
3717+:: %shut at the closer of its first token, an opener closed on its
3718+:: line; or with its last child, if that opener is left open
3719+:: or is a rune, as $? with its cases below
3720+:: %shut2 likewise from the token after its first, a change's (
3721+:: %run at the end of the path it starts: then each tight / and
3722+:: knot, and each tight [ or ( to its closer
3723+:: %run3 likewise from its third token, an import's path
3724+:: %string at the str-tail that ends its string, past each str-mid
3725+::
3726++$ stop ?(%kid %one %two %shut %shut2 %run %run3 %string)
3727+::
3728+:: +tinfo: a token as +check-spans sees it: its kind, its end, and the
3729+:: next token's start and whether that is tight, unless it is a layout
3730+:: token
3731+::
3732++$ tinfo [kind=@ end=loc nex=(unit [beg=loc tight=?])]
3733+::
30463734:: +check-spans: whether a module's spans follow section 1's rules
30473735::
30483736:: A node starts at its first token and ends where its last token
30493737:: ends, never at a layout token: at its own token where it has one
3050−:: there (a rune, a name, an opener or a closer), else where its
3051−:: first or last child does. Its children's spans lie inside its own
3052−:: in source order, and so do the module's imports and definitions.
3053−:: Gives the first node that breaks a rule, and how, or ~.
3738+:: there (a rune, a name, an opener), else where its first child does;
3739+:: and at the token +stop names, which it finds from the tokens alone,
3740+:: matching each opener with its closer on the line. Its children's
3741+:: spans lie inside its own in source order, and so do the module's
3742+:: imports and definitions. Gives the first node that breaks a rule,
3743+:: and how, or ~. +check-spans-test checks that it catches spans a
3744+:: parser bug could give.
30543745::
30553746++ check-spans
30563747 |= [mod=module toks=(list token)]
30573748 ^- (unit tape)
3058− =/ real=(list token) (skip toks is-layout)
3059− =/ begs=(map loc @) (malt (turn real |=(t=token [beg.at.t (kind-of t)])))
3060− =/ ends=(map loc @) (malt (turn real |=(t=token [end.at.t (kind-of t)])))
3061− %^ check-kids [begs ends] ~
3749+ %+ check-outlines toks
30623750 (weld (turn imports.mod outline-import) (turn defs.mod outline-def))
30633751::
3752+:: +check-outlines: +check-spans over the outlines of a module's nodes
3753+::
3754+++ check-outlines
3755+ |= [toks=(list token) os=(list outline)]
3756+ ^- (unit tape)
3757+ (check-kids (index-tokens toks) ~ os)
3758+::
3759+:: +index-tokens: each token that isn't a layout token, by its start,
3760+:: and each opener's closer on its line, by their starts
3761+::
3762+:: A str-head opens an interpolation that a str-mid or str-tail
3763+:: closes, and a str-mid opens the next. Openers still open at the end
3764+:: of a line have no closer.
3765+::
3766+++ index-tokens
3767+ |= toks=(list token)
3768+ ^- [info=(map loc tinfo) mat=(map loc loc)]
3769+ =| info=(map loc tinfo)
3770+ =| mat=(map loc loc)
3771+ =| open=(list loc)
3772+ |- ^- [info=(map loc tinfo) mat=(map loc loc)]
3773+ ?~ toks [info mat]
3774+ =* t i.toks
3775+ ?: (is-layout t) $(toks t.toks, open ~)
3776+ =/ k=@ (kind-of t)
3777+ =/ nex=(unit [beg=loc tight=?])
3778+ ?: |(?=(~ t.toks) (is-layout i.t.toks)) ~
3779+ `[beg.at.i.t.toks tight.i.t.toks]
3780+ =. info (~(put by info) beg.at.t [k end.at.t nex])
3781+ ?: ?=(?(%'(' %'[' %'~[' %'|=(' %'$?(' %'$-(' %str-head) k)
3782+ $(toks t.toks, open [beg.at.t open])
3783+ ?. ?=(?(%')' %']' %str-mid %str-tail) k) $(toks t.toks)
3784+ ?~ open $(toks t.toks)
3785+ %= $
3786+ toks t.toks
3787+ mat (~(put by mat) i.open beg.at.t)
3788+ open ?:(?=(%str-mid k) [beg.at.t t.open] t.open)
3789+ ==
3790+::
30643791:: +kind-of: a token's kind: a glyph, or its lexeme's tag
30653792::
30663793++ kind-of
@@ -3071,7 +3798,10 @@
30713798:: +check-kids: nodes in source order, inside the span in, each checked
30723799::
30733800++ check-kids
3074− |= [maps=[begs=(map loc @) ends=(map loc @)] in=(unit span) os=(list outline)]
3801+ |= $: idx=[info=(map loc tinfo) mat=(map loc loc)]
3802+ in=(unit span)
3803+ os=(list outline)
3804+ ==
30753805 ^- (unit tape)
30763806 =| prev=(unit span)
30773807 |- ^- (unit tape)
@@ -3083,14 +3813,14 @@
30833813 `(span-bad o "ends after its parent")
30843814 ?: &(?=(^ prev) (loc-lth beg.at.o end.u.prev))
30853815 `(span-bad o "starts before the node before it ends")
3086− =/ bad=(unit tape) (check-outline maps o)
3816+ =/ bad=(unit tape) (check-outline idx o)
30873817 ?^ bad bad
30883818 $(prev `at.o, os t.os)
30893819::
30903820:: +check-outline: one node's start and end, then its children
30913821::
30923822++ check-outline
3093− |= [maps=[begs=(map loc @) ends=(map loc @)] o=outline]
3823+ |= [idx=[info=(map loc tinfo) mat=(map loc loc)] o=outline]
30943824 ^- (unit tape)
30953825 =* ks kids.o
30963826 =/ head=(unit span) ?~(ks ~ `at.i.ks)
@@ -3102,29 +3832,95 @@
31023832 ?~ head `"has no token or child to start with"
31033833 ?: =(beg.at.o beg.u.head) ~
31043834 `"should start where its first child does, at {(show-loc beg.u.head)}"
3105− =/ k=(unit @) (~(get by begs.maps) beg.at.o)
3106− ?~ k `"starts where no token does"
3107− ?. (lien `(list @)`lead.o |=(a=@ =(a u.k)))
3835+ =/ t=(unit tinfo) (~(get by info.idx) beg.at.o)
3836+ ?~ t `"starts where no token does"
3837+ ?. (lien `(list @)`lead.o |=(a=@ =(a kind.u.t)))
31083838 `"starts at a token of a kind it can't start with"
31093839 ?: &(?=(^ head) !(loc-lth beg.at.o beg.u.head))
31103840 `"should start with its own token, before its first child"
31113841 ~
31123842 ?^ start `(span-bad o u.start)
3113− :: the end: its own token, or its last child's
3114− =/ stop=(unit tape)
3115− ?: &(|(?=(~ last.o) open.o) ?=(^ tail) =(end.at.o end.u.tail)) ~
3116− ?~ last.o
3117− ?~ tail `"has no token or child to end with"
3118− `"should end where its last child does, at {(show-loc end.u.tail)}"
3119− =/ k=(unit @) (~(get by ends.maps) end.at.o)
3120− ?~ k `"ends where no token does"
3121− ?. (lien `(list @)`last.o |=(a=@ =(a u.k)))
3122− `"ends at a token of a kind it can't end with"
3123− ?: &(?=(^ tail) !(loc-lth end.u.tail end.at.o))
3124− `"should end with its own token, after its last child"
3125− ~
3126− ?^ stop `(span-bad o u.stop)
3127− (check-kids maps `at.o ks)
3843+ :: the end: where +stop says
3844+ =/ want=(unit loc) (stop-of idx o tail)
3845+ ?~ want `(span-bad o "has no end that its tokens give")
3846+ ?. =(u.want end.at.o)
3847+ `(span-bad o "should end at {(show-loc u.want)}")
3848+ (check-kids idx `at.o ks)
3849+::
3850+:: +stop-of: where a node should end, from its stop, the tokens, and
3851+:: its last child's span, tail
3852+::
3853+++ stop-of
3854+ |= $: idx=[info=(map loc tinfo) mat=(map loc loc)]
3855+ o=outline
3856+ tail=(unit span)
3857+ ==
3858+ ^- (unit loc)
3859+ =* info info.idx
3860+ =/ first=(unit tinfo) (~(get by info) beg.at.o)
3861+ :: the token after the one at beg, if it is on the same line
3862+ =/ after
3863+ |= beg=loc
3864+ ^- (unit loc)
3865+ =/ t=(unit tinfo) (~(get by info) beg)
3866+ ?~ t ~
3867+ ?~ nex.u.t ~
3868+ `beg.u.nex.u.t
3869+ :: the end of the token at beg
3870+ =/ end-at
3871+ |= beg=loc
3872+ ^- (unit loc)
3873+ =/ t=(unit tinfo) (~(get by info) beg)
3874+ ?~(t ~ `end.u.t)
3875+ :: the closer of the opener at beg, else the last child
3876+ =/ shut
3877+ |= beg=loc
3878+ ^- (unit loc)
3879+ =/ c=(unit loc) (~(get by mat.idx) beg)
3880+ ?^ c (end-at u.c)
3881+ ?~(tail ~ `end.u.tail)
3882+ :: a path from the token at beg: each tight / and knot after it, and
3883+ :: each tight [ or ( to its closer
3884+ =/ run
3885+ |= beg=loc
3886+ ^- (unit loc)
3887+ |- ^- (unit loc)
3888+ =/ t=(unit tinfo) (~(get by info) beg)
3889+ ?~ t ~
3890+ =/ n nex.u.t
3891+ ?. &(?=(^ n) tight.u.n) `end.u.t
3892+ =/ nk=(unit tinfo) (~(get by info) beg.u.n)
3893+ ?~ nk `end.u.t
3894+ ?: ?=(?(%'/' %knot) kind.u.nk) $(beg beg.u.n)
3895+ ?. ?=(?(%'[' %'(') kind.u.nk) `end.u.t
3896+ =/ c=(unit loc) (~(get by mat.idx) beg.u.n)
3897+ ?~ c `end.u.t
3898+ $(beg u.c)
3899+ ?- stop.o
3900+ %kid ?~(tail ~ `end.u.tail)
3901+ %one (end-at beg.at.o)
3902+ %shut (shut beg.at.o)
3903+ %run (run beg.at.o)
3904+ %two =/(n (after beg.at.o) ?~(n ~ (end-at u.n)))
3905+ %shut2 =/(n (after beg.at.o) ?~(n ~ (shut u.n)))
3906+ ::
3907+ %run3
3908+ =/ n (after beg.at.o)
3909+ ?~ n ~
3910+ =/ m (after u.n)
3911+ ?~ m ~
3912+ (run u.m)
3913+ ::
3914+ %string
3915+ =/ beg=loc beg.at.o
3916+ |- ^- (unit loc)
3917+ =/ c=(unit loc) (~(get by mat.idx) beg)
3918+ ?~ c ~
3919+ =/ t=(unit tinfo) (~(get by info) u.c)
3920+ ?~ t ~
3921+ ?: ?=(%str-tail kind.u.t) `end.u.t
3922+ $(beg u.c)
3923+ ==
31283924::
31293925:: +span-bad: a span check's error, naming the node by kind and span
31303926::
@@ -3146,75 +3942,75 @@
31463942 |= i=import
31473943 ^- outline
31483944 ?- -.i
3149− %sur [%sur at.i ~[%'/-'] ~[%name] | ~]
3150− %mark [%mark at.i ~[%'/%'] ~[%lit] | ~]
3151− %jibb [%jibb at.i ~[%'/='] ~[%'/' %knot] | ~]
3945+ %sur [%sur at.i ~[%'/-'] %two ~]
3946+ %mark [%mark at.i ~[%'/%'] %two ~]
3947+ %jibb [%jibb at.i ~[%'/='] %run3 ~]
31523948 ==
31533949::
31543950++ outline-def
31553951 |= d=def
31563952 ^- outline
31573953 ?- -.d
3158− %mold [%mold at.d ~[%'+$'] ~ | ~[(outline-shape shape.d)]]
3159− %value [%value at.d ~[%'++'] ~ | ~[(outline-expr val.d)]]
3954+ %mold [%mold at.d ~[%'+$'] %kid ~[(outline-shape shape.d)]]
3955+ %value [%value at.d ~[%'++'] %kid ~[(outline-expr val.d)]]
31603956 ==
31613957::
31623958++ outline-expr
31633959 |= e=expr
31643960 ^- outline
31653961 ?- -.e
3166− %lit [%lit at.e ~[%lit] ~[%lit] | ~]
3962+ %lit [%lit at.e ~[%lit] %one ~]
31673963 %str (outline-str at.e pieces.e)
3168− %path [%path at.e ~[%'/'] ~[%'/' %knot] | ~]
3169− %wing [%wing at.e ~[%name %wing] ~[%name %wing] | ~]
3170− %pair [%pair at.e ~[%name] ~ | ~[(outline-expr val.e)]]
3171− %unit [%unit at.e ~[%'`'] ~ | ~[(outline-expr val.e)]]
3172− %group [%group at.e ~[%'('] ~[%')'] & ~[(outline-expr inner.e)]]
3173− %list [%list at.e ~[%'~['] ~[%']'] & (turn items.e outline-expr)]
3174− %tuple [%tuple at.e ~[%'['] ~[%']'] & (turn items.e outline-item)]
3175− %ctor [%ctor at.e ~[%'|='] ~[%lit] | ~]
3176− %crash [%crash at.e ~[%'!!'] ~[%'!!'] | ~]
3964+ %path [%path at.e ~[%'/'] %run ~]
3965+ %wing [%wing at.e ~[%name %wing] %one ~]
3966+ %pair [%pair at.e ~[%name] %kid ~[(outline-expr val.e)]]
3967+ %unit [%unit at.e ~[%'`'] %kid ~[(outline-expr val.e)]]
3968+ %group [%group at.e ~[%'('] %shut ~[(outline-expr inner.e)]]
3969+ %list [%list at.e ~[%'~['] %shut (turn items.e outline-expr)]
3970+ %tuple [%tuple at.e ~[%'['] %shut (turn items.e outline-item)]
3971+ %ctor [%ctor at.e ~[%'|='] %two ~]
3972+ %crash [%crash at.e ~[%'!!'] %one ~]
31773973 ::
31783974 %qath
31793975 =/ ks=(list outline)
31803976 %+ murn segs.e
31813977 |=(s=qseg ?.(?=(%expr -.s) ~ `(outline-expr p.s)))
3182− [%qath at.e ~[%'%/'] ~[%'%/' %knot %')'] | ks]
3978+ [%qath at.e ~[%'%/'] %run ks]
31833979 ::
31843980 %change
31853981 =/ ks=(list outline) (turn edits.e outline-edit)
3186− [%change at.e ~[%name %wing] ~[%')'] & ks]
3982+ [%change at.e ~[%name %wing] %shut2 ks]
31873983 ::
31883984 %gate-wide
31893985 =/ ks=(list outline)
31903986 ~[(outline-sample sample.e) (outline-expr body.e)]
3191− [%gate-wide at.e ~[%'|=('] ~[%')'] | ks]
3987+ [%gate-wide at.e ~[%'|=('] %shut ks]
31923988 ::
31933989 %call
3194− [%call at.e ~ ~ | [(outline-expr head.e) (turn args.e outline-expr)]]
3990+ [%call at.e ~ %kid [(outline-expr head.e) (turn args.e outline-expr)]]
31953991 ::
31963992 %gate
31973993 =/ ks=(list outline)
31983994 ~[(outline-sample sample.e) (outline-expr body.e)]
3199− [%gate at.e ~[%'|='] ~ | ks]
3995+ [%gate at.e ~[%'|='] %kid ks]
32003996 ::
32013997 %cast
32023998 =/ ks=(list outline) ~[(outline-shape shape.e) (outline-expr val.e)]
3203− [%cast at.e ~[%'^-'] ~ | ks]
3999+ [%cast at.e ~[%'^-'] %kid ks]
32044000 ::
32054001 %trace
32064002 =/ ks=(list outline) ~[(outline-expr val.e) (outline-expr then.e)]
3207− [%trace at.e ~[%'~&'] ~ | ks]
4003+ [%trace at.e ~[%'~&'] %kid ks]
32084004 ::
32094005 %branch
32104006 =/ ks=(list outline)
32114007 [(outline-expr subject.e) (turn arms.e outline-arm)]
3212− [%branch at.e ~[%'?-'] ~ | ks]
4008+ [%branch at.e ~[%'?-'] %kid ks]
32134009 ::
32144010 %body
32154011 =/ ks=(list outline)
32164012 (snoc (turn defs.e outline-def) (outline-expr final.e))
3217− [%body at.e ~ ~ | ks]
4013+ [%body at.e ~ %kid ks]
32184014 ==
32194015::
32204016++ outline-str
@@ -3222,60 +4018,60 @@
32224018 ^- outline
32234019 =/ ks=(list outline)
32244020 (murn ps |=(p=piece ?.(?=(%expr -.p) ~ `(outline-expr p.p))))
3225− ?~ ks [%str at ~[%str] ~[%str] | ~]
3226− [%str at ~[%str-head] ~[%str-tail] | ks]
4021+ ?~ ks [%str at ~[%str] %one ~]
4022+ [%str at ~[%str-head] %string ks]
32274023::
32284024++ outline-item
32294025 |= i=item
32304026 ^- outline
3231− ?~ face.i [%item at.i ~ ~ | ~[(outline-expr val.i)]]
3232− [%face at.i ~[%name] ~ | ~[(outline-expr val.i)]]
4027+ ?~ face.i [%item at.i ~ %kid ~[(outline-expr val.i)]]
4028+ [%face at.i ~[%name] %kid ~[(outline-expr val.i)]]
32334029::
32344030++ outline-edit
32354031 |= e=edit
32364032 ^- outline
3237− [%edit at.e ~[%name] ~ | ~[(outline-expr val.e)]]
4033+ [%edit at.e ~[%name] %kid ~[(outline-expr val.e)]]
32384034::
32394035++ outline-arm
32404036 |= a=arm
32414037 ^- outline
3242− [%arm at.a ~ ~ | ~[(outline-pattern pat.a) (outline-expr val.a)]]
4038+ [%arm at.a ~ %kid ~[(outline-pattern pat.a) (outline-expr val.a)]]
32434039::
32444040++ outline-sample
32454041 |= s=sample
32464042 ^- outline
32474043 ?- -.s
3248− %bind [%bind at.s ~[%name] ~[%name] | ~]
3249− %face [%face at.s ~[%name] ~ | ~[(outline-shape shape.s)]]
3250− %pun [%pun at.s ~[%'='] ~[%name] | ~]
3251− %cell [%cell at.s ~[%'['] ~[%']'] | (turn items.s outline-sample)]
3252− %bare [%bare at.s ~ ~ | ~[(outline-shape shape.s)]]
4044+ %bind [%bind at.s ~[%name] %one ~]
4045+ %face [%face at.s ~[%name] %kid ~[(outline-shape shape.s)]]
4046+ %pun [%pun at.s ~[%'='] %two ~]
4047+ %cell [%cell at.s ~[%'['] %shut (turn items.s outline-sample)]
4048+ %bare [%bare at.s ~ %kid ~[(outline-shape shape.s)]]
32534049 ==
32544050::
32554051++ outline-pattern
32564052 |= p=pattern
32574053 ^- outline
32584054 ?- -.p
3259− %lit [%lit at.p ~[%lit] ~[%lit] | ~]
3260− %str [%str at.p ~[%str] ~[%str] | ~]
3261− %any [%any at.p ~[%'*'] ~[%'*'] | ~]
3262− %bind [%bind at.p ~[%name] ~[%name] | ~]
3263− %cell [%cell at.p ~[%'['] ~[%']'] | (turn items.p outline-pattern)]
4055+ %lit [%lit at.p ~[%lit] %one ~]
4056+ %str [%str at.p ~[%str] %one ~]
4057+ %any [%any at.p ~[%'*'] %one ~]
4058+ %bind [%bind at.p ~[%name] %one ~]
4059+ %cell [%cell at.p ~[%'['] %shut (turn items.p outline-pattern)]
32644060 ==
32654061::
32664062++ outline-shape
32674063 |= s=shape
32684064 ^- outline
32694065 ?- -.s
3270− %aura [%aura at.s ~[%aura] ~[%aura] | ~]
3271− %noun [%noun at.s ~[%'*'] ~[%'*'] | ~]
3272− %void [%void at.s ~[%'!!'] ~[%'!!'] | ~]
3273− %flag [%flag at.s ~[%'?'] ~[%'?'] | ~]
3274− %const [%const at.s ~[%lit] ~[%lit] | ~]
3275− %ref [%ref at.s ~[%name %wing] ~[%name %wing] | ~]
3276− %tvar [%tvar at.s ~[%tvar] ~[%tvar] | ~]
3277− %apply [%apply at.s ~[%'('] ~[%')'] | (turn args.s outline-shape)]
3278− %cell [%cell at.s ~[%'['] ~[%']'] | (turn fields.s outline-sample)]
4066+ %aura [%aura at.s ~[%aura] %one ~]
4067+ %noun [%noun at.s ~[%'*'] %one ~]
4068+ %void [%void at.s ~[%'!!'] %one ~]
4069+ %flag [%flag at.s ~[%'?'] %one ~]
4070+ %const [%const at.s ~[%lit] %one ~]
4071+ %ref [%ref at.s ~[%name %wing] %one ~]
4072+ %tvar [%tvar at.s ~[%tvar] %one ~]
4073+ %apply [%apply at.s ~[%'('] %shut (turn args.s outline-shape)]
4074+ %cell [%cell at.s ~[%'['] %shut (turn fields.s outline-sample)]
32794075 ::
32804076 %path
32814077 =/ ks=(list outline)
@@ -3283,19 +4079,100 @@
32834079 |= g=pseg
32844080 ^- (unit outline)
32854081 ?. ?=(%typed -.g) ~
3286− `[%typed at.g ~[%'['] ~[%']'] | ~]
3287− [%path at.s ~[%'/'] ~[%'/' %knot %']'] & ks]
4082+ `[%typed at.g ~[%'['] %shut ~]
4083+ [%path at.s ~[%'/'] %run ks]
32884084 ::
32894085 %union
32904086 =/ ks=(list outline) (turn cases.s outline-shape)
3291− [%union at.s ~[%'$?' %'$?('] ~[%')'] & ks]
4087+ [%union at.s ~[%'$?' %'$?('] %shut ks]
32924088 ::
32934089 %fn
32944090 =/ ks=(list outline)
32954091 ~[(outline-shape sample.s) (outline-shape product.s)]
3296− [%fn at.s ~[%'$-('] ~[%')'] | ks]
4092+ [%fn at.s ~[%'$-('] %shut ks]
32974093 ::
32984094 %generic
3299− [%generic at.s ~[%'|$'] ~ | ~[(outline-shape body.s)]]
4095+ [%generic at.s ~[%'|$'] %kid ~[(outline-shape body.s)]]
33004096 ==
4097+::
4098+:: +check-spans-test: +check-spans's own test: ~, or what went wrong
4099+::
4100+:: Each case parses a source, checks that its spans pass, then moves
4101+:: the span of every node of a kind that starts at a place, as a
4102+:: parser bug would, and checks that +check-spans says so. Run it as
4103+:: tools/hoon check-spans-test, which prints <<>> when every case
4104+:: passes.
4105+::
4106+++ check-spans-test
4107+ ^- (list tape)
4108+ =/ cases=(list [src=@t bends=(list [kind=@tas beg=loc at=span])])
4109+ :~ :: a closed bracket ending before its closer, or at its parent's
4110+ :- '++ x [a [b c]]'
4111+ ~[[%tuple [1 9] [1 9] [1 13]] [%item [1 9] [1 9] [1 13]]]
4112+ :- '++ x [a [b c]]'
4113+ ~[[%tuple [1 9] [1 9] [1 15]] [%item [1 9] [1 9] [1 15]]]
4114+ :: a bracket starting at its parent's opener
4115+ :- '++ x [[b c] a]'
4116+ ~[[%tuple [1 7] [1 6] [1 12]] [%item [1 7] [1 6] [1 12]]]
4117+ :: a group without its ), a list at the next line, a call with )
4118+ :- '++ x ~[\0a (f a)\0a++ y 1'
4119+ :~ [%group [2 3] [2 3] [2 7]]
4120+ [%list [1 6] [1 6] [2 7]]
4121+ [%value [1 1] [1 1] [2 7]]
4122+ ==
4123+ :- '++ x ~[\0a (f a)\0a++ y 1'
4124+ ~[[%list [1 6] [1 6] [3 1]] [%value [1 1] [1 1] [3 1]]]
4125+ ['++ x ~[\0a (f a)\0a++ y 1' ~[[%call [2 4] [2 4] [2 8]]]]
4126+ :: a literal running on to the next one's end
4127+ ['++ x f 1 2' ~[[%lit [1 8] [1 8] [1 11]]]]
4128+ :: a path, a string, a change and a wide union cut short
4129+ ['++ x f /a/b c' ~[[%path [1 8] [1 8] [1 10]]]]
4130+ ['++ x f "a{b}c" d' ~[[%str [1 8] [1 8] [1 13]]]]
4131+ ['++ x m(a=1) b' ~[[%change [1 6] [1 6] [1 11]]]]
4132+ :- '+$ x $?(%a %b)'
4133+ ~[[%union [1 6] [1 6] [1 14]] [%mold [1 1] [1 1] [1 14]]]
4134+ :: a mold's cell before its closer, a typed segment past its own
4135+ :- '+$ x [a=[@ @] b=@]'
4136+ ~[[%cell [1 9] [1 9] [1 13]] [%face [1 7] [1 7] [1 13]]]
4137+ :- '+$ x [p=/a/[id=@ud]]'
4138+ :~ [%typed [1 12] [1 12] [1 21]]
4139+ [%path [1 9] [1 9] [1 21]]
4140+ [%face [1 7] [1 7] [1 21]]
4141+ ==
4142+ :: an import's path cut short
4143+ ['/= c /ui/c' ~[[%jibb [1 1] [1 1] [1 11]]]]
4144+ ==
4145+ %- zing
4146+ %+ turn cases
4147+ |= [src=@t bends=(list [kind=@tas beg=loc at=span])]
4148+ ^- (list tape)
4149+ =/ name=tape "`{(trip src)}`, {<bends>}"
4150+ =/ toks=(list token) (layout /test/jibb src)
4151+ =/ res (parse-tokens /test/jibb toks)
4152+ ?: ?=(%| -.res) ~["{name}: doesn't parse: {msg.p.res}"]
4153+ =/ os=(list outline)
4154+ %+ weld (turn imports.p.res outline-import)
4155+ (turn defs.p.res outline-def)
4156+ =/ true=(unit tape) (check-outlines toks os)
4157+ ?^ true ~["{name}: its true spans fail: {u.true}"]
4158+ =/ bent=(list outline)
4159+ =/ o=(list outline) os
4160+ |- ^- (list outline)
4161+ ?~ bends o
4162+ $(bends t.bends, o (bend-outlines o kind.i.bends beg.i.bends at.i.bends))
4163+ ?: =(bent os) ~["{name}: no such node"]
4164+ ?^ (check-outlines toks bent) ~
4165+ ~["{name}: not caught"]
4166+::
4167+:: +bend-outlines: os, with the span of each node of kind kind that
4168+:: starts at beg set to at, as a parser bug could set it
4169+::
4170+++ bend-outlines
4171+ |= [os=(list outline) kind=@tas beg=loc at=span]
4172+ ^- (list outline)
4173+ ?~ os ~
4174+ =/ o=outline i.os
4175+ =? at.o &(=(kind kind.o) =(beg beg.at.o)) at
4176+ :- o(kids $(os kids.o))
4177+ $(os t.os)
33014178--
tests/golden/inline-import-root-bad/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Imports: `/= card /ui/components/card :: a Jibb module`; the EBNF: `import = "/-" name | "/%" term | "/=" name pathlit ;` and `pathlit = "/" knot { "/" knot } ;`
2+tests: a `/=` import whose path is `/` alone
3+expect: error at 1:12 — a `/=` import names a module's file, so its path needs a segment right after the `/` (design question 28)
tests/golden/inline-import-root-bad/source.jibbnew file+1
@@ -0,0 +1 @@
1+/= card /
tests/golden/inline-import-root-bad/tokens.txtnew file+4
@@ -0,0 +1,4 @@
1+1:1 glyph /=
2+1:5 name card
3+1:11 glyph /
4+1:12 NEWLINE
tests/golden/inline-import-root-bad/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-import-root-bad/source.jibb:1:12: expected a path segment right after `/`, found the end of the file
2+/= card /
3+ ^
tests/golden/inline-leftout-barcen-2/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Runes, "Left out on purpose": "`|%`, `|_`, `|*`: modules are records."
2+tests: `|%` at the top of a file, where Hoon's cores start
3+expect: error at 1:1 — a line at the top level starts an import or a definition, and neither starts with `|`; `|%` is left out (modules are records)
tests/golden/inline-leftout-barcen-2/source.jibbnew file+1
@@ -0,0 +1 @@
1+|%
tests/golden/inline-leftout-barcen-2/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-barcen-2/source.jibb:1:2: `|%` is left out: modules are records
2+|%
3+ ^
tests/golden/inline-leftout-barcen-2/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-barcen-2/source.jibb:1:1: expected an import or a definition, found `|`; `|%` is left out: modules are records
2+|%
3+^
tests/golden/inline-leftout-barcen-3/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Runes, "Left out on purpose": "`|%`, `|_`, `|*`: modules are records."
2+tests: `|%` after a `+$` definition's mold, which nothing on its line can follow
3+expect: error at 1:8 — after the mold `@` the line must end, so the `|` is where the text stops being valid; `|%` is left out (modules are records)
tests/golden/inline-leftout-barcen-3/source.jibbnew file+1
@@ -0,0 +1 @@
1++$ x @ |%
tests/golden/inline-leftout-barcen-3/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-barcen-3/source.jibb:1:9: `|%` is left out: modules are records
2++$ x @ |%
3+ ^
tests/golden/inline-leftout-barcen-3/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-barcen-3/source.jibb:1:8: expected the end of the line, found `|`; `|%` is left out: modules are records
2++$ x @ |%
3+ ^
tests/golden/inline-leftout-buc-paren-2/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Runes, "Left out on purpose": "`|-`, `$(…)`: gates recurse by name."
2+tests: `$(…)` where a mold goes, whose `$` could still begin `$?` or `$-(`
3+expect: error at 1:7 — a mold can begin with `$`, so the `(` is where the text stops being valid; `$(…)` is left out (gates recurse by name)
tests/golden/inline-leftout-buc-paren-2/source.jibbnew file+1
@@ -0,0 +1 @@
1++$ x $(a)
tests/golden/inline-leftout-buc-paren-2/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-buc-paren-2/source.jibb:1:7: `$(…)` is left out: gates recurse by name
2++$ x $(a)
3+ ^
tests/golden/inline-leftout-buc-paren-2/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-buc-paren-2/source.jibb:1:7: `$(…)` is left out: gates recurse by name
2++$ x $(a)
3+ ^
tests/golden/inline-leftout-buc-paren/tokens.txt+2−2
@@ -1,3 +1,3 @@
1−/tests/golden/inline-leftout-buc-paren/source.jibb:1:6: `$(…)` is left out: gates recurse by name
1+/tests/golden/inline-leftout-buc-paren/source.jibb:1:7: `$(…)` is left out: gates recurse by name
22++ x $(n 1)
3− ^
3+ ^
tests/golden/inline-leftout-buc-paren/tree.txt+1−1
@@ -1,3 +1,3 @@
1−/tests/golden/inline-leftout-buc-paren/source.jibb:1:6: `$(…)` is left out: gates recurse by name
1+/tests/golden/inline-leftout-buc-paren/source.jibb:1:6: expected an expression, found `$`; `$(…)` is left out: gates recurse by name
22++ x $(n 1)
33 ^
tests/golden/inline-leftout-cencol/tokens.txt+1−1
@@ -1,3 +1,3 @@
1−/tests/golden/inline-leftout-cencol/source.jibb:1:7: `%:` is left out: indentation covers it
1+/tests/golden/inline-leftout-cencol/source.jibb:1:7: `%:` is left out: indentation covers it; a call is (f a b)
22++ x %: f a b
33 ^
tests/golden/inline-leftout-cencol/tree.txt+1−1
@@ -1,3 +1,3 @@
1−/tests/golden/inline-leftout-cencol/source.jibb:1:7: `%:` is left out: indentation covers it
1+/tests/golden/inline-leftout-cencol/source.jibb:1:7: `%:` is left out: indentation covers it; a call is (f a b)
22++ x %: f a b
33 ^
tests/golden/inline-leftout-cenhep/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Runes, "Left out on purpose": "Tall forms such as `:~`, `:*`, `%:` and `%=`, the closers `==` and `--`, and other wide forms such as `^-(…)` and `?-(…)`: indentation covers them."
2+tests: `%-`, a tall form the list doesn't name
3+expect: error at 1:7 — `%-` is left out: indentation covers it; a call is (f a b) (design question 30)
tests/golden/inline-leftout-cenhep/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ x %-(f a)
tests/golden/inline-leftout-cenhep/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-cenhep/source.jibb:1:7: `%-` is left out: indentation covers it; a call is (f a b)
2+++ x %-(f a)
3+ ^
tests/golden/inline-leftout-cenhep/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-cenhep/source.jibb:1:7: `%-` is left out: indentation covers it; a call is (f a b)
2+++ x %-(f a)
3+ ^
tests/golden/inline-leftout-colhep/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Runes, "Left out on purpose": "Tall forms such as `:~`, `:*`, `%:` and `%=`, the closers `==` and `--`, and other wide forms such as `^-(…)` and `?-(…)`: indentation covers them."
2+tests: `:-`, a tall form the list doesn't name
3+expect: error at 1:7 — `:-` is left out: indentation covers it; write a cell as [a b] (design question 30)
tests/golden/inline-leftout-colhep/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ x :-(a b)
tests/golden/inline-leftout-colhep/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-colhep/source.jibb:1:7: `:-` is left out: indentation covers it; write a cell as [a b]
2+++ x :-(a b)
3+ ^
tests/golden/inline-leftout-colhep/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-colhep/source.jibb:1:7: `:-` is left out: indentation covers it; write a cell as [a b]
2+++ x :-(a b)
3+ ^
tests/golden/inline-leftout-miccol/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Runes, "Left out on purpose": "Sail's `;` runes: layout is Jibb's elements." and "Tall forms such as `:~`, `:*`, `%:` and `%=` … indentation covers them."
2+tests: `;:`, Hoon's call of a gate on several arguments, which is not a Sail rune
3+expect: error at 1:6 — `;:` is left out: nest the calls, as (add a (add b c)) (design question 30)
tests/golden/inline-leftout-miccol/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ x ;:(add a b)
tests/golden/inline-leftout-miccol/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-miccol/source.jibb:1:6: `;:` is left out: nest the calls, as (add a (add b c))
2+++ x ;:(add a b)
3+ ^
tests/golden/inline-leftout-miccol/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-miccol/source.jibb:1:6: `;:` is left out: nest the calls, as (add a (add b c))
2+++ x ;:(add a b)
3+ ^
tests/golden/inline-leftout-sigpam-wide/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Runes, "Left out on purpose": "Tall forms such as `:~`, `:*`, `%:` and `%=`, the closers `==` and `--`, and other wide forms such as `^-(…)` and `?-(…)`: indentation covers them."
2+tests: a wide `~&`, which the list doesn't name
3+expect: error at 1:8 — a rune is followed by a space; the wide form `~&(…)` is left out: indentation covers it (design question 30)
tests/golden/inline-leftout-sigpam-wide/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ x ~&(a b)
tests/golden/inline-leftout-sigpam-wide/tokens.txtnew file+8
@@ -0,0 +1,8 @@
1+1:1 glyph ++
2+1:4 name x
3+1:6 glyph ~&
4+1:8 tight glyph (
5+1:9 tight name a
6+1:11 name b
7+1:12 tight glyph )
8+1:13 NEWLINE
tests/golden/inline-leftout-sigpam-wide/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-sigpam-wide/source.jibb:1:8: expected a space after `~&`, found `(`; the wide form `~&(…)` is left out: indentation covers it
2+++ x ~&(a b)
3+ ^
tests/golden/inline-leftout-tisgal-2/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Runes, "Left out on purpose": "`=>`, `=<`, `.*` and `a:b`: names never shadow, and `.` reads imports too."; the EBNF: `field = [ name "=" ] mold | "=" name ; (* =msg is msg=msg *)`
2+tests: `=<` where a cell mold's field goes, whose `=` could still begin a pun, `=name`
3+expect: error at 1:8 — a field can begin with `=`, so the `<` is where the text stops being valid; `=<` is left out
tests/golden/inline-leftout-tisgal-2/source.jibbnew file+1
@@ -0,0 +1 @@
1++$ x [=< a]
tests/golden/inline-leftout-tisgal-2/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-tisgal-2/source.jibb:1:8: `=<` is left out: names never shadow, and `.` reads imports too
2++$ x [=< a]
3+ ^
tests/golden/inline-leftout-tisgal-2/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-tisgal-2/source.jibb:1:8: `=<` is left out: names never shadow, and `.` reads imports too
2++$ x [=< a]
3+ ^
tests/golden/inline-leftout-tisgal/tokens.txt+2−2
@@ -1,3 +1,3 @@
1−/tests/golden/inline-leftout-tisgal/source.jibb:1:6: `=<` is left out: names never shadow, and `.` reads imports too
1+/tests/golden/inline-leftout-tisgal/source.jibb:1:7: `=<` is left out: names never shadow, and `.` reads imports too
22++ x =< a b
3− ^
3+ ^
tests/golden/inline-leftout-tisgal/tree.txt+1−1
@@ -1,3 +1,3 @@
1−/tests/golden/inline-leftout-tisgal/source.jibb:1:6: `=<` is left out: names never shadow, and `.` reads imports too
1+/tests/golden/inline-leftout-tisgal/source.jibb:1:6: expected an expression, found `=`; `=<` is left out: names never shadow, and `.` reads imports too
22++ x =< a b
33 ^
tests/golden/inline-leftout-tisgar/tokens.txt+2−2
@@ -1,3 +1,3 @@
1−/tests/golden/inline-leftout-tisgar/source.jibb:1:6: `=>` is left out: names never shadow, and `.` reads imports too
1+/tests/golden/inline-leftout-tisgar/source.jibb:1:7: `=>` is left out: names never shadow, and `.` reads imports too
22++ x => a b
3− ^
3+ ^
tests/golden/inline-leftout-tisgar/tree.txt+1−1
@@ -1,3 +1,3 @@
1−/tests/golden/inline-leftout-tisgar/source.jibb:1:6: `=>` is left out: names never shadow, and `.` reads imports too
1+/tests/golden/inline-leftout-tisgar/source.jibb:1:6: expected an expression, found `=`; `=>` is left out: names never shadow, and `.` reads imports too
22++ x => a b
33 ^
tests/golden/inline-leftout-tislus/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Runes, "Left out on purpose": "`=/`: `++` defines values."
2+tests: `=+`, a rune like `=/` that the list doesn't name
3+expect: error at 1:6 — no expression starts with `=`; `=+` is left out: `++` defines values (design question 30)
tests/golden/inline-leftout-tislus/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ x =+(a b)
tests/golden/inline-leftout-tislus/tokens.txtnew file+9
@@ -0,0 +1,9 @@
1+1:1 glyph ++
2+1:4 name x
3+1:6 glyph =
4+1:7 tight glyph +
5+1:8 tight glyph (
6+1:9 tight name a
7+1:11 name b
8+1:12 tight glyph )
9+1:13 NEWLINE
tests/golden/inline-leftout-tislus/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-tislus/source.jibb:1:6: expected an expression, found `=`; `=+` is left out: `++` defines values
2+++ x =+(a b)
3+ ^
tests/golden/inline-leftout-tistis/tokens.txt+2−2
@@ -1,3 +1,3 @@
1−/tests/golden/inline-leftout-tistis/source.jibb:4:1: the closer `==` is left out: indentation covers it
1+/tests/golden/inline-leftout-tistis/source.jibb:4:2: the closer `==` is left out: indentation covers it
22==
3−^
3+ ^
tests/golden/inline-leftout-tistis/tree.txt+1−1
@@ -1,3 +1,3 @@
1−/tests/golden/inline-leftout-tistis/source.jibb:4:1: the closer `==` is left out: indentation covers it
1+/tests/golden/inline-leftout-tistis/source.jibb:4:1: expected a definition, found `=`; the closer `==` is left out: indentation covers it
22==
33^
tests/golden/inline-leftout-wutcol-2/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Runes, "Left out on purpose": "`?+`, `?:`: `?-` is the branch."
2+tests: `?:` after a call's operand, where only another operand or the end of the line can follow
3+expect: error at 1:8 — no operand starts with `?`, so the `?` is where the text stops being valid; `?:` is left out (?- is the branch)
tests/golden/inline-leftout-wutcol-2/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ x a ?:
tests/golden/inline-leftout-wutcol-2/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-wutcol-2/source.jibb:1:9: `?:` is left out: `?-` is the branch
2+++ x a ?:
3+ ^
tests/golden/inline-leftout-wutcol-2/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-wutcol-2/source.jibb:1:8: expected an expression, found `?`; `?:` is left out: `?-` is the branch
2+++ x a ?:
3+ ^
tests/golden/inline-leftout-wutsig/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Runes, "Left out on purpose": "`?+`, `?:`: `?-` is the branch."
2+tests: `?~`, a branching rune the list doesn't name
3+expect: error at 1:7 — `?~` is left out: `?-` is the branch (design question 30)
tests/golden/inline-leftout-wutsig/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ x ?~(a b c)
tests/golden/inline-leftout-wutsig/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-wutsig/source.jibb:1:7: `?~` is left out: `?-` is the branch
2+++ x ?~(a b c)
3+ ^
tests/golden/inline-leftout-wutsig/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-leftout-wutsig/source.jibb:1:7: `?~` is left out: `?-` is the branch
2+++ x ?~(a b c)
3+ ^
tests/golden/inline-pattern-duration-bad/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, the EBNF: `pattern = term | number | string | ship | loobean | "~" | "*" | name | "[" pattern { pattern } "]" ;`; "Patterns take terms, numbers, strings without `{…}`, ships, loobeans and `~`, not lists or pairs."
2+tests: a duration as a pattern
3+expect: error at 3:7 — patterns take no durations; `~s` could still begin a ship, as ~sev, so the 3 is the first character no pattern takes (design question 24)
tests/golden/inline-pattern-duration-bad/source.jibbnew file+3
@@ -0,0 +1,3 @@
1+++ f
2+ ?- a
3+ ~s30 1
tests/golden/inline-pattern-duration-bad/tokens.txtnew file+11
@@ -0,0 +1,11 @@
1+1:1 glyph ++
2+1:4 name f
3+2:3 INDENT
4+2:3 glyph ?-
5+2:7 name a
6+3:5 INDENT
7+3:5 lit ~s30
8+3:11 lit 1
9+3:12 DEDENT
10+3:12 DEDENT
11+3:12 NEWLINE
tests/golden/inline-pattern-duration-bad/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-pattern-duration-bad/source.jibb:3:7: expected a pattern, found `~s30`; patterns take no durations: compare values with ?- (eq a b)
2+ ~s30 1
3+ ^
tests/golden/inline-pattern-face-bad/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Patterns: "A name in a pattern always binds anew"; the EBNF: `pattern = term | number | string | ship | loobean | "~" | "*" | name | "[" pattern { pattern } "]" ;`
2+tests: a cell pattern with a face, `a=1`
3+expect: error at 3:7 — patterns take no `name=`: after the name a, which binds, the `=` starts no pattern
tests/golden/inline-pattern-face-bad/source.jibbnew file+3
@@ -0,0 +1,3 @@
1+++ f
2+ ?- a
3+ [a=1] 1
tests/golden/inline-pattern-face-bad/tokens.txtnew file+15
@@ -0,0 +1,15 @@
1+1:1 glyph ++
2+1:4 name f
3+2:3 INDENT
4+2:3 glyph ?-
5+2:7 name a
6+3:5 INDENT
7+3:5 glyph [
8+3:6 tight name a
9+3:7 tight glyph =
10+3:8 tight lit 1
11+3:9 tight glyph ]
12+3:12 lit 1
13+3:13 DEDENT
14+3:13 DEDENT
15+3:13 NEWLINE
tests/golden/inline-pattern-face-bad/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/inline-pattern-face-bad/source.jibb:3:7: expected a space between items, found `=`; patterns take no `name=`: a bare name binds, as [a b]
2+ [a=1] 1
3+ ^
tests/golden/lex-blob-bad-1/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Literals table: the Ship, Date, Duration and Knot rows (`~zod`, `~2026.10.23`, `~s30`, `~.my-post`); Decisions: "Hoon's runes as keywords, and its literals"
2+tests: a `~0` literal, which Hoon reads as a blob (a jammed noun) and Jibb doesn't write
3+expect: error at 1:8 — Jibb writes no blob literals; no Jibb literal goes on from `~0` with a letter (a date's year has no leading 0)
tests/golden/lex-blob-bad-1/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ x ~0v0000d
tests/golden/lex-blob-bad-1/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-blob-bad-1/source.jibb:1:8: Jibb writes no blob literals
2+++ x ~0v0000d
3+ ^
tests/golden/lex-blob-bad-1/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-blob-bad-1/source.jibb:1:8: Jibb writes no blob literals
2+++ x ~0v0000d
3+ ^
tests/golden/lex-closer-bad-1/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Lexical rules: "Brackets opened and closed on one line work as usual."
2+tests: a `)` that closes no bracket
3+expect: error at 1:11 — the group closed at 1:10, so line 1 should end; this `)` closes no bracket
tests/golden/lex-closer-bad-1/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ x (f a))
tests/golden/lex-closer-bad-1/tokens.txtnew file+8
@@ -0,0 +1,8 @@
1+1:1 glyph ++
2+1:4 name x
3+1:6 glyph (
4+1:7 tight name f
5+1:9 name a
6+1:10 tight glyph )
7+1:11 tight glyph )
8+1:12 NEWLINE
tests/golden/lex-closer-bad-1/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-closer-bad-1/source.jibb:1:11: expected the end of the line, found `)`; this `)` closes no bracket
2+++ x (f a))
3+ ^
tests/golden/lex-closer-bad-2/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Runes, "Left out on purpose": "Tall forms such as `:~`, `:*`, `%:` and `%=`, the closers `==` and `--`, and other wide forms such as `^-(…)` and `?-(…)`: indentation covers them."
2+tests: a `?-` closed with `==`, as Hoon writes it
3+expect: error at 4:3 — the closer `==` is left out: indentation covers it
tests/golden/lex-closer-bad-2/source.jibbnew file+4
@@ -0,0 +1,4 @@
1+++ f
2+ ?- a
3+ %b 1
4+ ==
tests/golden/lex-closer-bad-2/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-closer-bad-2/source.jibb:4:4: the closer `==` is left out: indentation covers it
2+ ==
3+ ^
tests/golden/lex-closer-bad-2/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-closer-bad-2/source.jibb:4:3: the closer `==` is left out: indentation covers it
2+ ==
3+ ^
tests/golden/lex-closer-bad-3/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Lexical rules: "Open brackets: a bracket open at line end takes one item per deeper line and closes at the first line that isn't deeper, with no closer. Brackets opened and closed on one line work as usual."; the EBNF: `open = INDENT line { NEWLINE line } DEDENT ;`
2+tests: an open list closed by hand on a line of its own
3+expect: error at 3:3 — a bracket open at the end of its line takes no closer: its items end at the first line that isn't deeper
tests/golden/lex-closer-bad-3/source.jibbnew file+3
@@ -0,0 +1,3 @@
1+++ x ~[
2+ a
3+ ]
tests/golden/lex-closer-bad-3/tokens.txtnew file+9
@@ -0,0 +1,9 @@
1+1:1 glyph ++
2+1:4 name x
3+1:6 glyph ~[
4+2:3 INDENT
5+2:3 name a
6+3:3 NEWLINE
7+3:3 glyph ]
8+3:4 DEDENT
9+3:4 NEWLINE
tests/golden/lex-closer-bad-3/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-closer-bad-3/source.jibb:3:3: expected an item, found `]`; a bracket open at the end of its line takes no closer: its items end at the first line that isn't deeper
2+ ]
3+ ^
tests/golden/lex-codepoint-bad-1/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Literals table: the String row, "`@t`, a cord; … there is no `'…'` form"; Decisions: "Hoon's runes as keywords, and its literals"
2+tests: a `~-` literal, Hoon's @c, here of a control character
3+expect: error at 1:7 — Jibb writes no @c literals
tests/golden/lex-codepoint-bad-1/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ x ~-~1.
tests/golden/lex-codepoint-bad-1/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-codepoint-bad-1/source.jibb:1:7: Jibb writes no @c literals
2+++ x ~-~1.
3+ ^
tests/golden/lex-codepoint-bad-1/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-codepoint-bad-1/source.jibb:1:7: Jibb writes no @c literals
2+++ x ~-~1.
3+ ^
tests/golden/lex-date-bad-3/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Literals table, the Date row: `~2026.10.23`, `~2026.10.23..14.30.00`, "`@da`"
2+tests: a date with five sub-second groups, one more than Hoon's reader takes
3+expect: error at 1:43 — a date or duration takes at most four sub-second groups; the fifth begins at the dot (design question 29)
tests/golden/lex-date-bad-3/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ x ~2026.1.1..1.1.1..0000.0000.0000.0000.0000
tests/golden/lex-date-bad-3/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-date-bad-3/source.jibb:1:43: a date or duration takes at most four sub-second groups
2+++ x ~2026.1.1..1.1.1..0000.0000.0000.0000.0000
3+ ^
tests/golden/lex-date-bad-3/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-date-bad-3/source.jibb:1:43: a date or duration takes at most four sub-second groups
2+++ x ~2026.1.1..1.1.1..0000.0000.0000.0000.0000
3+ ^
tests/golden/lex-duration-bad-2/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Literals table, the Duration row: `~s30`, `~h1.m30`, "`@dr`"
2+tests: a duration with five sub-second groups, one more than Hoon's reader takes
3+expect: error at 1:30 — a date or duration takes at most four sub-second groups; the fifth begins at the dot (design question 29)
tests/golden/lex-duration-bad-2/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ x ~s1..0000.0000.0000.0000.0000
tests/golden/lex-duration-bad-2/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-duration-bad-2/source.jibb:1:30: a date or duration takes at most four sub-second groups
2+++ x ~s1..0000.0000.0000.0000.0000
3+ ^
tests/golden/lex-duration-bad-2/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-duration-bad-2/source.jibb:1:30: a date or duration takes at most four sub-second groups
2+++ x ~s1..0000.0000.0000.0000.0000
3+ ^
tests/golden/lex-name-bad-5/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, the EBNF: `name = lower { lower | digit | "-" } ;`
2+tests: a name that starts with a capital letter
3+expect: error at 1:4 — a name starts with a lowercase letter; a capital begins a type variable, which can't be defined
tests/golden/lex-name-bad-5/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ Foo 1
tests/golden/lex-name-bad-5/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-name-bad-5/source.jibb:1:5: a type variable is one capital letter
2+++ Foo 1
3+ ^
tests/golden/lex-name-bad-5/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-name-bad-5/source.jibb:1:4: expected a name, found `F`; a name starts with a lowercase letter
2+++ Foo 1
3+ ^
tests/golden/lex-name-bad-6/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, the EBNF: `definition = "+$" name ( mold | INDENT mold DEDENT ) | "++" name ( expr | body ) ;` and `wing = name { "." name } ;`
2+tests: a wing where a definition's name goes
3+expect: error at 1:5 — a definition's name has no `.`; `a` alone could still be the name
tests/golden/lex-name-bad-6/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ a.b 1
tests/golden/lex-name-bad-6/tokens.txtnew file+4
@@ -0,0 +1,4 @@
1+1:1 glyph ++
2+1:4 wing a.b
3+1:8 lit 1
4+1:9 NEWLINE
tests/golden/lex-name-bad-6/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-name-bad-6/source.jibb:1:5: expected a name, found `a.b`; a name has no `.`
2+++ a.b 1
3+ ^
tests/golden/lex-open-bracket-bad-4/about.txt+1−1
@@ -1,3 +1,3 @@
11source: Grammar tab, Lexical rules: "Open brackets: a bracket open at line end takes one item per deeper line and closes at the first line that isn't deeper, with no closer. Brackets opened and closed on one line work as usual."; the EBNF: `open = INDENT line { NEWLINE line } DEDENT ;`
22tests: two brackets left open at the end of one line, `(` and `~[`
3−expect: unclear — the rule says what "a bracket open at line end" does, not what happens when two are: does the last take the deeper lines and both close at the first line that isn't deeper, or is the `(` unclosed (the EBNF's open belongs to one bracket), an error at the end of the file? (corpus question 4)
3+expect: unclear — the rule says what "a bracket open at line end" does, not what happens when two are: does the last take the deeper lines and both close at the first line that isn't deeper, or is the `(` unclosed (the EBNF's open belongs to one bracket), an error at the end of line 1, at 1:18, since once the `~[` takes the deeper lines no later line can close the `(`? (corpus question 4)
tests/golden/lex-open-bracket-bad-4/tree.txt+3−3
@@ -1,3 +1,3 @@
1−/tests/golden/lex-open-bracket-bad-4/source.jibb:2:15: expected `)` to close the `(` at 1:6, found the end of the file; only the last bracket open at the end of a line takes the deeper lines
2− (text "a")
3− ^
1+/tests/golden/lex-open-bracket-bad-4/source.jibb:1:18: expected `)` to close the `(` at 1:6, found the end of the line; the deeper lines go to the last bracket or rune left open on this line
2+++ x (column ~ ~[
3+ ^
tests/golden/lex-open-bracket-bad-5/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Lexical rules: "Open brackets: a bracket open at line end takes one item per deeper line and closes at the first line that isn't deeper, with no closer. Brackets opened and closed on one line work as usual."; the EBNF: `open = INDENT line { NEWLINE line } DEDENT ;`; `"~&" expr body`
2+tests: a `~&` whose line ends with an open list: the list takes the deeper line, which leaves the `~&` no body below
3+expect: error at 1:13 — once the `~[` takes the deeper lines, no later line can give the `~&` its body, so the text stops being valid at the end of line 1 (design question 21)
tests/golden/lex-open-bracket-bad-5/source.jibbnew file+3
@@ -0,0 +1,3 @@
1+++ x ~& a ~[
2+ 1
3+++ y 1
tests/golden/lex-open-bracket-bad-5/tokens.txtnew file+13
@@ -0,0 +1,13 @@
1+1:1 glyph ++
2+1:4 name x
3+1:6 glyph ~&
4+1:9 name a
5+1:11 glyph ~[
6+2:3 INDENT
7+2:3 lit 1
8+3:1 DEDENT
9+3:1 NEWLINE
10+3:1 glyph ++
11+3:4 name y
12+3:6 lit 1
13+3:7 NEWLINE
tests/golden/lex-open-bracket-bad-5/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-open-bracket-bad-5/source.jibb:1:13: expected `~&`'s body on deeper lines, found the end of the line; the deeper lines go to the last bracket or rune left open on this line
2+++ x ~& a ~[
3+ ^
tests/golden/lex-tight-ctor-bad-1/tree.txt+1−1
@@ -1,3 +1,3 @@
1−/tests/golden/lex-tight-ctor-bad-1/source.jibb:1:20: expected a term right after `|=`, found a space
1+/tests/golden/lex-tight-ctor-bad-1/source.jibb:1:20: expected `(` or a term right after `|=`, found a space; a case's constructor takes its term with no space, as |=%got
22++ x (state.cart |= %got)
33 ^
tests/golden/lex-tight-opener-bad-2/tree.txt+1−1
@@ -1,3 +1,3 @@
1−/tests/golden/lex-tight-opener-bad-2/source.jibb:1:17: expected a term right after `|=`, found a space
1+/tests/golden/lex-tight-opener-bad-2/source.jibb:1:17: expected `(` or a term right after `|=`, found a space; a gate in an operand is |=(a body)
22++ x (turn ps |= (p title.p))
33 ^
tests/golden/lex-tight-pair-bad-2/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Lexical rules: "Tight forms: `a+b`, `a.b`, `` `x ``, `|=%got` and the openers `~[`, `|=(`, `$?(`, `$-(` take no spaces. A `(` right after a wing is a change: `m(note=text)` changes, `m (note text)` calls. `%/` starts an application path, `%/blog/(slug)`."
2+tests: a pair whose operand is missing at the end of its line, with a definition below
3+expect: error at 1:8 — a pair takes its operand right after the `+`, and no later line can supply it, so the text stops being valid at the end of line 1
tests/golden/lex-tight-pair-bad-2/source.jibbnew file+2
@@ -0,0 +1,2 @@
1+++ x a+
2+++ y 1
tests/golden/lex-tight-pair-bad-2/tokens.txtnew file+9
@@ -0,0 +1,9 @@
1+1:1 glyph ++
2+1:4 name x
3+1:6 name a
4+1:7 tight glyph +
5+2:1 NEWLINE
6+2:1 glyph ++
7+2:4 name y
8+2:6 lit 1
9+2:7 NEWLINE
tests/golden/lex-tight-pair-bad-2/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-tight-pair-bad-2/source.jibb:1:8: expected an operand right after `+`, found the end of the line
2+++ x a+
3+ ^
tests/golden/lex-tight-pair-bad-3/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar tab, Lexical rules: "Tight forms: `a+b`, `a.b`, `` `x ``, `|=%got` and the openers `~[`, `|=(`, `$?(`, `$-(` take no spaces. A `(` right after a wing is a change: `m(note=text)` changes, `m (note text)` calls. `%/` starts an application path, `%/blog/(slug)`."
2+tests: a space inside a pair, then a bad character later on the line
3+expect: error at 1:8 — the space after `+` breaks the pair before the `%[` is reached
tests/golden/lex-tight-pair-bad-3/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ x a+ %[
tests/golden/lex-tight-pair-bad-3/tokens.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-tight-pair-bad-3/source.jibb:1:10: `%` begins a term, a loobean or `%/`
2+++ x a+ %[
3+ ^
tests/golden/lex-tight-pair-bad-3/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+/tests/golden/lex-tight-pair-bad-3/source.jibb:1:8: expected an operand right after `+`, found a space
2+++ x a+ %[
3+ ^
tests/lib/jibb.hoon+1007−423
@@ -21,689 +21,1273 @@
2121::
2222/+ jibb
2323/* src-1 %jibb /tests/golden/doc-core-02-update/source/jibb
24+/* tok-1 %txt /tests/golden/doc-core-02-update/tokens/txt
25+/* tre-1 %txt /tests/golden/doc-core-02-update/tree/txt
2426/* src-2 %jibb /tests/golden/doc-grammar-01-imports/source/jibb
27+/* tok-2 %txt /tests/golden/doc-grammar-01-imports/tokens/txt
28+/* tre-2 %txt /tests/golden/doc-grammar-01-imports/tree/txt
2529/* src-3 %jibb /tests/golden/doc-grammar-02-buttons/source/jibb
30+/* tok-3 %txt /tests/golden/doc-grammar-02-buttons/tokens/txt
31+/* tre-3 %txt /tests/golden/doc-grammar-02-buttons/tree/txt
2632/* src-4 %jibb /tests/golden/doc-grammar-03-view-day/source/jibb
33+/* tok-4 %txt /tests/golden/doc-grammar-03-view-day/tokens/txt
34+/* tre-4 %txt /tests/golden/doc-grammar-03-view-day/tree/txt
2735/* src-5 %jibb /tests/golden/doc-grammar-04-step/source/jibb
36+/* tok-5 %txt /tests/golden/doc-grammar-04-step/tokens/txt
37+/* tre-5 %txt /tests/golden/doc-grammar-04-step/tree/txt
2838/* src-6 %jibb /tests/golden/doc-grammar-06-cart-store/source/jibb
39+/* tok-6 %txt /tests/golden/doc-grammar-06-cart-store/tokens/txt
40+/* tre-6 %txt /tests/golden/doc-grammar-06-cart-store/tree/txt
2941/* src-7 %jibb /tests/golden/doc-grammar-07-basket/source/jibb
42+/* tok-7 %txt /tests/golden/doc-grammar-07-basket/tokens/txt
43+/* tre-7 %txt /tests/golden/doc-grammar-07-basket/tree/txt
3044/* src-8 %jibb /tests/golden/doc-overview-01-cmd-sub/source/jibb
45+/* tok-8 %txt /tests/golden/doc-overview-01-cmd-sub/tokens/txt
46+/* tre-8 %txt /tests/golden/doc-overview-01-cmd-sub/tree/txt
3147/* src-9 %jibb /tests/golden/doc-overview-02-theme/source/jibb
48+/* tok-9 %txt /tests/golden/doc-overview-02-theme/tokens/txt
49+/* tre-9 %txt /tests/golden/doc-overview-02-theme/tree/txt
3250/* src-10 %jibb /tests/golden/doc-overview-04-todo-api/source/jibb
51+/* tok-10 %txt /tests/golden/doc-overview-04-todo-api/tokens/txt
52+/* tre-10 %txt /tests/golden/doc-overview-04-todo-api/tree/txt
3353/* src-11 %jibb /tests/golden/doc-overview-08-about/source/jibb
54+/* tok-11 %txt /tests/golden/doc-overview-08-about/tokens/txt
55+/* tre-11 %txt /tests/golden/doc-overview-08-about/tree/txt
3456/* src-12 %jibb /tests/golden/doc-overview-09-blog-index/source/jibb
57+/* tok-12 %txt /tests/golden/doc-overview-09-blog-index/tokens/txt
58+/* tre-12 %txt /tests/golden/doc-overview-09-blog-index/tree/txt
3559/* src-13 %jibb /tests/golden/doc-overview-10-todo-list/source/jibb
60+/* tok-13 %txt /tests/golden/doc-overview-10-todo-list/tokens/txt
61+/* tre-13 %txt /tests/golden/doc-overview-10-todo-list/tree/txt
3662/* src-14 %jibb /tests/golden/doc-overview-11-index/source/jibb
63+/* tok-14 %txt /tests/golden/doc-overview-11-index/tokens/txt
64+/* tre-14 %txt /tests/golden/doc-overview-11-index/tree/txt
3765/* src-15 %jibb /tests/golden/inline-base32/source/jibb
66+/* tok-15 %txt /tests/golden/inline-base32/tokens/txt
67+/* tre-15 %txt /tests/golden/inline-base32/tree/txt
3868/* src-16 %jibb /tests/golden/inline-call/source/jibb
69+/* tok-16 %txt /tests/golden/inline-call/tokens/txt
70+/* tre-16 %txt /tests/golden/inline-call/tree/txt
3971/* src-17 %jibb /tests/golden/inline-cell/source/jibb
72+/* tok-17 %txt /tests/golden/inline-cell/tokens/txt
73+/* tre-17 %txt /tests/golden/inline-cell/tree/txt
4074/* src-18 %jibb /tests/golden/inline-change-done/source/jibb
75+/* tok-18 %txt /tests/golden/inline-change-done/tokens/txt
76+/* tre-18 %txt /tests/golden/inline-change-done/tree/txt
4177/* src-19 %jibb /tests/golden/inline-change-draft/source/jibb
78+/* tok-19 %txt /tests/golden/inline-change-draft/tokens/txt
79+/* tre-19 %txt /tests/golden/inline-change-draft/tree/txt
4280/* src-20 %jibb /tests/golden/inline-crash/source/jibb
81+/* tok-20 %txt /tests/golden/inline-crash/tokens/txt
82+/* tre-20 %txt /tests/golden/inline-crash/tree/txt
4383/* src-21 %jibb /tests/golden/inline-ctor-typed/source/jibb
84+/* tok-21 %txt /tests/golden/inline-ctor-typed/tokens/txt
85+/* tre-21 %txt /tests/golden/inline-ctor-typed/tree/txt
4486/* src-22 %jibb /tests/golden/inline-date/source/jibb
87+/* tok-22 %txt /tests/golden/inline-date/tokens/txt
88+/* tre-22 %txt /tests/golden/inline-date/tree/txt
4589/* src-23 %jibb /tests/golden/inline-decimal/source/jibb
90+/* tok-23 %txt /tests/golden/inline-decimal/tokens/txt
91+/* tre-23 %txt /tests/golden/inline-decimal/tree/txt
4692/* src-24 %jibb /tests/golden/inline-duration/source/jibb
93+/* tok-24 %txt /tests/golden/inline-duration/tokens/txt
94+/* tre-24 %txt /tests/golden/inline-duration/tree/txt
4795/* src-25 %jibb /tests/golden/inline-fold-mold/source/jibb
96+/* tok-25 %txt /tests/golden/inline-fold-mold/tokens/txt
97+/* tre-25 %txt /tests/golden/inline-fold-mold/tree/txt
4898/* src-26 %jibb /tests/golden/inline-gate-mold/source/jibb
99+/* tok-26 %txt /tests/golden/inline-gate-mold/tokens/txt
100+/* tre-26 %txt /tests/golden/inline-gate-mold/tree/txt
49101/* src-27 %jibb /tests/golden/inline-gate-samples/source/jibb
102+/* tok-27 %txt /tests/golden/inline-gate-samples/tokens/txt
103+/* tre-27 %txt /tests/golden/inline-gate-samples/tree/txt
50104/* src-28 %jibb /tests/golden/inline-gate-wide/source/jibb
105+/* tok-28 %txt /tests/golden/inline-gate-wide/tokens/txt
106+/* tre-28 %txt /tests/golden/inline-gate-wide/tree/txt
51107/* src-29 %jibb /tests/golden/inline-generic-mold/source/jibb
108+/* tok-29 %txt /tests/golden/inline-generic-mold/tokens/txt
109+/* tre-29 %txt /tests/golden/inline-generic-mold/tree/txt
52110/* src-30 %jibb /tests/golden/inline-hex/source/jibb
111+/* tok-30 %txt /tests/golden/inline-hex/tokens/txt
112+/* tre-30 %txt /tests/golden/inline-hex/tree/txt
53113/* src-31 %jibb /tests/golden/inline-import-mark-face-bad/source/jibb
54−/* src-32 %jibb /tests/golden/inline-imports-after-definition/source/jibb
55−/* src-33 %jibb /tests/golden/inline-island/source/jibb
56−/* src-34 %jibb /tests/golden/inline-kinds/source/jibb
57−/* src-35 %jibb /tests/golden/inline-knot/source/jibb
58−/* src-36 %jibb /tests/golden/inline-leftout-barcab/source/jibb
59−/* src-37 %jibb /tests/golden/inline-leftout-barcen/source/jibb
60−/* src-38 %jibb /tests/golden/inline-leftout-barhep/source/jibb
61−/* src-39 %jibb /tests/golden/inline-leftout-bartar/source/jibb
62−/* src-40 %jibb /tests/golden/inline-leftout-buc-paren/source/jibb
63−/* src-41 %jibb /tests/golden/inline-leftout-buccen/source/jibb
64−/* src-42 %jibb /tests/golden/inline-leftout-cencol/source/jibb
65−/* src-43 %jibb /tests/golden/inline-leftout-centis/source/jibb
66−/* src-44 %jibb /tests/golden/inline-leftout-colon-wing/source/jibb
67−/* src-45 %jibb /tests/golden/inline-leftout-colsig/source/jibb
68−/* src-46 %jibb /tests/golden/inline-leftout-coltar/source/jibb
69−/* src-47 %jibb /tests/golden/inline-leftout-dottar/source/jibb
70−/* src-48 %jibb /tests/golden/inline-leftout-dottis/source/jibb
71−/* src-49 %jibb /tests/golden/inline-leftout-faslus/source/jibb
72−/* src-50 %jibb /tests/golden/inline-leftout-hephep/source/jibb
73−/* src-51 %jibb /tests/golden/inline-leftout-kethep-wide/source/jibb
74−/* src-52 %jibb /tests/golden/inline-leftout-kettar/source/jibb
75−/* src-53 %jibb /tests/golden/inline-leftout-sail/source/jibb
76−/* src-54 %jibb /tests/golden/inline-leftout-sigbar/source/jibb
77−/* src-55 %jibb /tests/golden/inline-leftout-signed-float-auras/source/jibb
78−/* src-56 %jibb /tests/golden/inline-leftout-tis-paren/source/jibb
79−/* src-57 %jibb /tests/golden/inline-leftout-tisfas/source/jibb
80−/* src-58 %jibb /tests/golden/inline-leftout-tisgal/source/jibb
81−/* src-59 %jibb /tests/golden/inline-leftout-tisgar/source/jibb
82−/* src-60 %jibb /tests/golden/inline-leftout-tistis/source/jibb
83−/* src-61 %jibb /tests/golden/inline-leftout-wutcol/source/jibb
84−/* src-62 %jibb /tests/golden/inline-leftout-wuthep-wide/source/jibb
85−/* src-63 %jibb /tests/golden/inline-leftout-wutlus/source/jibb
86−/* src-64 %jibb /tests/golden/inline-leftout-wutzap/source/jibb
87−/* src-65 %jibb /tests/golden/inline-leftout-zap-not/source/jibb
88−/* src-66 %jibb /tests/golden/inline-leftout-zapgar/source/jibb
89−/* src-67 %jibb /tests/golden/inline-list/source/jibb
90−/* src-68 %jibb /tests/golden/inline-list-parens/source/jibb
91−/* src-69 %jibb /tests/golden/inline-literal-defaults/source/jibb
92−/* src-70 %jibb /tests/golden/inline-load-slug/source/jibb
93−/* src-71 %jibb /tests/golden/inline-local-names/source/jibb
94−/* src-72 %jibb /tests/golden/inline-loobean/source/jibb
95−/* src-73 %jibb /tests/golden/inline-mark-digit/source/jibb
96−/* src-74 %jibb /tests/golden/inline-module-definitions/source/jibb
97−/* src-75 %jibb /tests/golden/inline-mold-add/source/jibb
98−/* src-76 %jibb /tests/golden/inline-mold-any-empty/source/jibb
99−/* src-77 %jibb /tests/golden/inline-mold-atoms/source/jibb
100−/* src-78 %jibb /tests/golden/inline-mold-constants/source/jibb
101−/* src-79 %jibb /tests/golden/inline-mold-containers/source/jibb
102−/* src-80 %jibb /tests/golden/inline-mold-gate/source/jibb
103−/* src-81 %jibb /tests/golden/inline-mold-generic/source/jibb
104−/* src-82 %jibb /tests/golden/inline-mold-opaque/source/jibb
105−/* src-83 %jibb /tests/golden/inline-mold-paths/source/jibb
106−/* src-84 %jibb /tests/golden/inline-mold-records/source/jibb
107−/* src-85 %jibb /tests/golden/inline-namespaces/source/jibb
108−/* src-86 %jibb /tests/golden/inline-no-operators/source/jibb
109−/* src-87 %jibb /tests/golden/inline-no-subs/source/jibb
110−/* src-88 %jibb /tests/golden/inline-null/source/jibb
111−/* src-89 %jibb /tests/golden/inline-pair/source/jibb
112−/* src-90 %jibb /tests/golden/inline-pairs-two-items/source/jibb
113−/* src-91 %jibb /tests/golden/inline-path/source/jibb
114−/* src-92 %jibb /tests/golden/inline-pattern-any/source/jibb
115−/* src-93 %jibb /tests/golden/inline-pattern-cell/source/jibb
116−/* src-94 %jibb /tests/golden/inline-pattern-crash-arm/source/jibb
117−/* src-95 %jibb /tests/golden/inline-pattern-date-bad/source/jibb
118−/* src-96 %jibb /tests/golden/inline-pattern-eq/source/jibb
119−/* src-97 %jibb /tests/golden/inline-pattern-head-tag/source/jibb
120−/* src-98 %jibb /tests/golden/inline-pattern-interpolated-bad/source/jibb
121−/* src-99 %jibb /tests/golden/inline-pattern-list-bad/source/jibb
122−/* src-100 %jibb /tests/golden/inline-pattern-literals/source/jibb
123−/* src-101 %jibb /tests/golden/inline-pattern-loobean/source/jibb
124−/* src-102 %jibb /tests/golden/inline-pattern-move-any/source/jibb
125−/* src-103 %jibb /tests/golden/inline-pattern-name/source/jibb
126−/* src-104 %jibb /tests/golden/inline-pattern-null/source/jibb
127−/* src-105 %jibb /tests/golden/inline-pattern-pair-bad/source/jibb
128−/* src-106 %jibb /tests/golden/inline-pattern-tail-tag/source/jibb
129−/* src-107 %jibb /tests/golden/inline-pattern-term/source/jibb
130−/* src-108 %jibb /tests/golden/inline-pattern-two-tags/source/jibb
131−/* src-109 %jibb /tests/golden/inline-pattern-unit/source/jibb
132−/* src-110 %jibb /tests/golden/inline-qath/source/jibb
133−/* src-111 %jibb /tests/golden/inline-requests/source/jibb
134−/* src-112 %jibb /tests/golden/inline-scry-case/source/jibb
135−/* src-113 %jibb /tests/golden/inline-self-reference/source/jibb
136−/* src-114 %jibb /tests/golden/inline-ship/source/jibb
137−/* src-115 %jibb /tests/golden/inline-static-image/source/jibb
138−/* src-116 %jibb /tests/golden/inline-string/source/jibb
139−/* src-117 %jibb /tests/golden/inline-tag-shape/source/jibb
140−/* src-118 %jibb /tests/golden/inline-term/source/jibb
141−/* src-119 %jibb /tests/golden/inline-text-items/source/jibb
142−/* src-120 %jibb /tests/golden/inline-union-wide/source/jibb
143−/* src-121 %jibb /tests/golden/inline-unit/source/jibb
144−/* src-122 %jibb /tests/golden/inline-wide-form-rune-bad/source/jibb
145−/* src-123 %jibb /tests/golden/inline-wide-forms/source/jibb
146−/* src-124 %jibb /tests/golden/inline-wide-union-call/source/jibb
147−/* src-125 %jibb /tests/golden/inline-wings/source/jibb
148−/* src-126 %jibb /tests/golden/lex-base32-bad-1/source/jibb
149−/* src-127 %jibb /tests/golden/lex-base32-ok-1/source/jibb
150−/* src-128 %jibb /tests/golden/lex-call-open-bad-1/source/jibb
151−/* src-129 %jibb /tests/golden/lex-call-open-bad-2/source/jibb
152−/* src-130 %jibb /tests/golden/lex-call-open-bad-3/source/jibb
153−/* src-131 %jibb /tests/golden/lex-call-open-ok-1/source/jibb
154−/* src-132 %jibb /tests/golden/lex-cell-bad-1/source/jibb
155−/* src-133 %jibb /tests/golden/lex-cell-ok-1/source/jibb
156−/* src-134 %jibb /tests/golden/lex-comment-bad-1/source/jibb
157−/* src-135 %jibb /tests/golden/lex-comment-ok-1/source/jibb
158−/* src-136 %jibb /tests/golden/lex-comment-ok-2/source/jibb
159−/* src-137 %jibb /tests/golden/lex-comment-ok-3/source/jibb
160−/* src-138 %jibb /tests/golden/lex-date-bad-1/source/jibb
161−/* src-139 %jibb /tests/golden/lex-date-bad-2/source/jibb
162−/* src-140 %jibb /tests/golden/lex-date-ok-1/source/jibb
163−/* src-141 %jibb /tests/golden/lex-decimal-bad-1/source/jibb
164−/* src-142 %jibb /tests/golden/lex-decimal-bad-2/source/jibb
165−/* src-143 %jibb /tests/golden/lex-decimal-ok-1/source/jibb
166−/* src-144 %jibb /tests/golden/lex-duration-bad-1/source/jibb
167−/* src-145 %jibb /tests/golden/lex-duration-ok-1/source/jibb
168−/* src-146 %jibb /tests/golden/lex-hex-bad-1/source/jibb
169−/* src-147 %jibb /tests/golden/lex-hex-ok-1/source/jibb
170−/* src-148 %jibb /tests/golden/lex-indent-bad-1/source/jibb
171−/* src-149 %jibb /tests/golden/lex-indent-bad-2/source/jibb
172−/* src-150 %jibb /tests/golden/lex-indent-bad-3/source/jibb
173−/* src-151 %jibb /tests/golden/lex-indent-ok-1/source/jibb
174−/* src-152 %jibb /tests/golden/lex-indent-ok-2/source/jibb
175−/* src-153 %jibb /tests/golden/lex-indent-ok-3/source/jibb
176−/* src-154 %jibb /tests/golden/lex-interp-bad-1/source/jibb
177−/* src-155 %jibb /tests/golden/lex-interp-bad-2/source/jibb
178−/* src-156 %jibb /tests/golden/lex-interp-bad-3/source/jibb
179−/* src-157 %jibb /tests/golden/lex-interp-bad-4/source/jibb
180−/* src-158 %jibb /tests/golden/lex-interp-ok-1/source/jibb
181−/* src-159 %jibb /tests/golden/lex-interp-ok-2/source/jibb
182−/* src-160 %jibb /tests/golden/lex-knot-bad-1/source/jibb
183−/* src-161 %jibb /tests/golden/lex-knot-ok-1/source/jibb
184−/* src-162 %jibb /tests/golden/lex-layout-bad-1/source/jibb
185−/* src-163 %jibb /tests/golden/lex-layout-bad-2/source/jibb
186−/* src-164 %jibb /tests/golden/lex-layout-bad-3/source/jibb
187−/* src-165 %jibb /tests/golden/lex-layout-bad-4/source/jibb
188−/* src-166 %jibb /tests/golden/lex-layout-ok-1/source/jibb
189−/* src-167 %jibb /tests/golden/lex-list-bad-1/source/jibb
190−/* src-168 %jibb /tests/golden/lex-list-ok-1/source/jibb
191−/* src-169 %jibb /tests/golden/lex-loobean-bad-1/source/jibb
192−/* src-170 %jibb /tests/golden/lex-loobean-ok-1/source/jibb
193−/* src-171 %jibb /tests/golden/lex-name-bad-1/source/jibb
194−/* src-172 %jibb /tests/golden/lex-name-bad-2/source/jibb
195−/* src-173 %jibb /tests/golden/lex-name-bad-3/source/jibb
196−/* src-174 %jibb /tests/golden/lex-name-bad-4/source/jibb
197−/* src-175 %jibb /tests/golden/lex-name-ok-1/source/jibb
198−/* src-176 %jibb /tests/golden/lex-null-bad-1/source/jibb
199−/* src-177 %jibb /tests/golden/lex-null-ok-1/source/jibb
200−/* src-178 %jibb /tests/golden/lex-open-bracket-bad-1/source/jibb
201−/* src-179 %jibb /tests/golden/lex-open-bracket-bad-2/source/jibb
202−/* src-180 %jibb /tests/golden/lex-open-bracket-bad-3/source/jibb
203−/* src-181 %jibb /tests/golden/lex-open-bracket-bad-4/source/jibb
204−/* src-182 %jibb /tests/golden/lex-open-bracket-ok-1/source/jibb
205−/* src-183 %jibb /tests/golden/lex-open-bracket-ok-2/source/jibb
206−/* src-184 %jibb /tests/golden/lex-pair-binding-bad-1/source/jibb
207−/* src-185 %jibb /tests/golden/lex-pair-binding-ok-1/source/jibb
208−/* src-186 %jibb /tests/golden/lex-path-bad-1/source/jibb
209−/* src-187 %jibb /tests/golden/lex-path-ok-1/source/jibb
210−/* src-188 %jibb /tests/golden/lex-rune-layout-bad-1/source/jibb
211−/* src-189 %jibb /tests/golden/lex-rune-layout-bad-2/source/jibb
212−/* src-190 %jibb /tests/golden/lex-rune-layout-bad-3/source/jibb
213−/* src-191 %jibb /tests/golden/lex-rune-layout-bad-4/source/jibb
214−/* src-192 %jibb /tests/golden/lex-rune-layout-ok-1/source/jibb
215−/* src-193 %jibb /tests/golden/lex-ship-bad-1/source/jibb
216−/* src-194 %jibb /tests/golden/lex-ship-ok-1/source/jibb
217−/* src-195 %jibb /tests/golden/lex-spacing-bad-1/source/jibb
218−/* src-196 %jibb /tests/golden/lex-spacing-bad-2/source/jibb
219−/* src-197 %jibb /tests/golden/lex-spacing-bad-3/source/jibb
220−/* src-198 %jibb /tests/golden/lex-spacing-bad-4/source/jibb
221−/* src-199 %jibb /tests/golden/lex-spacing-ok-1/source/jibb
222−/* src-200 %jibb /tests/golden/lex-string-bad-1/source/jibb
223−/* src-201 %jibb /tests/golden/lex-string-bad-2/source/jibb
224−/* src-202 %jibb /tests/golden/lex-string-ok-1/source/jibb
225−/* src-203 %jibb /tests/golden/lex-term-bad-1/source/jibb
226−/* src-204 %jibb /tests/golden/lex-term-bad-2/source/jibb
227−/* src-205 %jibb /tests/golden/lex-term-bad-3/source/jibb
228−/* src-206 %jibb /tests/golden/lex-term-ok-1/source/jibb
229−/* src-207 %jibb /tests/golden/lex-tight-change-bad-1/source/jibb
230−/* src-208 %jibb /tests/golden/lex-tight-change-bad-2/source/jibb
231−/* src-209 %jibb /tests/golden/lex-tight-change-ok-1/source/jibb
232−/* src-210 %jibb /tests/golden/lex-tight-ctor-bad-1/source/jibb
233−/* src-211 %jibb /tests/golden/lex-tight-ctor-bad-2/source/jibb
234−/* src-212 %jibb /tests/golden/lex-tight-ctor-ok-1/source/jibb
235−/* src-213 %jibb /tests/golden/lex-tight-opener-bad-1/source/jibb
236−/* src-214 %jibb /tests/golden/lex-tight-opener-bad-2/source/jibb
237−/* src-215 %jibb /tests/golden/lex-tight-opener-bad-3/source/jibb
238−/* src-216 %jibb /tests/golden/lex-tight-opener-bad-4/source/jibb
239−/* src-217 %jibb /tests/golden/lex-tight-opener-ok-1/source/jibb
240−/* src-218 %jibb /tests/golden/lex-tight-pair-bad-1/source/jibb
241−/* src-219 %jibb /tests/golden/lex-tight-pair-ok-1/source/jibb
242−/* src-220 %jibb /tests/golden/lex-tight-qath-bad-1/source/jibb
243−/* src-221 %jibb /tests/golden/lex-tight-qath-bad-2/source/jibb
244−/* src-222 %jibb /tests/golden/lex-tight-qath-bad-3/source/jibb
245−/* src-223 %jibb /tests/golden/lex-tight-qath-ok-1/source/jibb
246−/* src-224 %jibb /tests/golden/lex-tight-unit-bad-1/source/jibb
247−/* src-225 %jibb /tests/golden/lex-tight-unit-ok-1/source/jibb
248−/* src-226 %jibb /tests/golden/lex-tight-wing-bad-1/source/jibb
249−/* src-227 %jibb /tests/golden/lex-tight-wing-ok-1/source/jibb
114+/* tok-31 %txt /tests/golden/inline-import-mark-face-bad/tokens/txt
115+/* tre-31 %txt /tests/golden/inline-import-mark-face-bad/tree/txt
116+/* src-32 %jibb /tests/golden/inline-import-root-bad/source/jibb
117+/* tok-32 %txt /tests/golden/inline-import-root-bad/tokens/txt
118+/* tre-32 %txt /tests/golden/inline-import-root-bad/tree/txt
119+/* src-33 %jibb /tests/golden/inline-imports-after-definition/source/jibb
120+/* tok-33 %txt /tests/golden/inline-imports-after-definition/tokens/txt
121+/* tre-33 %txt /tests/golden/inline-imports-after-definition/tree/txt
122+/* src-34 %jibb /tests/golden/inline-island/source/jibb
123+/* tok-34 %txt /tests/golden/inline-island/tokens/txt
124+/* tre-34 %txt /tests/golden/inline-island/tree/txt
125+/* src-35 %jibb /tests/golden/inline-kinds/source/jibb
126+/* tok-35 %txt /tests/golden/inline-kinds/tokens/txt
127+/* tre-35 %txt /tests/golden/inline-kinds/tree/txt
128+/* src-36 %jibb /tests/golden/inline-knot/source/jibb
129+/* tok-36 %txt /tests/golden/inline-knot/tokens/txt
130+/* tre-36 %txt /tests/golden/inline-knot/tree/txt
131+/* src-37 %jibb /tests/golden/inline-leftout-barcab/source/jibb
132+/* tok-37 %txt /tests/golden/inline-leftout-barcab/tokens/txt
133+/* tre-37 %txt /tests/golden/inline-leftout-barcab/tree/txt
134+/* src-38 %jibb /tests/golden/inline-leftout-barcen/source/jibb
135+/* tok-38 %txt /tests/golden/inline-leftout-barcen/tokens/txt
136+/* tre-38 %txt /tests/golden/inline-leftout-barcen/tree/txt
137+/* src-39 %jibb /tests/golden/inline-leftout-barcen-2/source/jibb
138+/* tok-39 %txt /tests/golden/inline-leftout-barcen-2/tokens/txt
139+/* tre-39 %txt /tests/golden/inline-leftout-barcen-2/tree/txt
140+/* src-40 %jibb /tests/golden/inline-leftout-barcen-3/source/jibb
141+/* tok-40 %txt /tests/golden/inline-leftout-barcen-3/tokens/txt
142+/* tre-40 %txt /tests/golden/inline-leftout-barcen-3/tree/txt
143+/* src-41 %jibb /tests/golden/inline-leftout-barhep/source/jibb
144+/* tok-41 %txt /tests/golden/inline-leftout-barhep/tokens/txt
145+/* tre-41 %txt /tests/golden/inline-leftout-barhep/tree/txt
146+/* src-42 %jibb /tests/golden/inline-leftout-bartar/source/jibb
147+/* tok-42 %txt /tests/golden/inline-leftout-bartar/tokens/txt
148+/* tre-42 %txt /tests/golden/inline-leftout-bartar/tree/txt
149+/* src-43 %jibb /tests/golden/inline-leftout-buc-paren/source/jibb
150+/* tok-43 %txt /tests/golden/inline-leftout-buc-paren/tokens/txt
151+/* tre-43 %txt /tests/golden/inline-leftout-buc-paren/tree/txt
152+/* src-44 %jibb /tests/golden/inline-leftout-buc-paren-2/source/jibb
153+/* tok-44 %txt /tests/golden/inline-leftout-buc-paren-2/tokens/txt
154+/* tre-44 %txt /tests/golden/inline-leftout-buc-paren-2/tree/txt
155+/* src-45 %jibb /tests/golden/inline-leftout-buccen/source/jibb
156+/* tok-45 %txt /tests/golden/inline-leftout-buccen/tokens/txt
157+/* tre-45 %txt /tests/golden/inline-leftout-buccen/tree/txt
158+/* src-46 %jibb /tests/golden/inline-leftout-cencol/source/jibb
159+/* tok-46 %txt /tests/golden/inline-leftout-cencol/tokens/txt
160+/* tre-46 %txt /tests/golden/inline-leftout-cencol/tree/txt
161+/* src-47 %jibb /tests/golden/inline-leftout-cenhep/source/jibb
162+/* tok-47 %txt /tests/golden/inline-leftout-cenhep/tokens/txt
163+/* tre-47 %txt /tests/golden/inline-leftout-cenhep/tree/txt
164+/* src-48 %jibb /tests/golden/inline-leftout-centis/source/jibb
165+/* tok-48 %txt /tests/golden/inline-leftout-centis/tokens/txt
166+/* tre-48 %txt /tests/golden/inline-leftout-centis/tree/txt
167+/* src-49 %jibb /tests/golden/inline-leftout-colhep/source/jibb
168+/* tok-49 %txt /tests/golden/inline-leftout-colhep/tokens/txt
169+/* tre-49 %txt /tests/golden/inline-leftout-colhep/tree/txt
170+/* src-50 %jibb /tests/golden/inline-leftout-colon-wing/source/jibb
171+/* tok-50 %txt /tests/golden/inline-leftout-colon-wing/tokens/txt
172+/* tre-50 %txt /tests/golden/inline-leftout-colon-wing/tree/txt
173+/* src-51 %jibb /tests/golden/inline-leftout-colsig/source/jibb
174+/* tok-51 %txt /tests/golden/inline-leftout-colsig/tokens/txt
175+/* tre-51 %txt /tests/golden/inline-leftout-colsig/tree/txt
176+/* src-52 %jibb /tests/golden/inline-leftout-coltar/source/jibb
177+/* tok-52 %txt /tests/golden/inline-leftout-coltar/tokens/txt
178+/* tre-52 %txt /tests/golden/inline-leftout-coltar/tree/txt
179+/* src-53 %jibb /tests/golden/inline-leftout-dottar/source/jibb
180+/* tok-53 %txt /tests/golden/inline-leftout-dottar/tokens/txt
181+/* tre-53 %txt /tests/golden/inline-leftout-dottar/tree/txt
182+/* src-54 %jibb /tests/golden/inline-leftout-dottis/source/jibb
183+/* tok-54 %txt /tests/golden/inline-leftout-dottis/tokens/txt
184+/* tre-54 %txt /tests/golden/inline-leftout-dottis/tree/txt
185+/* src-55 %jibb /tests/golden/inline-leftout-faslus/source/jibb
186+/* tok-55 %txt /tests/golden/inline-leftout-faslus/tokens/txt
187+/* tre-55 %txt /tests/golden/inline-leftout-faslus/tree/txt
188+/* src-56 %jibb /tests/golden/inline-leftout-hephep/source/jibb
189+/* tok-56 %txt /tests/golden/inline-leftout-hephep/tokens/txt
190+/* tre-56 %txt /tests/golden/inline-leftout-hephep/tree/txt
191+/* src-57 %jibb /tests/golden/inline-leftout-kethep-wide/source/jibb
192+/* tok-57 %txt /tests/golden/inline-leftout-kethep-wide/tokens/txt
193+/* tre-57 %txt /tests/golden/inline-leftout-kethep-wide/tree/txt
194+/* src-58 %jibb /tests/golden/inline-leftout-kettar/source/jibb
195+/* tok-58 %txt /tests/golden/inline-leftout-kettar/tokens/txt
196+/* tre-58 %txt /tests/golden/inline-leftout-kettar/tree/txt
197+/* src-59 %jibb /tests/golden/inline-leftout-miccol/source/jibb
198+/* tok-59 %txt /tests/golden/inline-leftout-miccol/tokens/txt
199+/* tre-59 %txt /tests/golden/inline-leftout-miccol/tree/txt
200+/* src-60 %jibb /tests/golden/inline-leftout-sail/source/jibb
201+/* tok-60 %txt /tests/golden/inline-leftout-sail/tokens/txt
202+/* tre-60 %txt /tests/golden/inline-leftout-sail/tree/txt
203+/* src-61 %jibb /tests/golden/inline-leftout-sigbar/source/jibb
204+/* tok-61 %txt /tests/golden/inline-leftout-sigbar/tokens/txt
205+/* tre-61 %txt /tests/golden/inline-leftout-sigbar/tree/txt
206+/* src-62 %jibb /tests/golden/inline-leftout-signed-float-auras/source/jibb
207+/* tok-62 %txt /tests/golden/inline-leftout-signed-float-auras/tokens/txt
208+/* tre-62 %txt /tests/golden/inline-leftout-signed-float-auras/tree/txt
209+/* src-63 %jibb /tests/golden/inline-leftout-sigpam-wide/source/jibb
210+/* tok-63 %txt /tests/golden/inline-leftout-sigpam-wide/tokens/txt
211+/* tre-63 %txt /tests/golden/inline-leftout-sigpam-wide/tree/txt
212+/* src-64 %jibb /tests/golden/inline-leftout-tis-paren/source/jibb
213+/* tok-64 %txt /tests/golden/inline-leftout-tis-paren/tokens/txt
214+/* tre-64 %txt /tests/golden/inline-leftout-tis-paren/tree/txt
215+/* src-65 %jibb /tests/golden/inline-leftout-tisfas/source/jibb
216+/* tok-65 %txt /tests/golden/inline-leftout-tisfas/tokens/txt
217+/* tre-65 %txt /tests/golden/inline-leftout-tisfas/tree/txt
218+/* src-66 %jibb /tests/golden/inline-leftout-tisgal/source/jibb
219+/* tok-66 %txt /tests/golden/inline-leftout-tisgal/tokens/txt
220+/* tre-66 %txt /tests/golden/inline-leftout-tisgal/tree/txt
221+/* src-67 %jibb /tests/golden/inline-leftout-tisgal-2/source/jibb
222+/* tok-67 %txt /tests/golden/inline-leftout-tisgal-2/tokens/txt
223+/* tre-67 %txt /tests/golden/inline-leftout-tisgal-2/tree/txt
224+/* src-68 %jibb /tests/golden/inline-leftout-tisgar/source/jibb
225+/* tok-68 %txt /tests/golden/inline-leftout-tisgar/tokens/txt
226+/* tre-68 %txt /tests/golden/inline-leftout-tisgar/tree/txt
227+/* src-69 %jibb /tests/golden/inline-leftout-tislus/source/jibb
228+/* tok-69 %txt /tests/golden/inline-leftout-tislus/tokens/txt
229+/* tre-69 %txt /tests/golden/inline-leftout-tislus/tree/txt
230+/* src-70 %jibb /tests/golden/inline-leftout-tistis/source/jibb
231+/* tok-70 %txt /tests/golden/inline-leftout-tistis/tokens/txt
232+/* tre-70 %txt /tests/golden/inline-leftout-tistis/tree/txt
233+/* src-71 %jibb /tests/golden/inline-leftout-wutcol/source/jibb
234+/* tok-71 %txt /tests/golden/inline-leftout-wutcol/tokens/txt
235+/* tre-71 %txt /tests/golden/inline-leftout-wutcol/tree/txt
236+/* src-72 %jibb /tests/golden/inline-leftout-wutcol-2/source/jibb
237+/* tok-72 %txt /tests/golden/inline-leftout-wutcol-2/tokens/txt
238+/* tre-72 %txt /tests/golden/inline-leftout-wutcol-2/tree/txt
239+/* src-73 %jibb /tests/golden/inline-leftout-wuthep-wide/source/jibb
240+/* tok-73 %txt /tests/golden/inline-leftout-wuthep-wide/tokens/txt
241+/* tre-73 %txt /tests/golden/inline-leftout-wuthep-wide/tree/txt
242+/* src-74 %jibb /tests/golden/inline-leftout-wutlus/source/jibb
243+/* tok-74 %txt /tests/golden/inline-leftout-wutlus/tokens/txt
244+/* tre-74 %txt /tests/golden/inline-leftout-wutlus/tree/txt
245+/* src-75 %jibb /tests/golden/inline-leftout-wutsig/source/jibb
246+/* tok-75 %txt /tests/golden/inline-leftout-wutsig/tokens/txt
247+/* tre-75 %txt /tests/golden/inline-leftout-wutsig/tree/txt
248+/* src-76 %jibb /tests/golden/inline-leftout-wutzap/source/jibb
249+/* tok-76 %txt /tests/golden/inline-leftout-wutzap/tokens/txt
250+/* tre-76 %txt /tests/golden/inline-leftout-wutzap/tree/txt
251+/* src-77 %jibb /tests/golden/inline-leftout-zap-not/source/jibb
252+/* tok-77 %txt /tests/golden/inline-leftout-zap-not/tokens/txt
253+/* tre-77 %txt /tests/golden/inline-leftout-zap-not/tree/txt
254+/* src-78 %jibb /tests/golden/inline-leftout-zapgar/source/jibb
255+/* tok-78 %txt /tests/golden/inline-leftout-zapgar/tokens/txt
256+/* tre-78 %txt /tests/golden/inline-leftout-zapgar/tree/txt
257+/* src-79 %jibb /tests/golden/inline-list/source/jibb
258+/* tok-79 %txt /tests/golden/inline-list/tokens/txt
259+/* tre-79 %txt /tests/golden/inline-list/tree/txt
260+/* src-80 %jibb /tests/golden/inline-list-parens/source/jibb
261+/* tok-80 %txt /tests/golden/inline-list-parens/tokens/txt
262+/* tre-80 %txt /tests/golden/inline-list-parens/tree/txt
263+/* src-81 %jibb /tests/golden/inline-literal-defaults/source/jibb
264+/* tok-81 %txt /tests/golden/inline-literal-defaults/tokens/txt
265+/* tre-81 %txt /tests/golden/inline-literal-defaults/tree/txt
266+/* src-82 %jibb /tests/golden/inline-load-slug/source/jibb
267+/* tok-82 %txt /tests/golden/inline-load-slug/tokens/txt
268+/* tre-82 %txt /tests/golden/inline-load-slug/tree/txt
269+/* src-83 %jibb /tests/golden/inline-local-names/source/jibb
270+/* tok-83 %txt /tests/golden/inline-local-names/tokens/txt
271+/* tre-83 %txt /tests/golden/inline-local-names/tree/txt
272+/* src-84 %jibb /tests/golden/inline-loobean/source/jibb
273+/* tok-84 %txt /tests/golden/inline-loobean/tokens/txt
274+/* tre-84 %txt /tests/golden/inline-loobean/tree/txt
275+/* src-85 %jibb /tests/golden/inline-mark-digit/source/jibb
276+/* tok-85 %txt /tests/golden/inline-mark-digit/tokens/txt
277+/* tre-85 %txt /tests/golden/inline-mark-digit/tree/txt
278+/* src-86 %jibb /tests/golden/inline-module-definitions/source/jibb
279+/* tok-86 %txt /tests/golden/inline-module-definitions/tokens/txt
280+/* tre-86 %txt /tests/golden/inline-module-definitions/tree/txt
281+/* src-87 %jibb /tests/golden/inline-mold-add/source/jibb
282+/* tok-87 %txt /tests/golden/inline-mold-add/tokens/txt
283+/* tre-87 %txt /tests/golden/inline-mold-add/tree/txt
284+/* src-88 %jibb /tests/golden/inline-mold-any-empty/source/jibb
285+/* tok-88 %txt /tests/golden/inline-mold-any-empty/tokens/txt
286+/* tre-88 %txt /tests/golden/inline-mold-any-empty/tree/txt
287+/* src-89 %jibb /tests/golden/inline-mold-atoms/source/jibb
288+/* tok-89 %txt /tests/golden/inline-mold-atoms/tokens/txt
289+/* tre-89 %txt /tests/golden/inline-mold-atoms/tree/txt
290+/* src-90 %jibb /tests/golden/inline-mold-constants/source/jibb
291+/* tok-90 %txt /tests/golden/inline-mold-constants/tokens/txt
292+/* tre-90 %txt /tests/golden/inline-mold-constants/tree/txt
293+/* src-91 %jibb /tests/golden/inline-mold-containers/source/jibb
294+/* tok-91 %txt /tests/golden/inline-mold-containers/tokens/txt
295+/* tre-91 %txt /tests/golden/inline-mold-containers/tree/txt
296+/* src-92 %jibb /tests/golden/inline-mold-gate/source/jibb
297+/* tok-92 %txt /tests/golden/inline-mold-gate/tokens/txt
298+/* tre-92 %txt /tests/golden/inline-mold-gate/tree/txt
299+/* src-93 %jibb /tests/golden/inline-mold-generic/source/jibb
300+/* tok-93 %txt /tests/golden/inline-mold-generic/tokens/txt
301+/* tre-93 %txt /tests/golden/inline-mold-generic/tree/txt
302+/* src-94 %jibb /tests/golden/inline-mold-opaque/source/jibb
303+/* tok-94 %txt /tests/golden/inline-mold-opaque/tokens/txt
304+/* tre-94 %txt /tests/golden/inline-mold-opaque/tree/txt
305+/* src-95 %jibb /tests/golden/inline-mold-paths/source/jibb
306+/* tok-95 %txt /tests/golden/inline-mold-paths/tokens/txt
307+/* tre-95 %txt /tests/golden/inline-mold-paths/tree/txt
308+/* src-96 %jibb /tests/golden/inline-mold-records/source/jibb
309+/* tok-96 %txt /tests/golden/inline-mold-records/tokens/txt
310+/* tre-96 %txt /tests/golden/inline-mold-records/tree/txt
311+/* src-97 %jibb /tests/golden/inline-namespaces/source/jibb
312+/* tok-97 %txt /tests/golden/inline-namespaces/tokens/txt
313+/* tre-97 %txt /tests/golden/inline-namespaces/tree/txt
314+/* src-98 %jibb /tests/golden/inline-no-operators/source/jibb
315+/* tok-98 %txt /tests/golden/inline-no-operators/tokens/txt
316+/* tre-98 %txt /tests/golden/inline-no-operators/tree/txt
317+/* src-99 %jibb /tests/golden/inline-no-subs/source/jibb
318+/* tok-99 %txt /tests/golden/inline-no-subs/tokens/txt
319+/* tre-99 %txt /tests/golden/inline-no-subs/tree/txt
320+/* src-100 %jibb /tests/golden/inline-null/source/jibb
321+/* tok-100 %txt /tests/golden/inline-null/tokens/txt
322+/* tre-100 %txt /tests/golden/inline-null/tree/txt
323+/* src-101 %jibb /tests/golden/inline-pair/source/jibb
324+/* tok-101 %txt /tests/golden/inline-pair/tokens/txt
325+/* tre-101 %txt /tests/golden/inline-pair/tree/txt
326+/* src-102 %jibb /tests/golden/inline-pairs-two-items/source/jibb
327+/* tok-102 %txt /tests/golden/inline-pairs-two-items/tokens/txt
328+/* tre-102 %txt /tests/golden/inline-pairs-two-items/tree/txt
329+/* src-103 %jibb /tests/golden/inline-path/source/jibb
330+/* tok-103 %txt /tests/golden/inline-path/tokens/txt
331+/* tre-103 %txt /tests/golden/inline-path/tree/txt
332+/* src-104 %jibb /tests/golden/inline-pattern-any/source/jibb
333+/* tok-104 %txt /tests/golden/inline-pattern-any/tokens/txt
334+/* tre-104 %txt /tests/golden/inline-pattern-any/tree/txt
335+/* src-105 %jibb /tests/golden/inline-pattern-cell/source/jibb
336+/* tok-105 %txt /tests/golden/inline-pattern-cell/tokens/txt
337+/* tre-105 %txt /tests/golden/inline-pattern-cell/tree/txt
338+/* src-106 %jibb /tests/golden/inline-pattern-crash-arm/source/jibb
339+/* tok-106 %txt /tests/golden/inline-pattern-crash-arm/tokens/txt
340+/* tre-106 %txt /tests/golden/inline-pattern-crash-arm/tree/txt
341+/* src-107 %jibb /tests/golden/inline-pattern-date-bad/source/jibb
342+/* tok-107 %txt /tests/golden/inline-pattern-date-bad/tokens/txt
343+/* tre-107 %txt /tests/golden/inline-pattern-date-bad/tree/txt
344+/* src-108 %jibb /tests/golden/inline-pattern-duration-bad/source/jibb
345+/* tok-108 %txt /tests/golden/inline-pattern-duration-bad/tokens/txt
346+/* tre-108 %txt /tests/golden/inline-pattern-duration-bad/tree/txt
347+/* src-109 %jibb /tests/golden/inline-pattern-eq/source/jibb
348+/* tok-109 %txt /tests/golden/inline-pattern-eq/tokens/txt
349+/* tre-109 %txt /tests/golden/inline-pattern-eq/tree/txt
350+/* src-110 %jibb /tests/golden/inline-pattern-face-bad/source/jibb
351+/* tok-110 %txt /tests/golden/inline-pattern-face-bad/tokens/txt
352+/* tre-110 %txt /tests/golden/inline-pattern-face-bad/tree/txt
353+/* src-111 %jibb /tests/golden/inline-pattern-head-tag/source/jibb
354+/* tok-111 %txt /tests/golden/inline-pattern-head-tag/tokens/txt
355+/* tre-111 %txt /tests/golden/inline-pattern-head-tag/tree/txt
356+/* src-112 %jibb /tests/golden/inline-pattern-interpolated-bad/source/jibb
357+/* tok-112 %txt /tests/golden/inline-pattern-interpolated-bad/tokens/txt
358+/* tre-112 %txt /tests/golden/inline-pattern-interpolated-bad/tree/txt
359+/* src-113 %jibb /tests/golden/inline-pattern-list-bad/source/jibb
360+/* tok-113 %txt /tests/golden/inline-pattern-list-bad/tokens/txt
361+/* tre-113 %txt /tests/golden/inline-pattern-list-bad/tree/txt
362+/* src-114 %jibb /tests/golden/inline-pattern-literals/source/jibb
363+/* tok-114 %txt /tests/golden/inline-pattern-literals/tokens/txt
364+/* tre-114 %txt /tests/golden/inline-pattern-literals/tree/txt
365+/* src-115 %jibb /tests/golden/inline-pattern-loobean/source/jibb
366+/* tok-115 %txt /tests/golden/inline-pattern-loobean/tokens/txt
367+/* tre-115 %txt /tests/golden/inline-pattern-loobean/tree/txt
368+/* src-116 %jibb /tests/golden/inline-pattern-move-any/source/jibb
369+/* tok-116 %txt /tests/golden/inline-pattern-move-any/tokens/txt
370+/* tre-116 %txt /tests/golden/inline-pattern-move-any/tree/txt
371+/* src-117 %jibb /tests/golden/inline-pattern-name/source/jibb
372+/* tok-117 %txt /tests/golden/inline-pattern-name/tokens/txt
373+/* tre-117 %txt /tests/golden/inline-pattern-name/tree/txt
374+/* src-118 %jibb /tests/golden/inline-pattern-null/source/jibb
375+/* tok-118 %txt /tests/golden/inline-pattern-null/tokens/txt
376+/* tre-118 %txt /tests/golden/inline-pattern-null/tree/txt
377+/* src-119 %jibb /tests/golden/inline-pattern-pair-bad/source/jibb
378+/* tok-119 %txt /tests/golden/inline-pattern-pair-bad/tokens/txt
379+/* tre-119 %txt /tests/golden/inline-pattern-pair-bad/tree/txt
380+/* src-120 %jibb /tests/golden/inline-pattern-tail-tag/source/jibb
381+/* tok-120 %txt /tests/golden/inline-pattern-tail-tag/tokens/txt
382+/* tre-120 %txt /tests/golden/inline-pattern-tail-tag/tree/txt
383+/* src-121 %jibb /tests/golden/inline-pattern-term/source/jibb
384+/* tok-121 %txt /tests/golden/inline-pattern-term/tokens/txt
385+/* tre-121 %txt /tests/golden/inline-pattern-term/tree/txt
386+/* src-122 %jibb /tests/golden/inline-pattern-two-tags/source/jibb
387+/* tok-122 %txt /tests/golden/inline-pattern-two-tags/tokens/txt
388+/* tre-122 %txt /tests/golden/inline-pattern-two-tags/tree/txt
389+/* src-123 %jibb /tests/golden/inline-pattern-unit/source/jibb
390+/* tok-123 %txt /tests/golden/inline-pattern-unit/tokens/txt
391+/* tre-123 %txt /tests/golden/inline-pattern-unit/tree/txt
392+/* src-124 %jibb /tests/golden/inline-qath/source/jibb
393+/* tok-124 %txt /tests/golden/inline-qath/tokens/txt
394+/* tre-124 %txt /tests/golden/inline-qath/tree/txt
395+/* src-125 %jibb /tests/golden/inline-requests/source/jibb
396+/* tok-125 %txt /tests/golden/inline-requests/tokens/txt
397+/* tre-125 %txt /tests/golden/inline-requests/tree/txt
398+/* src-126 %jibb /tests/golden/inline-scry-case/source/jibb
399+/* tok-126 %txt /tests/golden/inline-scry-case/tokens/txt
400+/* tre-126 %txt /tests/golden/inline-scry-case/tree/txt
401+/* src-127 %jibb /tests/golden/inline-self-reference/source/jibb
402+/* tok-127 %txt /tests/golden/inline-self-reference/tokens/txt
403+/* tre-127 %txt /tests/golden/inline-self-reference/tree/txt
404+/* src-128 %jibb /tests/golden/inline-ship/source/jibb
405+/* tok-128 %txt /tests/golden/inline-ship/tokens/txt
406+/* tre-128 %txt /tests/golden/inline-ship/tree/txt
407+/* src-129 %jibb /tests/golden/inline-static-image/source/jibb
408+/* tok-129 %txt /tests/golden/inline-static-image/tokens/txt
409+/* tre-129 %txt /tests/golden/inline-static-image/tree/txt
410+/* src-130 %jibb /tests/golden/inline-string/source/jibb
411+/* tok-130 %txt /tests/golden/inline-string/tokens/txt
412+/* tre-130 %txt /tests/golden/inline-string/tree/txt
413+/* src-131 %jibb /tests/golden/inline-tag-shape/source/jibb
414+/* tok-131 %txt /tests/golden/inline-tag-shape/tokens/txt
415+/* tre-131 %txt /tests/golden/inline-tag-shape/tree/txt
416+/* src-132 %jibb /tests/golden/inline-term/source/jibb
417+/* tok-132 %txt /tests/golden/inline-term/tokens/txt
418+/* tre-132 %txt /tests/golden/inline-term/tree/txt
419+/* src-133 %jibb /tests/golden/inline-text-items/source/jibb
420+/* tok-133 %txt /tests/golden/inline-text-items/tokens/txt
421+/* tre-133 %txt /tests/golden/inline-text-items/tree/txt
422+/* src-134 %jibb /tests/golden/inline-union-wide/source/jibb
423+/* tok-134 %txt /tests/golden/inline-union-wide/tokens/txt
424+/* tre-134 %txt /tests/golden/inline-union-wide/tree/txt
425+/* src-135 %jibb /tests/golden/inline-unit/source/jibb
426+/* tok-135 %txt /tests/golden/inline-unit/tokens/txt
427+/* tre-135 %txt /tests/golden/inline-unit/tree/txt
428+/* src-136 %jibb /tests/golden/inline-wide-form-rune-bad/source/jibb
429+/* tok-136 %txt /tests/golden/inline-wide-form-rune-bad/tokens/txt
430+/* tre-136 %txt /tests/golden/inline-wide-form-rune-bad/tree/txt
431+/* src-137 %jibb /tests/golden/inline-wide-forms/source/jibb
432+/* tok-137 %txt /tests/golden/inline-wide-forms/tokens/txt
433+/* tre-137 %txt /tests/golden/inline-wide-forms/tree/txt
434+/* src-138 %jibb /tests/golden/inline-wide-union-call/source/jibb
435+/* tok-138 %txt /tests/golden/inline-wide-union-call/tokens/txt
436+/* tre-138 %txt /tests/golden/inline-wide-union-call/tree/txt
437+/* src-139 %jibb /tests/golden/inline-wings/source/jibb
438+/* tok-139 %txt /tests/golden/inline-wings/tokens/txt
439+/* tre-139 %txt /tests/golden/inline-wings/tree/txt
440+/* src-140 %jibb /tests/golden/lex-base32-bad-1/source/jibb
441+/* tok-140 %txt /tests/golden/lex-base32-bad-1/tokens/txt
442+/* tre-140 %txt /tests/golden/lex-base32-bad-1/tree/txt
443+/* src-141 %jibb /tests/golden/lex-base32-ok-1/source/jibb
444+/* tok-141 %txt /tests/golden/lex-base32-ok-1/tokens/txt
445+/* tre-141 %txt /tests/golden/lex-base32-ok-1/tree/txt
446+/* src-142 %jibb /tests/golden/lex-blob-bad-1/source/jibb
447+/* tok-142 %txt /tests/golden/lex-blob-bad-1/tokens/txt
448+/* tre-142 %txt /tests/golden/lex-blob-bad-1/tree/txt
449+/* src-143 %jibb /tests/golden/lex-call-open-bad-1/source/jibb
450+/* tok-143 %txt /tests/golden/lex-call-open-bad-1/tokens/txt
451+/* tre-143 %txt /tests/golden/lex-call-open-bad-1/tree/txt
452+/* src-144 %jibb /tests/golden/lex-call-open-bad-2/source/jibb
453+/* tok-144 %txt /tests/golden/lex-call-open-bad-2/tokens/txt
454+/* tre-144 %txt /tests/golden/lex-call-open-bad-2/tree/txt
455+/* src-145 %jibb /tests/golden/lex-call-open-bad-3/source/jibb
456+/* tok-145 %txt /tests/golden/lex-call-open-bad-3/tokens/txt
457+/* tre-145 %txt /tests/golden/lex-call-open-bad-3/tree/txt
458+/* src-146 %jibb /tests/golden/lex-call-open-ok-1/source/jibb
459+/* tok-146 %txt /tests/golden/lex-call-open-ok-1/tokens/txt
460+/* tre-146 %txt /tests/golden/lex-call-open-ok-1/tree/txt
461+/* src-147 %jibb /tests/golden/lex-cell-bad-1/source/jibb
462+/* tok-147 %txt /tests/golden/lex-cell-bad-1/tokens/txt
463+/* tre-147 %txt /tests/golden/lex-cell-bad-1/tree/txt
464+/* src-148 %jibb /tests/golden/lex-cell-ok-1/source/jibb
465+/* tok-148 %txt /tests/golden/lex-cell-ok-1/tokens/txt
466+/* tre-148 %txt /tests/golden/lex-cell-ok-1/tree/txt
467+/* src-149 %jibb /tests/golden/lex-closer-bad-1/source/jibb
468+/* tok-149 %txt /tests/golden/lex-closer-bad-1/tokens/txt
469+/* tre-149 %txt /tests/golden/lex-closer-bad-1/tree/txt
470+/* src-150 %jibb /tests/golden/lex-closer-bad-2/source/jibb
471+/* tok-150 %txt /tests/golden/lex-closer-bad-2/tokens/txt
472+/* tre-150 %txt /tests/golden/lex-closer-bad-2/tree/txt
473+/* src-151 %jibb /tests/golden/lex-closer-bad-3/source/jibb
474+/* tok-151 %txt /tests/golden/lex-closer-bad-3/tokens/txt
475+/* tre-151 %txt /tests/golden/lex-closer-bad-3/tree/txt
476+/* src-152 %jibb /tests/golden/lex-codepoint-bad-1/source/jibb
477+/* tok-152 %txt /tests/golden/lex-codepoint-bad-1/tokens/txt
478+/* tre-152 %txt /tests/golden/lex-codepoint-bad-1/tree/txt
479+/* src-153 %jibb /tests/golden/lex-comment-bad-1/source/jibb
480+/* tok-153 %txt /tests/golden/lex-comment-bad-1/tokens/txt
481+/* tre-153 %txt /tests/golden/lex-comment-bad-1/tree/txt
482+/* src-154 %jibb /tests/golden/lex-comment-ok-1/source/jibb
483+/* tok-154 %txt /tests/golden/lex-comment-ok-1/tokens/txt
484+/* tre-154 %txt /tests/golden/lex-comment-ok-1/tree/txt
485+/* src-155 %jibb /tests/golden/lex-comment-ok-2/source/jibb
486+/* tok-155 %txt /tests/golden/lex-comment-ok-2/tokens/txt
487+/* tre-155 %txt /tests/golden/lex-comment-ok-2/tree/txt
488+/* src-156 %jibb /tests/golden/lex-comment-ok-3/source/jibb
489+/* tok-156 %txt /tests/golden/lex-comment-ok-3/tokens/txt
490+/* tre-156 %txt /tests/golden/lex-comment-ok-3/tree/txt
491+/* src-157 %jibb /tests/golden/lex-date-bad-1/source/jibb
492+/* tok-157 %txt /tests/golden/lex-date-bad-1/tokens/txt
493+/* tre-157 %txt /tests/golden/lex-date-bad-1/tree/txt
494+/* src-158 %jibb /tests/golden/lex-date-bad-2/source/jibb
495+/* tok-158 %txt /tests/golden/lex-date-bad-2/tokens/txt
496+/* tre-158 %txt /tests/golden/lex-date-bad-2/tree/txt
497+/* src-159 %jibb /tests/golden/lex-date-bad-3/source/jibb
498+/* tok-159 %txt /tests/golden/lex-date-bad-3/tokens/txt
499+/* tre-159 %txt /tests/golden/lex-date-bad-3/tree/txt
500+/* src-160 %jibb /tests/golden/lex-date-ok-1/source/jibb
501+/* tok-160 %txt /tests/golden/lex-date-ok-1/tokens/txt
502+/* tre-160 %txt /tests/golden/lex-date-ok-1/tree/txt
503+/* src-161 %jibb /tests/golden/lex-decimal-bad-1/source/jibb
504+/* tok-161 %txt /tests/golden/lex-decimal-bad-1/tokens/txt
505+/* tre-161 %txt /tests/golden/lex-decimal-bad-1/tree/txt
506+/* src-162 %jibb /tests/golden/lex-decimal-bad-2/source/jibb
507+/* tok-162 %txt /tests/golden/lex-decimal-bad-2/tokens/txt
508+/* tre-162 %txt /tests/golden/lex-decimal-bad-2/tree/txt
509+/* src-163 %jibb /tests/golden/lex-decimal-ok-1/source/jibb
510+/* tok-163 %txt /tests/golden/lex-decimal-ok-1/tokens/txt
511+/* tre-163 %txt /tests/golden/lex-decimal-ok-1/tree/txt
512+/* src-164 %jibb /tests/golden/lex-duration-bad-1/source/jibb
513+/* tok-164 %txt /tests/golden/lex-duration-bad-1/tokens/txt
514+/* tre-164 %txt /tests/golden/lex-duration-bad-1/tree/txt
515+/* src-165 %jibb /tests/golden/lex-duration-bad-2/source/jibb
516+/* tok-165 %txt /tests/golden/lex-duration-bad-2/tokens/txt
517+/* tre-165 %txt /tests/golden/lex-duration-bad-2/tree/txt
518+/* src-166 %jibb /tests/golden/lex-duration-ok-1/source/jibb
519+/* tok-166 %txt /tests/golden/lex-duration-ok-1/tokens/txt
520+/* tre-166 %txt /tests/golden/lex-duration-ok-1/tree/txt
521+/* src-167 %jibb /tests/golden/lex-hex-bad-1/source/jibb
522+/* tok-167 %txt /tests/golden/lex-hex-bad-1/tokens/txt
523+/* tre-167 %txt /tests/golden/lex-hex-bad-1/tree/txt
524+/* src-168 %jibb /tests/golden/lex-hex-ok-1/source/jibb
525+/* tok-168 %txt /tests/golden/lex-hex-ok-1/tokens/txt
526+/* tre-168 %txt /tests/golden/lex-hex-ok-1/tree/txt
527+/* src-169 %jibb /tests/golden/lex-indent-bad-1/source/jibb
528+/* tok-169 %txt /tests/golden/lex-indent-bad-1/tokens/txt
529+/* tre-169 %txt /tests/golden/lex-indent-bad-1/tree/txt
530+/* src-170 %jibb /tests/golden/lex-indent-bad-2/source/jibb
531+/* tok-170 %txt /tests/golden/lex-indent-bad-2/tokens/txt
532+/* tre-170 %txt /tests/golden/lex-indent-bad-2/tree/txt
533+/* src-171 %jibb /tests/golden/lex-indent-bad-3/source/jibb
534+/* tok-171 %txt /tests/golden/lex-indent-bad-3/tokens/txt
535+/* tre-171 %txt /tests/golden/lex-indent-bad-3/tree/txt
536+/* src-172 %jibb /tests/golden/lex-indent-ok-1/source/jibb
537+/* tok-172 %txt /tests/golden/lex-indent-ok-1/tokens/txt
538+/* tre-172 %txt /tests/golden/lex-indent-ok-1/tree/txt
539+/* src-173 %jibb /tests/golden/lex-indent-ok-2/source/jibb
540+/* tok-173 %txt /tests/golden/lex-indent-ok-2/tokens/txt
541+/* tre-173 %txt /tests/golden/lex-indent-ok-2/tree/txt
542+/* src-174 %jibb /tests/golden/lex-indent-ok-3/source/jibb
543+/* tok-174 %txt /tests/golden/lex-indent-ok-3/tokens/txt
544+/* tre-174 %txt /tests/golden/lex-indent-ok-3/tree/txt
545+/* src-175 %jibb /tests/golden/lex-interp-bad-1/source/jibb
546+/* tok-175 %txt /tests/golden/lex-interp-bad-1/tokens/txt
547+/* tre-175 %txt /tests/golden/lex-interp-bad-1/tree/txt
548+/* src-176 %jibb /tests/golden/lex-interp-bad-2/source/jibb
549+/* tok-176 %txt /tests/golden/lex-interp-bad-2/tokens/txt
550+/* tre-176 %txt /tests/golden/lex-interp-bad-2/tree/txt
551+/* src-177 %jibb /tests/golden/lex-interp-bad-3/source/jibb
552+/* tok-177 %txt /tests/golden/lex-interp-bad-3/tokens/txt
553+/* tre-177 %txt /tests/golden/lex-interp-bad-3/tree/txt
554+/* src-178 %jibb /tests/golden/lex-interp-bad-4/source/jibb
555+/* tok-178 %txt /tests/golden/lex-interp-bad-4/tokens/txt
556+/* tre-178 %txt /tests/golden/lex-interp-bad-4/tree/txt
557+/* src-179 %jibb /tests/golden/lex-interp-ok-1/source/jibb
558+/* tok-179 %txt /tests/golden/lex-interp-ok-1/tokens/txt
559+/* tre-179 %txt /tests/golden/lex-interp-ok-1/tree/txt
560+/* src-180 %jibb /tests/golden/lex-interp-ok-2/source/jibb
561+/* tok-180 %txt /tests/golden/lex-interp-ok-2/tokens/txt
562+/* tre-180 %txt /tests/golden/lex-interp-ok-2/tree/txt
563+/* src-181 %jibb /tests/golden/lex-knot-bad-1/source/jibb
564+/* tok-181 %txt /tests/golden/lex-knot-bad-1/tokens/txt
565+/* tre-181 %txt /tests/golden/lex-knot-bad-1/tree/txt
566+/* src-182 %jibb /tests/golden/lex-knot-ok-1/source/jibb
567+/* tok-182 %txt /tests/golden/lex-knot-ok-1/tokens/txt
568+/* tre-182 %txt /tests/golden/lex-knot-ok-1/tree/txt
569+/* src-183 %jibb /tests/golden/lex-layout-bad-1/source/jibb
570+/* tok-183 %txt /tests/golden/lex-layout-bad-1/tokens/txt
571+/* tre-183 %txt /tests/golden/lex-layout-bad-1/tree/txt
572+/* src-184 %jibb /tests/golden/lex-layout-bad-2/source/jibb
573+/* tok-184 %txt /tests/golden/lex-layout-bad-2/tokens/txt
574+/* tre-184 %txt /tests/golden/lex-layout-bad-2/tree/txt
575+/* src-185 %jibb /tests/golden/lex-layout-bad-3/source/jibb
576+/* tok-185 %txt /tests/golden/lex-layout-bad-3/tokens/txt
577+/* tre-185 %txt /tests/golden/lex-layout-bad-3/tree/txt
578+/* src-186 %jibb /tests/golden/lex-layout-bad-4/source/jibb
579+/* tok-186 %txt /tests/golden/lex-layout-bad-4/tokens/txt
580+/* tre-186 %txt /tests/golden/lex-layout-bad-4/tree/txt
581+/* src-187 %jibb /tests/golden/lex-layout-ok-1/source/jibb
582+/* tok-187 %txt /tests/golden/lex-layout-ok-1/tokens/txt
583+/* tre-187 %txt /tests/golden/lex-layout-ok-1/tree/txt
584+/* src-188 %jibb /tests/golden/lex-list-bad-1/source/jibb
585+/* tok-188 %txt /tests/golden/lex-list-bad-1/tokens/txt
586+/* tre-188 %txt /tests/golden/lex-list-bad-1/tree/txt
587+/* src-189 %jibb /tests/golden/lex-list-ok-1/source/jibb
588+/* tok-189 %txt /tests/golden/lex-list-ok-1/tokens/txt
589+/* tre-189 %txt /tests/golden/lex-list-ok-1/tree/txt
590+/* src-190 %jibb /tests/golden/lex-loobean-bad-1/source/jibb
591+/* tok-190 %txt /tests/golden/lex-loobean-bad-1/tokens/txt
592+/* tre-190 %txt /tests/golden/lex-loobean-bad-1/tree/txt
593+/* src-191 %jibb /tests/golden/lex-loobean-ok-1/source/jibb
594+/* tok-191 %txt /tests/golden/lex-loobean-ok-1/tokens/txt
595+/* tre-191 %txt /tests/golden/lex-loobean-ok-1/tree/txt
596+/* src-192 %jibb /tests/golden/lex-name-bad-1/source/jibb
597+/* tok-192 %txt /tests/golden/lex-name-bad-1/tokens/txt
598+/* tre-192 %txt /tests/golden/lex-name-bad-1/tree/txt
599+/* src-193 %jibb /tests/golden/lex-name-bad-2/source/jibb
600+/* tok-193 %txt /tests/golden/lex-name-bad-2/tokens/txt
601+/* tre-193 %txt /tests/golden/lex-name-bad-2/tree/txt
602+/* src-194 %jibb /tests/golden/lex-name-bad-3/source/jibb
603+/* tok-194 %txt /tests/golden/lex-name-bad-3/tokens/txt
604+/* tre-194 %txt /tests/golden/lex-name-bad-3/tree/txt
605+/* src-195 %jibb /tests/golden/lex-name-bad-4/source/jibb
606+/* tok-195 %txt /tests/golden/lex-name-bad-4/tokens/txt
607+/* tre-195 %txt /tests/golden/lex-name-bad-4/tree/txt
608+/* src-196 %jibb /tests/golden/lex-name-bad-5/source/jibb
609+/* tok-196 %txt /tests/golden/lex-name-bad-5/tokens/txt
610+/* tre-196 %txt /tests/golden/lex-name-bad-5/tree/txt
611+/* src-197 %jibb /tests/golden/lex-name-bad-6/source/jibb
612+/* tok-197 %txt /tests/golden/lex-name-bad-6/tokens/txt
613+/* tre-197 %txt /tests/golden/lex-name-bad-6/tree/txt
614+/* src-198 %jibb /tests/golden/lex-name-ok-1/source/jibb
615+/* tok-198 %txt /tests/golden/lex-name-ok-1/tokens/txt
616+/* tre-198 %txt /tests/golden/lex-name-ok-1/tree/txt
617+/* src-199 %jibb /tests/golden/lex-null-bad-1/source/jibb
618+/* tok-199 %txt /tests/golden/lex-null-bad-1/tokens/txt
619+/* tre-199 %txt /tests/golden/lex-null-bad-1/tree/txt
620+/* src-200 %jibb /tests/golden/lex-null-ok-1/source/jibb
621+/* tok-200 %txt /tests/golden/lex-null-ok-1/tokens/txt
622+/* tre-200 %txt /tests/golden/lex-null-ok-1/tree/txt
623+/* src-201 %jibb /tests/golden/lex-open-bracket-bad-1/source/jibb
624+/* tok-201 %txt /tests/golden/lex-open-bracket-bad-1/tokens/txt
625+/* tre-201 %txt /tests/golden/lex-open-bracket-bad-1/tree/txt
626+/* src-202 %jibb /tests/golden/lex-open-bracket-bad-2/source/jibb
627+/* tok-202 %txt /tests/golden/lex-open-bracket-bad-2/tokens/txt
628+/* tre-202 %txt /tests/golden/lex-open-bracket-bad-2/tree/txt
629+/* src-203 %jibb /tests/golden/lex-open-bracket-bad-3/source/jibb
630+/* tok-203 %txt /tests/golden/lex-open-bracket-bad-3/tokens/txt
631+/* tre-203 %txt /tests/golden/lex-open-bracket-bad-3/tree/txt
632+/* src-204 %jibb /tests/golden/lex-open-bracket-bad-4/source/jibb
633+/* tok-204 %txt /tests/golden/lex-open-bracket-bad-4/tokens/txt
634+/* tre-204 %txt /tests/golden/lex-open-bracket-bad-4/tree/txt
635+/* src-205 %jibb /tests/golden/lex-open-bracket-bad-5/source/jibb
636+/* tok-205 %txt /tests/golden/lex-open-bracket-bad-5/tokens/txt
637+/* tre-205 %txt /tests/golden/lex-open-bracket-bad-5/tree/txt
638+/* src-206 %jibb /tests/golden/lex-open-bracket-ok-1/source/jibb
639+/* tok-206 %txt /tests/golden/lex-open-bracket-ok-1/tokens/txt
640+/* tre-206 %txt /tests/golden/lex-open-bracket-ok-1/tree/txt
641+/* src-207 %jibb /tests/golden/lex-open-bracket-ok-2/source/jibb
642+/* tok-207 %txt /tests/golden/lex-open-bracket-ok-2/tokens/txt
643+/* tre-207 %txt /tests/golden/lex-open-bracket-ok-2/tree/txt
644+/* src-208 %jibb /tests/golden/lex-pair-binding-bad-1/source/jibb
645+/* tok-208 %txt /tests/golden/lex-pair-binding-bad-1/tokens/txt
646+/* tre-208 %txt /tests/golden/lex-pair-binding-bad-1/tree/txt
647+/* src-209 %jibb /tests/golden/lex-pair-binding-ok-1/source/jibb
648+/* tok-209 %txt /tests/golden/lex-pair-binding-ok-1/tokens/txt
649+/* tre-209 %txt /tests/golden/lex-pair-binding-ok-1/tree/txt
650+/* src-210 %jibb /tests/golden/lex-path-bad-1/source/jibb
651+/* tok-210 %txt /tests/golden/lex-path-bad-1/tokens/txt
652+/* tre-210 %txt /tests/golden/lex-path-bad-1/tree/txt
653+/* src-211 %jibb /tests/golden/lex-path-ok-1/source/jibb
654+/* tok-211 %txt /tests/golden/lex-path-ok-1/tokens/txt
655+/* tre-211 %txt /tests/golden/lex-path-ok-1/tree/txt
656+/* src-212 %jibb /tests/golden/lex-rune-layout-bad-1/source/jibb
657+/* tok-212 %txt /tests/golden/lex-rune-layout-bad-1/tokens/txt
658+/* tre-212 %txt /tests/golden/lex-rune-layout-bad-1/tree/txt
659+/* src-213 %jibb /tests/golden/lex-rune-layout-bad-2/source/jibb
660+/* tok-213 %txt /tests/golden/lex-rune-layout-bad-2/tokens/txt
661+/* tre-213 %txt /tests/golden/lex-rune-layout-bad-2/tree/txt
662+/* src-214 %jibb /tests/golden/lex-rune-layout-bad-3/source/jibb
663+/* tok-214 %txt /tests/golden/lex-rune-layout-bad-3/tokens/txt
664+/* tre-214 %txt /tests/golden/lex-rune-layout-bad-3/tree/txt
665+/* src-215 %jibb /tests/golden/lex-rune-layout-bad-4/source/jibb
666+/* tok-215 %txt /tests/golden/lex-rune-layout-bad-4/tokens/txt
667+/* tre-215 %txt /tests/golden/lex-rune-layout-bad-4/tree/txt
668+/* src-216 %jibb /tests/golden/lex-rune-layout-ok-1/source/jibb
669+/* tok-216 %txt /tests/golden/lex-rune-layout-ok-1/tokens/txt
670+/* tre-216 %txt /tests/golden/lex-rune-layout-ok-1/tree/txt
671+/* src-217 %jibb /tests/golden/lex-ship-bad-1/source/jibb
672+/* tok-217 %txt /tests/golden/lex-ship-bad-1/tokens/txt
673+/* tre-217 %txt /tests/golden/lex-ship-bad-1/tree/txt
674+/* src-218 %jibb /tests/golden/lex-ship-ok-1/source/jibb
675+/* tok-218 %txt /tests/golden/lex-ship-ok-1/tokens/txt
676+/* tre-218 %txt /tests/golden/lex-ship-ok-1/tree/txt
677+/* src-219 %jibb /tests/golden/lex-spacing-bad-1/source/jibb
678+/* tok-219 %txt /tests/golden/lex-spacing-bad-1/tokens/txt
679+/* tre-219 %txt /tests/golden/lex-spacing-bad-1/tree/txt
680+/* src-220 %jibb /tests/golden/lex-spacing-bad-2/source/jibb
681+/* tok-220 %txt /tests/golden/lex-spacing-bad-2/tokens/txt
682+/* tre-220 %txt /tests/golden/lex-spacing-bad-2/tree/txt
683+/* src-221 %jibb /tests/golden/lex-spacing-bad-3/source/jibb
684+/* tok-221 %txt /tests/golden/lex-spacing-bad-3/tokens/txt
685+/* tre-221 %txt /tests/golden/lex-spacing-bad-3/tree/txt
686+/* src-222 %jibb /tests/golden/lex-spacing-bad-4/source/jibb
687+/* tok-222 %txt /tests/golden/lex-spacing-bad-4/tokens/txt
688+/* tre-222 %txt /tests/golden/lex-spacing-bad-4/tree/txt
689+/* src-223 %jibb /tests/golden/lex-spacing-ok-1/source/jibb
690+/* tok-223 %txt /tests/golden/lex-spacing-ok-1/tokens/txt
691+/* tre-223 %txt /tests/golden/lex-spacing-ok-1/tree/txt
692+/* src-224 %jibb /tests/golden/lex-string-bad-1/source/jibb
693+/* tok-224 %txt /tests/golden/lex-string-bad-1/tokens/txt
694+/* tre-224 %txt /tests/golden/lex-string-bad-1/tree/txt
695+/* src-225 %jibb /tests/golden/lex-string-bad-2/source/jibb
696+/* tok-225 %txt /tests/golden/lex-string-bad-2/tokens/txt
697+/* tre-225 %txt /tests/golden/lex-string-bad-2/tree/txt
698+/* src-226 %jibb /tests/golden/lex-string-ok-1/source/jibb
699+/* tok-226 %txt /tests/golden/lex-string-ok-1/tokens/txt
700+/* tre-226 %txt /tests/golden/lex-string-ok-1/tree/txt
701+/* src-227 %jibb /tests/golden/lex-term-bad-1/source/jibb
702+/* tok-227 %txt /tests/golden/lex-term-bad-1/tokens/txt
703+/* tre-227 %txt /tests/golden/lex-term-bad-1/tree/txt
704+/* src-228 %jibb /tests/golden/lex-term-bad-2/source/jibb
705+/* tok-228 %txt /tests/golden/lex-term-bad-2/tokens/txt
706+/* tre-228 %txt /tests/golden/lex-term-bad-2/tree/txt
707+/* src-229 %jibb /tests/golden/lex-term-bad-3/source/jibb
708+/* tok-229 %txt /tests/golden/lex-term-bad-3/tokens/txt
709+/* tre-229 %txt /tests/golden/lex-term-bad-3/tree/txt
710+/* src-230 %jibb /tests/golden/lex-term-ok-1/source/jibb
711+/* tok-230 %txt /tests/golden/lex-term-ok-1/tokens/txt
712+/* tre-230 %txt /tests/golden/lex-term-ok-1/tree/txt
713+/* src-231 %jibb /tests/golden/lex-tight-change-bad-1/source/jibb
714+/* tok-231 %txt /tests/golden/lex-tight-change-bad-1/tokens/txt
715+/* tre-231 %txt /tests/golden/lex-tight-change-bad-1/tree/txt
716+/* src-232 %jibb /tests/golden/lex-tight-change-bad-2/source/jibb
717+/* tok-232 %txt /tests/golden/lex-tight-change-bad-2/tokens/txt
718+/* tre-232 %txt /tests/golden/lex-tight-change-bad-2/tree/txt
719+/* src-233 %jibb /tests/golden/lex-tight-change-ok-1/source/jibb
720+/* tok-233 %txt /tests/golden/lex-tight-change-ok-1/tokens/txt
721+/* tre-233 %txt /tests/golden/lex-tight-change-ok-1/tree/txt
722+/* src-234 %jibb /tests/golden/lex-tight-ctor-bad-1/source/jibb
723+/* tok-234 %txt /tests/golden/lex-tight-ctor-bad-1/tokens/txt
724+/* tre-234 %txt /tests/golden/lex-tight-ctor-bad-1/tree/txt
725+/* src-235 %jibb /tests/golden/lex-tight-ctor-bad-2/source/jibb
726+/* tok-235 %txt /tests/golden/lex-tight-ctor-bad-2/tokens/txt
727+/* tre-235 %txt /tests/golden/lex-tight-ctor-bad-2/tree/txt
728+/* src-236 %jibb /tests/golden/lex-tight-ctor-ok-1/source/jibb
729+/* tok-236 %txt /tests/golden/lex-tight-ctor-ok-1/tokens/txt
730+/* tre-236 %txt /tests/golden/lex-tight-ctor-ok-1/tree/txt
731+/* src-237 %jibb /tests/golden/lex-tight-opener-bad-1/source/jibb
732+/* tok-237 %txt /tests/golden/lex-tight-opener-bad-1/tokens/txt
733+/* tre-237 %txt /tests/golden/lex-tight-opener-bad-1/tree/txt
734+/* src-238 %jibb /tests/golden/lex-tight-opener-bad-2/source/jibb
735+/* tok-238 %txt /tests/golden/lex-tight-opener-bad-2/tokens/txt
736+/* tre-238 %txt /tests/golden/lex-tight-opener-bad-2/tree/txt
737+/* src-239 %jibb /tests/golden/lex-tight-opener-bad-3/source/jibb
738+/* tok-239 %txt /tests/golden/lex-tight-opener-bad-3/tokens/txt
739+/* tre-239 %txt /tests/golden/lex-tight-opener-bad-3/tree/txt
740+/* src-240 %jibb /tests/golden/lex-tight-opener-bad-4/source/jibb
741+/* tok-240 %txt /tests/golden/lex-tight-opener-bad-4/tokens/txt
742+/* tre-240 %txt /tests/golden/lex-tight-opener-bad-4/tree/txt
743+/* src-241 %jibb /tests/golden/lex-tight-opener-ok-1/source/jibb
744+/* tok-241 %txt /tests/golden/lex-tight-opener-ok-1/tokens/txt
745+/* tre-241 %txt /tests/golden/lex-tight-opener-ok-1/tree/txt
746+/* src-242 %jibb /tests/golden/lex-tight-pair-bad-1/source/jibb
747+/* tok-242 %txt /tests/golden/lex-tight-pair-bad-1/tokens/txt
748+/* tre-242 %txt /tests/golden/lex-tight-pair-bad-1/tree/txt
749+/* src-243 %jibb /tests/golden/lex-tight-pair-bad-2/source/jibb
750+/* tok-243 %txt /tests/golden/lex-tight-pair-bad-2/tokens/txt
751+/* tre-243 %txt /tests/golden/lex-tight-pair-bad-2/tree/txt
752+/* src-244 %jibb /tests/golden/lex-tight-pair-bad-3/source/jibb
753+/* tok-244 %txt /tests/golden/lex-tight-pair-bad-3/tokens/txt
754+/* tre-244 %txt /tests/golden/lex-tight-pair-bad-3/tree/txt
755+/* src-245 %jibb /tests/golden/lex-tight-pair-ok-1/source/jibb
756+/* tok-245 %txt /tests/golden/lex-tight-pair-ok-1/tokens/txt
757+/* tre-245 %txt /tests/golden/lex-tight-pair-ok-1/tree/txt
758+/* src-246 %jibb /tests/golden/lex-tight-qath-bad-1/source/jibb
759+/* tok-246 %txt /tests/golden/lex-tight-qath-bad-1/tokens/txt
760+/* tre-246 %txt /tests/golden/lex-tight-qath-bad-1/tree/txt
761+/* src-247 %jibb /tests/golden/lex-tight-qath-bad-2/source/jibb
762+/* tok-247 %txt /tests/golden/lex-tight-qath-bad-2/tokens/txt
763+/* tre-247 %txt /tests/golden/lex-tight-qath-bad-2/tree/txt
764+/* src-248 %jibb /tests/golden/lex-tight-qath-bad-3/source/jibb
765+/* tok-248 %txt /tests/golden/lex-tight-qath-bad-3/tokens/txt
766+/* tre-248 %txt /tests/golden/lex-tight-qath-bad-3/tree/txt
767+/* src-249 %jibb /tests/golden/lex-tight-qath-ok-1/source/jibb
768+/* tok-249 %txt /tests/golden/lex-tight-qath-ok-1/tokens/txt
769+/* tre-249 %txt /tests/golden/lex-tight-qath-ok-1/tree/txt
770+/* src-250 %jibb /tests/golden/lex-tight-unit-bad-1/source/jibb
771+/* tok-250 %txt /tests/golden/lex-tight-unit-bad-1/tokens/txt
772+/* tre-250 %txt /tests/golden/lex-tight-unit-bad-1/tree/txt
773+/* src-251 %jibb /tests/golden/lex-tight-unit-ok-1/source/jibb
774+/* tok-251 %txt /tests/golden/lex-tight-unit-ok-1/tokens/txt
775+/* tre-251 %txt /tests/golden/lex-tight-unit-ok-1/tree/txt
776+/* src-252 %jibb /tests/golden/lex-tight-wing-bad-1/source/jibb
777+/* tok-252 %txt /tests/golden/lex-tight-wing-bad-1/tokens/txt
778+/* tre-252 %txt /tests/golden/lex-tight-wing-bad-1/tree/txt
779+/* src-253 %jibb /tests/golden/lex-tight-wing-ok-1/source/jibb
780+/* tok-253 %txt /tests/golden/lex-tight-wing-ok-1/tokens/txt
781+/* tre-253 %txt /tests/golden/lex-tight-wing-ok-1/tree/txt
250782|%
251783:: one arm per case
252784::
253785++ test-doc-core-02-update
254− (check ~.doc-core-02-update src-1 ~ ~)
786+ (check ~.doc-core-02-update src-1 `tok-1 `tre-1)
255787++ test-doc-grammar-01-imports
256− (check ~.doc-grammar-01-imports src-2 ~ ~)
788+ (check ~.doc-grammar-01-imports src-2 `tok-2 `tre-2)
257789++ test-doc-grammar-02-buttons
258− (check ~.doc-grammar-02-buttons src-3 ~ ~)
790+ (check ~.doc-grammar-02-buttons src-3 `tok-3 `tre-3)
259791++ test-doc-grammar-03-view-day
260− (check ~.doc-grammar-03-view-day src-4 ~ ~)
792+ (check ~.doc-grammar-03-view-day src-4 `tok-4 `tre-4)
261793++ test-doc-grammar-04-step
262− (check ~.doc-grammar-04-step src-5 ~ ~)
794+ (check ~.doc-grammar-04-step src-5 `tok-5 `tre-5)
263795++ test-doc-grammar-06-cart-store
264− (check ~.doc-grammar-06-cart-store src-6 ~ ~)
796+ (check ~.doc-grammar-06-cart-store src-6 `tok-6 `tre-6)
265797++ test-doc-grammar-07-basket
266− (check ~.doc-grammar-07-basket src-7 ~ ~)
798+ (check ~.doc-grammar-07-basket src-7 `tok-7 `tre-7)
267799++ test-doc-overview-01-cmd-sub
268− (check ~.doc-overview-01-cmd-sub src-8 ~ ~)
800+ (check ~.doc-overview-01-cmd-sub src-8 `tok-8 `tre-8)
269801++ test-doc-overview-02-theme
270− (check ~.doc-overview-02-theme src-9 ~ ~)
802+ (check ~.doc-overview-02-theme src-9 `tok-9 `tre-9)
271803++ test-doc-overview-04-todo-api
272− (check ~.doc-overview-04-todo-api src-10 ~ ~)
804+ (check ~.doc-overview-04-todo-api src-10 `tok-10 `tre-10)
273805++ test-doc-overview-08-about
274− (check ~.doc-overview-08-about src-11 ~ ~)
806+ (check ~.doc-overview-08-about src-11 `tok-11 `tre-11)
275807++ test-doc-overview-09-blog-index
276− (check ~.doc-overview-09-blog-index src-12 ~ ~)
808+ (check ~.doc-overview-09-blog-index src-12 `tok-12 `tre-12)
277809++ test-doc-overview-10-todo-list
278− (check ~.doc-overview-10-todo-list src-13 ~ ~)
810+ (check ~.doc-overview-10-todo-list src-13 `tok-13 `tre-13)
279811++ test-doc-overview-11-index
280− (check ~.doc-overview-11-index src-14 ~ ~)
812+ (check ~.doc-overview-11-index src-14 `tok-14 `tre-14)
281813++ test-inline-base32
282− (check ~.inline-base32 src-15 ~ ~)
814+ (check ~.inline-base32 src-15 `tok-15 `tre-15)
283815++ test-inline-call
284− (check ~.inline-call src-16 ~ ~)
816+ (check ~.inline-call src-16 `tok-16 `tre-16)
285817++ test-inline-cell
286− (check ~.inline-cell src-17 ~ ~)
818+ (check ~.inline-cell src-17 `tok-17 `tre-17)
287819++ test-inline-change-done
288− (check ~.inline-change-done src-18 ~ ~)
820+ (check ~.inline-change-done src-18 `tok-18 `tre-18)
289821++ test-inline-change-draft
290− (check ~.inline-change-draft src-19 ~ ~)
822+ (check ~.inline-change-draft src-19 `tok-19 `tre-19)
291823++ test-inline-crash
292− (check ~.inline-crash src-20 ~ ~)
824+ (check ~.inline-crash src-20 `tok-20 `tre-20)
293825++ test-inline-ctor-typed
294− (check ~.inline-ctor-typed src-21 ~ ~)
826+ (check ~.inline-ctor-typed src-21 `tok-21 `tre-21)
295827++ test-inline-date
296− (check ~.inline-date src-22 ~ ~)
828+ (check ~.inline-date src-22 `tok-22 `tre-22)
297829++ test-inline-decimal
298− (check ~.inline-decimal src-23 ~ ~)
830+ (check ~.inline-decimal src-23 `tok-23 `tre-23)
299831++ test-inline-duration
300− (check ~.inline-duration src-24 ~ ~)
832+ (check ~.inline-duration src-24 `tok-24 `tre-24)
301833++ test-inline-fold-mold
302− (check ~.inline-fold-mold src-25 ~ ~)
834+ (check ~.inline-fold-mold src-25 `tok-25 `tre-25)
303835++ test-inline-gate-mold
304− (check ~.inline-gate-mold src-26 ~ ~)
836+ (check ~.inline-gate-mold src-26 `tok-26 `tre-26)
305837++ test-inline-gate-samples
306− (check ~.inline-gate-samples src-27 ~ ~)
838+ (check ~.inline-gate-samples src-27 `tok-27 `tre-27)
307839++ test-inline-gate-wide
308− (check ~.inline-gate-wide src-28 ~ ~)
840+ (check ~.inline-gate-wide src-28 `tok-28 `tre-28)
309841++ test-inline-generic-mold
310− (check ~.inline-generic-mold src-29 ~ ~)
842+ (check ~.inline-generic-mold src-29 `tok-29 `tre-29)
311843++ test-inline-hex
312− (check ~.inline-hex src-30 ~ ~)
844+ (check ~.inline-hex src-30 `tok-30 `tre-30)
313845++ test-inline-import-mark-face-bad
314− (check ~.inline-import-mark-face-bad src-31 ~ ~)
846+ (check ~.inline-import-mark-face-bad src-31 `tok-31 `tre-31)
847+++ test-inline-import-root-bad
848+ (check ~.inline-import-root-bad src-32 `tok-32 `tre-32)
315849++ test-inline-imports-after-definition
316− (check ~.inline-imports-after-definition src-32 ~ ~)
850+ (check ~.inline-imports-after-definition src-33 `tok-33 `tre-33)
317851++ test-inline-island
318− (check ~.inline-island src-33 ~ ~)
852+ (check ~.inline-island src-34 `tok-34 `tre-34)
319853++ test-inline-kinds
320− (check ~.inline-kinds src-34 ~ ~)
854+ (check ~.inline-kinds src-35 `tok-35 `tre-35)
321855++ test-inline-knot
322− (check ~.inline-knot src-35 ~ ~)
856+ (check ~.inline-knot src-36 `tok-36 `tre-36)
323857++ test-inline-leftout-barcab
324− (check ~.inline-leftout-barcab src-36 ~ ~)
858+ (check ~.inline-leftout-barcab src-37 `tok-37 `tre-37)
325859++ test-inline-leftout-barcen
326− (check ~.inline-leftout-barcen src-37 ~ ~)
860+ (check ~.inline-leftout-barcen src-38 `tok-38 `tre-38)
861+++ test-inline-leftout-barcen-2
862+ (check ~.inline-leftout-barcen-2 src-39 `tok-39 `tre-39)
863+++ test-inline-leftout-barcen-3
864+ (check ~.inline-leftout-barcen-3 src-40 `tok-40 `tre-40)
327865++ test-inline-leftout-barhep
328− (check ~.inline-leftout-barhep src-38 ~ ~)
866+ (check ~.inline-leftout-barhep src-41 `tok-41 `tre-41)
329867++ test-inline-leftout-bartar
330− (check ~.inline-leftout-bartar src-39 ~ ~)
868+ (check ~.inline-leftout-bartar src-42 `tok-42 `tre-42)
331869++ test-inline-leftout-buc-paren
332− (check ~.inline-leftout-buc-paren src-40 ~ ~)
870+ (check ~.inline-leftout-buc-paren src-43 `tok-43 `tre-43)
871+++ test-inline-leftout-buc-paren-2
872+ (check ~.inline-leftout-buc-paren-2 src-44 `tok-44 `tre-44)
333873++ test-inline-leftout-buccen
334− (check ~.inline-leftout-buccen src-41 ~ ~)
874+ (check ~.inline-leftout-buccen src-45 `tok-45 `tre-45)
335875++ test-inline-leftout-cencol
336− (check ~.inline-leftout-cencol src-42 ~ ~)
876+ (check ~.inline-leftout-cencol src-46 `tok-46 `tre-46)
877+++ test-inline-leftout-cenhep
878+ (check ~.inline-leftout-cenhep src-47 `tok-47 `tre-47)
337879++ test-inline-leftout-centis
338− (check ~.inline-leftout-centis src-43 ~ ~)
880+ (check ~.inline-leftout-centis src-48 `tok-48 `tre-48)
881+++ test-inline-leftout-colhep
882+ (check ~.inline-leftout-colhep src-49 `tok-49 `tre-49)
339883++ test-inline-leftout-colon-wing
340− (check ~.inline-leftout-colon-wing src-44 ~ ~)
884+ (check ~.inline-leftout-colon-wing src-50 `tok-50 `tre-50)
341885++ test-inline-leftout-colsig
342− (check ~.inline-leftout-colsig src-45 ~ ~)
886+ (check ~.inline-leftout-colsig src-51 `tok-51 `tre-51)
343887++ test-inline-leftout-coltar
344− (check ~.inline-leftout-coltar src-46 ~ ~)
888+ (check ~.inline-leftout-coltar src-52 `tok-52 `tre-52)
345889++ test-inline-leftout-dottar
346− (check ~.inline-leftout-dottar src-47 ~ ~)
890+ (check ~.inline-leftout-dottar src-53 `tok-53 `tre-53)
347891++ test-inline-leftout-dottis
348− (check ~.inline-leftout-dottis src-48 ~ ~)
892+ (check ~.inline-leftout-dottis src-54 `tok-54 `tre-54)
349893++ test-inline-leftout-faslus
350− (check ~.inline-leftout-faslus src-49 ~ ~)
894+ (check ~.inline-leftout-faslus src-55 `tok-55 `tre-55)
351895++ test-inline-leftout-hephep
352− (check ~.inline-leftout-hephep src-50 ~ ~)
896+ (check ~.inline-leftout-hephep src-56 `tok-56 `tre-56)
353897++ test-inline-leftout-kethep-wide
354− (check ~.inline-leftout-kethep-wide src-51 ~ ~)
898+ (check ~.inline-leftout-kethep-wide src-57 `tok-57 `tre-57)
355899++ test-inline-leftout-kettar
356− (check ~.inline-leftout-kettar src-52 ~ ~)
900+ (check ~.inline-leftout-kettar src-58 `tok-58 `tre-58)
901+++ test-inline-leftout-miccol
902+ (check ~.inline-leftout-miccol src-59 `tok-59 `tre-59)
357903++ test-inline-leftout-sail
358− (check ~.inline-leftout-sail src-53 ~ ~)
904+ (check ~.inline-leftout-sail src-60 `tok-60 `tre-60)
359905++ test-inline-leftout-sigbar
360− (check ~.inline-leftout-sigbar src-54 ~ ~)
906+ (check ~.inline-leftout-sigbar src-61 `tok-61 `tre-61)
361907++ test-inline-leftout-signed-float-auras
362− (check ~.inline-leftout-signed-float-auras src-55 ~ ~)
908+ (check ~.inline-leftout-signed-float-auras src-62 `tok-62 `tre-62)
909+++ test-inline-leftout-sigpam-wide
910+ (check ~.inline-leftout-sigpam-wide src-63 `tok-63 `tre-63)
363911++ test-inline-leftout-tis-paren
364− (check ~.inline-leftout-tis-paren src-56 ~ ~)
912+ (check ~.inline-leftout-tis-paren src-64 `tok-64 `tre-64)
365913++ test-inline-leftout-tisfas
366− (check ~.inline-leftout-tisfas src-57 ~ ~)
914+ (check ~.inline-leftout-tisfas src-65 `tok-65 `tre-65)
367915++ test-inline-leftout-tisgal
368− (check ~.inline-leftout-tisgal src-58 ~ ~)
916+ (check ~.inline-leftout-tisgal src-66 `tok-66 `tre-66)
917+++ test-inline-leftout-tisgal-2
918+ (check ~.inline-leftout-tisgal-2 src-67 `tok-67 `tre-67)
369919++ test-inline-leftout-tisgar
370− (check ~.inline-leftout-tisgar src-59 ~ ~)
920+ (check ~.inline-leftout-tisgar src-68 `tok-68 `tre-68)
921+++ test-inline-leftout-tislus
922+ (check ~.inline-leftout-tislus src-69 `tok-69 `tre-69)
371923++ test-inline-leftout-tistis
372− (check ~.inline-leftout-tistis src-60 ~ ~)
924+ (check ~.inline-leftout-tistis src-70 `tok-70 `tre-70)
373925++ test-inline-leftout-wutcol
374− (check ~.inline-leftout-wutcol src-61 ~ ~)
926+ (check ~.inline-leftout-wutcol src-71 `tok-71 `tre-71)
927+++ test-inline-leftout-wutcol-2
928+ (check ~.inline-leftout-wutcol-2 src-72 `tok-72 `tre-72)
375929++ test-inline-leftout-wuthep-wide
376− (check ~.inline-leftout-wuthep-wide src-62 ~ ~)
930+ (check ~.inline-leftout-wuthep-wide src-73 `tok-73 `tre-73)
377931++ test-inline-leftout-wutlus
378− (check ~.inline-leftout-wutlus src-63 ~ ~)
932+ (check ~.inline-leftout-wutlus src-74 `tok-74 `tre-74)
933+++ test-inline-leftout-wutsig
934+ (check ~.inline-leftout-wutsig src-75 `tok-75 `tre-75)
379935++ test-inline-leftout-wutzap
380− (check ~.inline-leftout-wutzap src-64 ~ ~)
936+ (check ~.inline-leftout-wutzap src-76 `tok-76 `tre-76)
381937++ test-inline-leftout-zap-not
382− (check ~.inline-leftout-zap-not src-65 ~ ~)
938+ (check ~.inline-leftout-zap-not src-77 `tok-77 `tre-77)
383939++ test-inline-leftout-zapgar
384− (check ~.inline-leftout-zapgar src-66 ~ ~)
940+ (check ~.inline-leftout-zapgar src-78 `tok-78 `tre-78)
385941++ test-inline-list
386− (check ~.inline-list src-67 ~ ~)
942+ (check ~.inline-list src-79 `tok-79 `tre-79)
387943++ test-inline-list-parens
388− (check ~.inline-list-parens src-68 ~ ~)
944+ (check ~.inline-list-parens src-80 `tok-80 `tre-80)
389945++ test-inline-literal-defaults
390− (check ~.inline-literal-defaults src-69 ~ ~)
946+ (check ~.inline-literal-defaults src-81 `tok-81 `tre-81)
391947++ test-inline-load-slug
392− (check ~.inline-load-slug src-70 ~ ~)
948+ (check ~.inline-load-slug src-82 `tok-82 `tre-82)
393949++ test-inline-local-names
394− (check ~.inline-local-names src-71 ~ ~)
950+ (check ~.inline-local-names src-83 `tok-83 `tre-83)
395951++ test-inline-loobean
396− (check ~.inline-loobean src-72 ~ ~)
952+ (check ~.inline-loobean src-84 `tok-84 `tre-84)
397953++ test-inline-mark-digit
398− (check ~.inline-mark-digit src-73 ~ ~)
954+ (check ~.inline-mark-digit src-85 `tok-85 `tre-85)
399955++ test-inline-module-definitions
400− (check ~.inline-module-definitions src-74 ~ ~)
956+ (check ~.inline-module-definitions src-86 `tok-86 `tre-86)
401957++ test-inline-mold-add
402− (check ~.inline-mold-add src-75 ~ ~)
958+ (check ~.inline-mold-add src-87 `tok-87 `tre-87)
403959++ test-inline-mold-any-empty
404− (check ~.inline-mold-any-empty src-76 ~ ~)
960+ (check ~.inline-mold-any-empty src-88 `tok-88 `tre-88)
405961++ test-inline-mold-atoms
406− (check ~.inline-mold-atoms src-77 ~ ~)
962+ (check ~.inline-mold-atoms src-89 `tok-89 `tre-89)
407963++ test-inline-mold-constants
408− (check ~.inline-mold-constants src-78 ~ ~)
964+ (check ~.inline-mold-constants src-90 `tok-90 `tre-90)
409965++ test-inline-mold-containers
410− (check ~.inline-mold-containers src-79 ~ ~)
966+ (check ~.inline-mold-containers src-91 `tok-91 `tre-91)
411967++ test-inline-mold-gate
412− (check ~.inline-mold-gate src-80 ~ ~)
968+ (check ~.inline-mold-gate src-92 `tok-92 `tre-92)
413969++ test-inline-mold-generic
414− (check ~.inline-mold-generic src-81 ~ ~)
970+ (check ~.inline-mold-generic src-93 `tok-93 `tre-93)
415971++ test-inline-mold-opaque
416− (check ~.inline-mold-opaque src-82 ~ ~)
972+ (check ~.inline-mold-opaque src-94 `tok-94 `tre-94)
417973++ test-inline-mold-paths
418− (check ~.inline-mold-paths src-83 ~ ~)
974+ (check ~.inline-mold-paths src-95 `tok-95 `tre-95)
419975++ test-inline-mold-records
420− (check ~.inline-mold-records src-84 ~ ~)
976+ (check ~.inline-mold-records src-96 `tok-96 `tre-96)
421977++ test-inline-namespaces
422− (check ~.inline-namespaces src-85 ~ ~)
978+ (check ~.inline-namespaces src-97 `tok-97 `tre-97)
423979++ test-inline-no-operators
424− (check ~.inline-no-operators src-86 ~ ~)
980+ (check ~.inline-no-operators src-98 `tok-98 `tre-98)
425981++ test-inline-no-subs
426− (check ~.inline-no-subs src-87 ~ ~)
982+ (check ~.inline-no-subs src-99 `tok-99 `tre-99)
427983++ test-inline-null
428− (check ~.inline-null src-88 ~ ~)
984+ (check ~.inline-null src-100 `tok-100 `tre-100)
429985++ test-inline-pair
430− (check ~.inline-pair src-89 ~ ~)
986+ (check ~.inline-pair src-101 `tok-101 `tre-101)
431987++ test-inline-pairs-two-items
432− (check ~.inline-pairs-two-items src-90 ~ ~)
988+ (check ~.inline-pairs-two-items src-102 `tok-102 `tre-102)
433989++ test-inline-path
434− (check ~.inline-path src-91 ~ ~)
990+ (check ~.inline-path src-103 `tok-103 `tre-103)
435991++ test-inline-pattern-any
436− (check ~.inline-pattern-any src-92 ~ ~)
992+ (check ~.inline-pattern-any src-104 `tok-104 `tre-104)
437993++ test-inline-pattern-cell
438− (check ~.inline-pattern-cell src-93 ~ ~)
994+ (check ~.inline-pattern-cell src-105 `tok-105 `tre-105)
439995++ test-inline-pattern-crash-arm
440− (check ~.inline-pattern-crash-arm src-94 ~ ~)
996+ (check ~.inline-pattern-crash-arm src-106 `tok-106 `tre-106)
441997++ test-inline-pattern-date-bad
442− (check ~.inline-pattern-date-bad src-95 ~ ~)
998+ (check ~.inline-pattern-date-bad src-107 `tok-107 `tre-107)
999+++ test-inline-pattern-duration-bad
1000+ (check ~.inline-pattern-duration-bad src-108 `tok-108 `tre-108)
4431001++ test-inline-pattern-eq
444− (check ~.inline-pattern-eq src-96 ~ ~)
1002+ (check ~.inline-pattern-eq src-109 `tok-109 `tre-109)
1003+++ test-inline-pattern-face-bad
1004+ (check ~.inline-pattern-face-bad src-110 `tok-110 `tre-110)
4451005++ test-inline-pattern-head-tag
446− (check ~.inline-pattern-head-tag src-97 ~ ~)
1006+ (check ~.inline-pattern-head-tag src-111 `tok-111 `tre-111)
4471007++ test-inline-pattern-interpolated-bad
448− (check ~.inline-pattern-interpolated-bad src-98 ~ ~)
1008+ (check ~.inline-pattern-interpolated-bad src-112 `tok-112 `tre-112)
4491009++ test-inline-pattern-list-bad
450− (check ~.inline-pattern-list-bad src-99 ~ ~)
1010+ (check ~.inline-pattern-list-bad src-113 `tok-113 `tre-113)
4511011++ test-inline-pattern-literals
452− (check ~.inline-pattern-literals src-100 ~ ~)
1012+ (check ~.inline-pattern-literals src-114 `tok-114 `tre-114)
4531013++ test-inline-pattern-loobean
454− (check ~.inline-pattern-loobean src-101 ~ ~)
1014+ (check ~.inline-pattern-loobean src-115 `tok-115 `tre-115)
4551015++ test-inline-pattern-move-any
456− (check ~.inline-pattern-move-any src-102 ~ ~)
1016+ (check ~.inline-pattern-move-any src-116 `tok-116 `tre-116)
4571017++ test-inline-pattern-name
458− (check ~.inline-pattern-name src-103 ~ ~)
1018+ (check ~.inline-pattern-name src-117 `tok-117 `tre-117)
4591019++ test-inline-pattern-null
460− (check ~.inline-pattern-null src-104 ~ ~)
1020+ (check ~.inline-pattern-null src-118 `tok-118 `tre-118)
4611021++ test-inline-pattern-pair-bad
462− (check ~.inline-pattern-pair-bad src-105 ~ ~)
1022+ (check ~.inline-pattern-pair-bad src-119 `tok-119 `tre-119)
4631023++ test-inline-pattern-tail-tag
464− (check ~.inline-pattern-tail-tag src-106 ~ ~)
1024+ (check ~.inline-pattern-tail-tag src-120 `tok-120 `tre-120)
4651025++ test-inline-pattern-term
466− (check ~.inline-pattern-term src-107 ~ ~)
1026+ (check ~.inline-pattern-term src-121 `tok-121 `tre-121)
4671027++ test-inline-pattern-two-tags
468− (check ~.inline-pattern-two-tags src-108 ~ ~)
1028+ (check ~.inline-pattern-two-tags src-122 `tok-122 `tre-122)
4691029++ test-inline-pattern-unit
470− (check ~.inline-pattern-unit src-109 ~ ~)
1030+ (check ~.inline-pattern-unit src-123 `tok-123 `tre-123)
4711031++ test-inline-qath
472− (check ~.inline-qath src-110 ~ ~)
1032+ (check ~.inline-qath src-124 `tok-124 `tre-124)
4731033++ test-inline-requests
474− (check ~.inline-requests src-111 ~ ~)
1034+ (check ~.inline-requests src-125 `tok-125 `tre-125)
4751035++ test-inline-scry-case
476− (check ~.inline-scry-case src-112 ~ ~)
1036+ (check ~.inline-scry-case src-126 `tok-126 `tre-126)
4771037++ test-inline-self-reference
478− (check ~.inline-self-reference src-113 ~ ~)
1038+ (check ~.inline-self-reference src-127 `tok-127 `tre-127)
4791039++ test-inline-ship
480− (check ~.inline-ship src-114 ~ ~)
1040+ (check ~.inline-ship src-128 `tok-128 `tre-128)
4811041++ test-inline-static-image
482− (check ~.inline-static-image src-115 ~ ~)
1042+ (check ~.inline-static-image src-129 `tok-129 `tre-129)
4831043++ test-inline-string
484− (check ~.inline-string src-116 ~ ~)
1044+ (check ~.inline-string src-130 `tok-130 `tre-130)
4851045++ test-inline-tag-shape
486− (check ~.inline-tag-shape src-117 ~ ~)
1046+ (check ~.inline-tag-shape src-131 `tok-131 `tre-131)
4871047++ test-inline-term
488− (check ~.inline-term src-118 ~ ~)
1048+ (check ~.inline-term src-132 `tok-132 `tre-132)
4891049++ test-inline-text-items
490− (check ~.inline-text-items src-119 ~ ~)
1050+ (check ~.inline-text-items src-133 `tok-133 `tre-133)
4911051++ test-inline-union-wide
492− (check ~.inline-union-wide src-120 ~ ~)
1052+ (check ~.inline-union-wide src-134 `tok-134 `tre-134)
4931053++ test-inline-unit
494− (check ~.inline-unit src-121 ~ ~)
1054+ (check ~.inline-unit src-135 `tok-135 `tre-135)
4951055++ test-inline-wide-form-rune-bad
496− (check ~.inline-wide-form-rune-bad src-122 ~ ~)
1056+ (check ~.inline-wide-form-rune-bad src-136 `tok-136 `tre-136)
4971057++ test-inline-wide-forms
498− (check ~.inline-wide-forms src-123 ~ ~)
1058+ (check ~.inline-wide-forms src-137 `tok-137 `tre-137)
4991059++ test-inline-wide-union-call
500− (check ~.inline-wide-union-call src-124 ~ ~)
1060+ (check ~.inline-wide-union-call src-138 `tok-138 `tre-138)
5011061++ test-inline-wings
502− (check ~.inline-wings src-125 ~ ~)
1062+ (check ~.inline-wings src-139 `tok-139 `tre-139)
5031063++ test-lex-base32-bad-1
504− (check ~.lex-base32-bad-1 src-126 ~ ~)
1064+ (check ~.lex-base32-bad-1 src-140 `tok-140 `tre-140)
5051065++ test-lex-base32-ok-1
506− (check ~.lex-base32-ok-1 src-127 ~ ~)
1066+ (check ~.lex-base32-ok-1 src-141 `tok-141 `tre-141)
1067+++ test-lex-blob-bad-1
1068+ (check ~.lex-blob-bad-1 src-142 `tok-142 `tre-142)
5071069++ test-lex-call-open-bad-1
508− (check ~.lex-call-open-bad-1 src-128 ~ ~)
1070+ (check ~.lex-call-open-bad-1 src-143 `tok-143 `tre-143)
5091071++ test-lex-call-open-bad-2
510− (check ~.lex-call-open-bad-2 src-129 ~ ~)
1072+ (check ~.lex-call-open-bad-2 src-144 `tok-144 `tre-144)
5111073++ test-lex-call-open-bad-3
512− (check ~.lex-call-open-bad-3 src-130 ~ ~)
1074+ (check ~.lex-call-open-bad-3 src-145 `tok-145 `tre-145)
5131075++ test-lex-call-open-ok-1
514− (check ~.lex-call-open-ok-1 src-131 ~ ~)
1076+ (check ~.lex-call-open-ok-1 src-146 `tok-146 `tre-146)
5151077++ test-lex-cell-bad-1
516− (check ~.lex-cell-bad-1 src-132 ~ ~)
1078+ (check ~.lex-cell-bad-1 src-147 `tok-147 `tre-147)
5171079++ test-lex-cell-ok-1
518− (check ~.lex-cell-ok-1 src-133 ~ ~)
1080+ (check ~.lex-cell-ok-1 src-148 `tok-148 `tre-148)
1081+++ test-lex-closer-bad-1
1082+ (check ~.lex-closer-bad-1 src-149 `tok-149 `tre-149)
1083+++ test-lex-closer-bad-2
1084+ (check ~.lex-closer-bad-2 src-150 `tok-150 `tre-150)
1085+++ test-lex-closer-bad-3
1086+ (check ~.lex-closer-bad-3 src-151 `tok-151 `tre-151)
1087+++ test-lex-codepoint-bad-1
1088+ (check ~.lex-codepoint-bad-1 src-152 `tok-152 `tre-152)
5191089++ test-lex-comment-bad-1
520− (check ~.lex-comment-bad-1 src-134 ~ ~)
1090+ (check ~.lex-comment-bad-1 src-153 `tok-153 `tre-153)
5211091++ test-lex-comment-ok-1
522− (check ~.lex-comment-ok-1 src-135 ~ ~)
1092+ (check ~.lex-comment-ok-1 src-154 `tok-154 `tre-154)
5231093++ test-lex-comment-ok-2
524− (check ~.lex-comment-ok-2 src-136 ~ ~)
1094+ (check ~.lex-comment-ok-2 src-155 `tok-155 `tre-155)
5251095++ test-lex-comment-ok-3
526− (check ~.lex-comment-ok-3 src-137 ~ ~)
1096+ (check ~.lex-comment-ok-3 src-156 `tok-156 `tre-156)
5271097++ test-lex-date-bad-1
528− (check ~.lex-date-bad-1 src-138 ~ ~)
1098+ (check ~.lex-date-bad-1 src-157 `tok-157 `tre-157)
5291099++ test-lex-date-bad-2
530− (check ~.lex-date-bad-2 src-139 ~ ~)
1100+ (check ~.lex-date-bad-2 src-158 `tok-158 `tre-158)
1101+++ test-lex-date-bad-3
1102+ (check ~.lex-date-bad-3 src-159 `tok-159 `tre-159)
5311103++ test-lex-date-ok-1
532− (check ~.lex-date-ok-1 src-140 ~ ~)
1104+ (check ~.lex-date-ok-1 src-160 `tok-160 `tre-160)
5331105++ test-lex-decimal-bad-1
534− (check ~.lex-decimal-bad-1 src-141 ~ ~)
1106+ (check ~.lex-decimal-bad-1 src-161 `tok-161 `tre-161)
5351107++ test-lex-decimal-bad-2
536− (check ~.lex-decimal-bad-2 src-142 ~ ~)
1108+ (check ~.lex-decimal-bad-2 src-162 `tok-162 `tre-162)
5371109++ test-lex-decimal-ok-1
538− (check ~.lex-decimal-ok-1 src-143 ~ ~)
1110+ (check ~.lex-decimal-ok-1 src-163 `tok-163 `tre-163)
5391111++ test-lex-duration-bad-1
540− (check ~.lex-duration-bad-1 src-144 ~ ~)
1112+ (check ~.lex-duration-bad-1 src-164 `tok-164 `tre-164)
1113+++ test-lex-duration-bad-2
1114+ (check ~.lex-duration-bad-2 src-165 `tok-165 `tre-165)
5411115++ test-lex-duration-ok-1
542− (check ~.lex-duration-ok-1 src-145 ~ ~)
1116+ (check ~.lex-duration-ok-1 src-166 `tok-166 `tre-166)
5431117++ test-lex-hex-bad-1
544− (check ~.lex-hex-bad-1 src-146 ~ ~)
1118+ (check ~.lex-hex-bad-1 src-167 `tok-167 `tre-167)
5451119++ test-lex-hex-ok-1
546− (check ~.lex-hex-ok-1 src-147 ~ ~)
1120+ (check ~.lex-hex-ok-1 src-168 `tok-168 `tre-168)
5471121++ test-lex-indent-bad-1
548− (check ~.lex-indent-bad-1 src-148 ~ ~)
1122+ (check ~.lex-indent-bad-1 src-169 `tok-169 `tre-169)
5491123++ test-lex-indent-bad-2
550− (check ~.lex-indent-bad-2 src-149 ~ ~)
1124+ (check ~.lex-indent-bad-2 src-170 `tok-170 `tre-170)
5511125++ test-lex-indent-bad-3
552− (check ~.lex-indent-bad-3 src-150 ~ ~)
1126+ (check ~.lex-indent-bad-3 src-171 `tok-171 `tre-171)
5531127++ test-lex-indent-ok-1
554− (check ~.lex-indent-ok-1 src-151 ~ ~)
1128+ (check ~.lex-indent-ok-1 src-172 `tok-172 `tre-172)
5551129++ test-lex-indent-ok-2
556− (check ~.lex-indent-ok-2 src-152 ~ ~)
1130+ (check ~.lex-indent-ok-2 src-173 `tok-173 `tre-173)
5571131++ test-lex-indent-ok-3
558− (check ~.lex-indent-ok-3 src-153 ~ ~)
1132+ (check ~.lex-indent-ok-3 src-174 `tok-174 `tre-174)
5591133++ test-lex-interp-bad-1
560− (check ~.lex-interp-bad-1 src-154 ~ ~)
1134+ (check ~.lex-interp-bad-1 src-175 `tok-175 `tre-175)
5611135++ test-lex-interp-bad-2
562− (check ~.lex-interp-bad-2 src-155 ~ ~)
1136+ (check ~.lex-interp-bad-2 src-176 `tok-176 `tre-176)
5631137++ test-lex-interp-bad-3
564− (check ~.lex-interp-bad-3 src-156 ~ ~)
1138+ (check ~.lex-interp-bad-3 src-177 `tok-177 `tre-177)
5651139++ test-lex-interp-bad-4
566− (check ~.lex-interp-bad-4 src-157 ~ ~)
1140+ (check ~.lex-interp-bad-4 src-178 `tok-178 `tre-178)
5671141++ test-lex-interp-ok-1
568− (check ~.lex-interp-ok-1 src-158 ~ ~)
1142+ (check ~.lex-interp-ok-1 src-179 `tok-179 `tre-179)
5691143++ test-lex-interp-ok-2
570− (check ~.lex-interp-ok-2 src-159 ~ ~)
1144+ (check ~.lex-interp-ok-2 src-180 `tok-180 `tre-180)
5711145++ test-lex-knot-bad-1
572− (check ~.lex-knot-bad-1 src-160 ~ ~)
1146+ (check ~.lex-knot-bad-1 src-181 `tok-181 `tre-181)
5731147++ test-lex-knot-ok-1
574− (check ~.lex-knot-ok-1 src-161 ~ ~)
1148+ (check ~.lex-knot-ok-1 src-182 `tok-182 `tre-182)
5751149++ test-lex-layout-bad-1
576− (check ~.lex-layout-bad-1 src-162 ~ ~)
1150+ (check ~.lex-layout-bad-1 src-183 `tok-183 `tre-183)
5771151++ test-lex-layout-bad-2
578− (check ~.lex-layout-bad-2 src-163 ~ ~)
1152+ (check ~.lex-layout-bad-2 src-184 `tok-184 `tre-184)
5791153++ test-lex-layout-bad-3
580− (check ~.lex-layout-bad-3 src-164 ~ ~)
1154+ (check ~.lex-layout-bad-3 src-185 `tok-185 `tre-185)
5811155++ test-lex-layout-bad-4
582− (check ~.lex-layout-bad-4 src-165 ~ ~)
1156+ (check ~.lex-layout-bad-4 src-186 `tok-186 `tre-186)
5831157++ test-lex-layout-ok-1
584− (check ~.lex-layout-ok-1 src-166 ~ ~)
1158+ (check ~.lex-layout-ok-1 src-187 `tok-187 `tre-187)
5851159++ test-lex-list-bad-1
586− (check ~.lex-list-bad-1 src-167 ~ ~)
1160+ (check ~.lex-list-bad-1 src-188 `tok-188 `tre-188)
5871161++ test-lex-list-ok-1
588− (check ~.lex-list-ok-1 src-168 ~ ~)
1162+ (check ~.lex-list-ok-1 src-189 `tok-189 `tre-189)
5891163++ test-lex-loobean-bad-1
590− (check ~.lex-loobean-bad-1 src-169 ~ ~)
1164+ (check ~.lex-loobean-bad-1 src-190 `tok-190 `tre-190)
5911165++ test-lex-loobean-ok-1
592− (check ~.lex-loobean-ok-1 src-170 ~ ~)
1166+ (check ~.lex-loobean-ok-1 src-191 `tok-191 `tre-191)
5931167++ test-lex-name-bad-1
594− (check ~.lex-name-bad-1 src-171 ~ ~)
1168+ (check ~.lex-name-bad-1 src-192 `tok-192 `tre-192)
5951169++ test-lex-name-bad-2
596− (check ~.lex-name-bad-2 src-172 ~ ~)
1170+ (check ~.lex-name-bad-2 src-193 `tok-193 `tre-193)
5971171++ test-lex-name-bad-3
598− (check ~.lex-name-bad-3 src-173 ~ ~)
1172+ (check ~.lex-name-bad-3 src-194 `tok-194 `tre-194)
5991173++ test-lex-name-bad-4
600− (check ~.lex-name-bad-4 src-174 ~ ~)
1174+ (check ~.lex-name-bad-4 src-195 `tok-195 `tre-195)
1175+++ test-lex-name-bad-5
1176+ (check ~.lex-name-bad-5 src-196 `tok-196 `tre-196)
1177+++ test-lex-name-bad-6
1178+ (check ~.lex-name-bad-6 src-197 `tok-197 `tre-197)
6011179++ test-lex-name-ok-1
602− (check ~.lex-name-ok-1 src-175 ~ ~)
1180+ (check ~.lex-name-ok-1 src-198 `tok-198 `tre-198)
6031181++ test-lex-null-bad-1
604− (check ~.lex-null-bad-1 src-176 ~ ~)
1182+ (check ~.lex-null-bad-1 src-199 `tok-199 `tre-199)
6051183++ test-lex-null-ok-1
606− (check ~.lex-null-ok-1 src-177 ~ ~)
1184+ (check ~.lex-null-ok-1 src-200 `tok-200 `tre-200)
6071185++ test-lex-open-bracket-bad-1
608− (check ~.lex-open-bracket-bad-1 src-178 ~ ~)
1186+ (check ~.lex-open-bracket-bad-1 src-201 `tok-201 `tre-201)
6091187++ test-lex-open-bracket-bad-2
610− (check ~.lex-open-bracket-bad-2 src-179 ~ ~)
1188+ (check ~.lex-open-bracket-bad-2 src-202 `tok-202 `tre-202)
6111189++ test-lex-open-bracket-bad-3
612− (check ~.lex-open-bracket-bad-3 src-180 ~ ~)
1190+ (check ~.lex-open-bracket-bad-3 src-203 `tok-203 `tre-203)
6131191++ test-lex-open-bracket-bad-4
614− (check ~.lex-open-bracket-bad-4 src-181 ~ ~)
1192+ (check ~.lex-open-bracket-bad-4 src-204 `tok-204 `tre-204)
1193+++ test-lex-open-bracket-bad-5
1194+ (check ~.lex-open-bracket-bad-5 src-205 `tok-205 `tre-205)
6151195++ test-lex-open-bracket-ok-1
616− (check ~.lex-open-bracket-ok-1 src-182 ~ ~)
1196+ (check ~.lex-open-bracket-ok-1 src-206 `tok-206 `tre-206)
6171197++ test-lex-open-bracket-ok-2
618− (check ~.lex-open-bracket-ok-2 src-183 ~ ~)
1198+ (check ~.lex-open-bracket-ok-2 src-207 `tok-207 `tre-207)
6191199++ test-lex-pair-binding-bad-1
620− (check ~.lex-pair-binding-bad-1 src-184 ~ ~)
1200+ (check ~.lex-pair-binding-bad-1 src-208 `tok-208 `tre-208)
6211201++ test-lex-pair-binding-ok-1
622− (check ~.lex-pair-binding-ok-1 src-185 ~ ~)
1202+ (check ~.lex-pair-binding-ok-1 src-209 `tok-209 `tre-209)
6231203++ test-lex-path-bad-1
624− (check ~.lex-path-bad-1 src-186 ~ ~)
1204+ (check ~.lex-path-bad-1 src-210 `tok-210 `tre-210)
6251205++ test-lex-path-ok-1
626− (check ~.lex-path-ok-1 src-187 ~ ~)
1206+ (check ~.lex-path-ok-1 src-211 `tok-211 `tre-211)
6271207++ test-lex-rune-layout-bad-1
628− (check ~.lex-rune-layout-bad-1 src-188 ~ ~)
1208+ (check ~.lex-rune-layout-bad-1 src-212 `tok-212 `tre-212)
6291209++ test-lex-rune-layout-bad-2
630− (check ~.lex-rune-layout-bad-2 src-189 ~ ~)
1210+ (check ~.lex-rune-layout-bad-2 src-213 `tok-213 `tre-213)
6311211++ test-lex-rune-layout-bad-3
632− (check ~.lex-rune-layout-bad-3 src-190 ~ ~)
1212+ (check ~.lex-rune-layout-bad-3 src-214 `tok-214 `tre-214)
6331213++ test-lex-rune-layout-bad-4
634− (check ~.lex-rune-layout-bad-4 src-191 ~ ~)
1214+ (check ~.lex-rune-layout-bad-4 src-215 `tok-215 `tre-215)
6351215++ test-lex-rune-layout-ok-1
636− (check ~.lex-rune-layout-ok-1 src-192 ~ ~)
1216+ (check ~.lex-rune-layout-ok-1 src-216 `tok-216 `tre-216)
6371217++ test-lex-ship-bad-1
638− (check ~.lex-ship-bad-1 src-193 ~ ~)
1218+ (check ~.lex-ship-bad-1 src-217 `tok-217 `tre-217)
6391219++ test-lex-ship-ok-1
640− (check ~.lex-ship-ok-1 src-194 ~ ~)
1220+ (check ~.lex-ship-ok-1 src-218 `tok-218 `tre-218)
6411221++ test-lex-spacing-bad-1
642− (check ~.lex-spacing-bad-1 src-195 ~ ~)
1222+ (check ~.lex-spacing-bad-1 src-219 `tok-219 `tre-219)
6431223++ test-lex-spacing-bad-2
644− (check ~.lex-spacing-bad-2 src-196 ~ ~)
1224+ (check ~.lex-spacing-bad-2 src-220 `tok-220 `tre-220)
6451225++ test-lex-spacing-bad-3
646− (check ~.lex-spacing-bad-3 src-197 ~ ~)
1226+ (check ~.lex-spacing-bad-3 src-221 `tok-221 `tre-221)
6471227++ test-lex-spacing-bad-4
648− (check ~.lex-spacing-bad-4 src-198 ~ ~)
1228+ (check ~.lex-spacing-bad-4 src-222 `tok-222 `tre-222)
6491229++ test-lex-spacing-ok-1
650− (check ~.lex-spacing-ok-1 src-199 ~ ~)
1230+ (check ~.lex-spacing-ok-1 src-223 `tok-223 `tre-223)
6511231++ test-lex-string-bad-1
652− (check ~.lex-string-bad-1 src-200 ~ ~)
1232+ (check ~.lex-string-bad-1 src-224 `tok-224 `tre-224)
6531233++ test-lex-string-bad-2
654− (check ~.lex-string-bad-2 src-201 ~ ~)
1234+ (check ~.lex-string-bad-2 src-225 `tok-225 `tre-225)
6551235++ test-lex-string-ok-1
656− (check ~.lex-string-ok-1 src-202 ~ ~)
1236+ (check ~.lex-string-ok-1 src-226 `tok-226 `tre-226)
6571237++ test-lex-term-bad-1
658− (check ~.lex-term-bad-1 src-203 ~ ~)
1238+ (check ~.lex-term-bad-1 src-227 `tok-227 `tre-227)
6591239++ test-lex-term-bad-2
660− (check ~.lex-term-bad-2 src-204 ~ ~)
1240+ (check ~.lex-term-bad-2 src-228 `tok-228 `tre-228)
6611241++ test-lex-term-bad-3
662− (check ~.lex-term-bad-3 src-205 ~ ~)
1242+ (check ~.lex-term-bad-3 src-229 `tok-229 `tre-229)
6631243++ test-lex-term-ok-1
664− (check ~.lex-term-ok-1 src-206 ~ ~)
1244+ (check ~.lex-term-ok-1 src-230 `tok-230 `tre-230)
6651245++ test-lex-tight-change-bad-1
666− (check ~.lex-tight-change-bad-1 src-207 ~ ~)
1246+ (check ~.lex-tight-change-bad-1 src-231 `tok-231 `tre-231)
6671247++ test-lex-tight-change-bad-2
668− (check ~.lex-tight-change-bad-2 src-208 ~ ~)
1248+ (check ~.lex-tight-change-bad-2 src-232 `tok-232 `tre-232)
6691249++ test-lex-tight-change-ok-1
670− (check ~.lex-tight-change-ok-1 src-209 ~ ~)
1250+ (check ~.lex-tight-change-ok-1 src-233 `tok-233 `tre-233)
6711251++ test-lex-tight-ctor-bad-1
672− (check ~.lex-tight-ctor-bad-1 src-210 ~ ~)
1252+ (check ~.lex-tight-ctor-bad-1 src-234 `tok-234 `tre-234)
6731253++ test-lex-tight-ctor-bad-2
674− (check ~.lex-tight-ctor-bad-2 src-211 ~ ~)
1254+ (check ~.lex-tight-ctor-bad-2 src-235 `tok-235 `tre-235)
6751255++ test-lex-tight-ctor-ok-1
676− (check ~.lex-tight-ctor-ok-1 src-212 ~ ~)
1256+ (check ~.lex-tight-ctor-ok-1 src-236 `tok-236 `tre-236)
6771257++ test-lex-tight-opener-bad-1
678− (check ~.lex-tight-opener-bad-1 src-213 ~ ~)
1258+ (check ~.lex-tight-opener-bad-1 src-237 `tok-237 `tre-237)
6791259++ test-lex-tight-opener-bad-2
680− (check ~.lex-tight-opener-bad-2 src-214 ~ ~)
1260+ (check ~.lex-tight-opener-bad-2 src-238 `tok-238 `tre-238)
6811261++ test-lex-tight-opener-bad-3
682− (check ~.lex-tight-opener-bad-3 src-215 ~ ~)
1262+ (check ~.lex-tight-opener-bad-3 src-239 `tok-239 `tre-239)
6831263++ test-lex-tight-opener-bad-4
684− (check ~.lex-tight-opener-bad-4 src-216 ~ ~)
1264+ (check ~.lex-tight-opener-bad-4 src-240 `tok-240 `tre-240)
6851265++ test-lex-tight-opener-ok-1
686− (check ~.lex-tight-opener-ok-1 src-217 ~ ~)
1266+ (check ~.lex-tight-opener-ok-1 src-241 `tok-241 `tre-241)
6871267++ test-lex-tight-pair-bad-1
688− (check ~.lex-tight-pair-bad-1 src-218 ~ ~)
1268+ (check ~.lex-tight-pair-bad-1 src-242 `tok-242 `tre-242)
1269+++ test-lex-tight-pair-bad-2
1270+ (check ~.lex-tight-pair-bad-2 src-243 `tok-243 `tre-243)
1271+++ test-lex-tight-pair-bad-3
1272+ (check ~.lex-tight-pair-bad-3 src-244 `tok-244 `tre-244)
6891273++ test-lex-tight-pair-ok-1
690− (check ~.lex-tight-pair-ok-1 src-219 ~ ~)
1274+ (check ~.lex-tight-pair-ok-1 src-245 `tok-245 `tre-245)
6911275++ test-lex-tight-qath-bad-1
692− (check ~.lex-tight-qath-bad-1 src-220 ~ ~)
1276+ (check ~.lex-tight-qath-bad-1 src-246 `tok-246 `tre-246)
6931277++ test-lex-tight-qath-bad-2
694− (check ~.lex-tight-qath-bad-2 src-221 ~ ~)
1278+ (check ~.lex-tight-qath-bad-2 src-247 `tok-247 `tre-247)
6951279++ test-lex-tight-qath-bad-3
696− (check ~.lex-tight-qath-bad-3 src-222 ~ ~)
1280+ (check ~.lex-tight-qath-bad-3 src-248 `tok-248 `tre-248)
6971281++ test-lex-tight-qath-ok-1
698− (check ~.lex-tight-qath-ok-1 src-223 ~ ~)
1282+ (check ~.lex-tight-qath-ok-1 src-249 `tok-249 `tre-249)
6991283++ test-lex-tight-unit-bad-1
700− (check ~.lex-tight-unit-bad-1 src-224 ~ ~)
1284+ (check ~.lex-tight-unit-bad-1 src-250 `tok-250 `tre-250)
7011285++ test-lex-tight-unit-ok-1
702− (check ~.lex-tight-unit-ok-1 src-225 ~ ~)
1286+ (check ~.lex-tight-unit-ok-1 src-251 `tok-251 `tre-251)
7031287++ test-lex-tight-wing-bad-1
704− (check ~.lex-tight-wing-bad-1 src-226 ~ ~)
1288+ (check ~.lex-tight-wing-bad-1 src-252 `tok-252 `tre-252)
7051289++ test-lex-tight-wing-ok-1
706− (check ~.lex-tight-wing-ok-1 src-227 ~ ~)
1290+ (check ~.lex-tight-wing-ok-1 src-253 `tok-253 `tre-253)
7071291::
7081292:: +check: run golden:jibb on a case and compare both outputs
7091293::
tools/hoon+10−1
@@ -71,7 +71,16 @@ def cord_binding(spec):
7171 data = f.read()
7272 except OSError as e:
7373 raise ue.ToolError('--cord %s: %s' % (spec, e.strerror))
74− return '=/ %s=@t %s' % (name, ue.cord_literal(data)), name
74+ # One literal per line, joined by rap: Hoon reads one long cord
75+ # literal in more than linear time.
76+ lines = [l + b'\n' for l in data.split(b'\n')]
77+ lines[-1] = lines[-1][:-1]
78+ if not lines[-1]:
79+ lines.pop()
80+ if not lines:
81+ return "=/ %s=@t ''" % name, name
82+ cords = ' '.join(ue.cord_literal(l) for l in lines)
83+ return '=/ %s=@t (rap 3 `(list @t)`~[%s])' % (name, cords), name
7584
7685
7786def main(argv):