on master help sign in
Harden the parser after two independent audits
7c739b7Claude
jibb-dev/lib/jibb.hoon+1221−344
@@ -26,7 +26,9 @@
26:: likely reading and are listed, with the doc's words, for the doc's
26:: likely reading and are listed, with the doc's words, for the doc's
27:: author to settle. The golden corpus's "expect:" lines give each
27:: author to settle. The golden corpus's "expect:" lines give each
28:: error's position. The layout pass's errors sit there, except where
28:: 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).
30::
32::
31:: ===================================================================
33:: ===================================================================
32:: 1. Positions
34:: 1. Positions
@@ -52,7 +54,12 @@
52:: only, and milestone 1's errors use starts only, so ends are first
54:: only, and milestone 1's errors use starts only, so ends are first
53:: used by milestone 2's excerpts. Until then +check-spans tests the two
55:: used by milestone 2's excerpts. Until then +check-spans tests the two
54:: rules above on every tree +golden prints, and a tree that breaks one
56:: 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).
56::
63::
57:: ===================================================================
64:: ===================================================================
58:: 2. The layout pass (+layout)
65:: 2. The layout pass (+layout)
@@ -62,17 +69,22 @@
62:: crosses a line break, and only layout tokens join lines.
69:: crosses a line break, and only layout tokens join lines.
63::
70::
64:: 2.0 Errors. +layout never fails. Where the text breaks a rule of this
71:: 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
72+:: section, it emits one error token, [%error msg from c], at the first
66−:: character that breaks it, and stops reading. The parser accepts no
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
67−:: error token, so it reports whichever comes first, its own error or
76+:: space. The parser accepts no error token, so it reports whichever
68−:: this one (section 3, Errors). Every error, from either stage, points
77+:: comes first, its own error or this one (section 3, Errors). Every
69−:: at the first character where the text stops being the start of any
78+:: error, from either stage, points at the first character where the
70−:: valid module: everything before it could still be right. Hoon's
79+:: text stops being the start of any valid module: everything before
71−:: parser reports errors the same way, and the golden corpus's expect
80+:: it could still be right. Hoon's parser reports errors the same way,
72−:: lines assume it. It also puts `++ x ]` on line 1 before a bad string
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
73−:: on line 9, which a lexer that failed first would report instead. The
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).
74−:: positions below follow from it. Messages quote code in backticks, as
87+:: Messages quote code in backticks, as the parser's do.
75−:: the parser's do (section 3, Errors).
76::
88::
77:: 2.1 Lines. The text is split at every \0a. A final \0a ends the last
89:: 2.1 Lines. The text is split at every \0a. A final \0a ends the last
78:: line rather than starting an empty one. Lines are numbered from 1.
90:: line rather than starting an empty one. Lines are numbered from 1.
@@ -164,7 +176,8 @@
164:: $?( $? $-( glyphs; $- followed by anything but ( is an error
176:: $?( $? $-( glyphs; $- followed by anything but ( is an error
165:: at 3rd, "`$-` has only the wide form `$-(sample
177:: at 3rd, "`$-` has only the wide form `$-(sample
166:: product)`"
178:: 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)
168:: @ aura: @, then [a-z]*, then at most one [A-Z]; the
181:: @ aura: @, then [a-z]*, then at most one [A-Z]; the
169:: token holds the text after @. An aura starting @s or
182:: token holds the text after @. An aura starting @s or
170:: @r is an error at 2nd: "signed and floating-point
183:: @r is an error at 2nd: "signed and floating-point
@@ -186,8 +199,8 @@
186:: an error at 2nd, "`|` begins `|=`, `|=(` or `|$`",
199:: an error at 2nd, "`|` begins `|=`, `|=(` or `|$`",
187:: "`$` begins `$?`, `$?(` or `$-(`", "`^` begins `^-`"
200:: "`$` begins `$?`, `$?(` or `$-(`", "`^` begins `^-`"
188:: : followed by anything but :, an error at 2nd: the
201:: : followed by anything but :, an error at 2nd: the
189−:: table's :~ :* and a:b, else "a comment starts with
202+:: table's :~ :* :- :+ :^ :_ and a:b, else "a comment
190−:: `::`"
203+:: starts with `::`"
191:: anything else an error at it, naming it: "unexpected `,`", with a
204:: anything else an error at it, naming it: "unexpected `,`", with a
192:: hint where one helps (+unexpected): for , . - and <,
205:: hint where one helps (+unexpected): for , . - and <,
193:: what Jibb writes instead
206:: what Jibb writes instead
@@ -195,32 +208,46 @@
195:: Hoon forms the doc leaves out are errors with the doc's reason, as
208:: Hoon forms the doc leaves out are errors with the doc's reason, as
196:: "`|%` is left out: modules are records". Each points where the text
209:: "`|%` is left out: modules are records". Each points where the text
197:: stops being Jibb: at its second character when its first can begin
210:: 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):
199::
217::
200:: |% |_ |* 2nd modules are records
218:: |% |_ |* 2nd modules are records
201:: |- 2nd gates recurse by name
219:: |- 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 $)
203:: $% 2nd $? covers unions
222:: $% 2nd $? covers unions
223+:: ?: ?+ 2nd ?- is the branch, and so for Hoon's other ?
224+:: runes, ?~ ?= ?. ?@ ?^ ?& ?| ?< ?> (?:: is ?
204−:: ?+ ?: 2nd ?- is the branch (?:: is ? and a comment)
225+:: and a comment)
205:: ?! 2nd eq and not are gates
226:: ?! 2nd eq and not are gates
206:: .= 1st eq and not are gates
227:: .= 1st eq and not are gates
207:: !x 2nd not is a gate: ! then anything but ! or >
228:: !x 2nd not is a gate: ! then anything but ! or >
208:: !> /+ 2nd code also runs in the browser
229:: !> /+ 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
210:: a:b 2nd of the :, right after a name: names never
232:: a:b 2nd of the :, right after a name: names never
211:: shadow, and . reads imports too; write a.b
233:: shadow, and . reads imports too; write a.b
212:: :~ :* 2nd indentation covers them; write ~[…] or […]
234:: :~ :* 2nd indentation covers them; write ~[…] or […]
235+:: :- :+ :^ :_ 2nd indentation covers them; write a cell as [a b]
236+:: %: %- %+ 2nd indentation covers them; a call is (f a b)
237+:: %^ %~
213−:: %: %= 2nd indentation covers them
238+:: %= 2nd indentation covers it; write a change, m(a=b)
214−:: == -- 1st the closers are left out: indentation covers
239+:: == 2nd the closers are left out: indentation covers
215−:: them
240+:: -- 1st them
216:: ~| 2nd ~& covers debugging
241:: ~| 2nd ~& covers debugging
242+:: ;: 1st nest the calls, as (add a (add b c))
217:: ; 1st Sail's ; runes are left out: layout is Jibb's
243:: ; 1st Sail's ; runes are left out: layout is Jibb's
218:: elements
244:: elements
219:: ' 1st there is no '…' form: strings are "…"
245:: ' 1st there is no '…' form: strings are "…"
220::
246::
221:: The parser finds the doc's other left-out forms (section 3, Errors):
247:: The parser finds the doc's other left-out forms (section 3, Errors):
248+:: =(a b), =/, *mold, ^-(…), ?-(…) and ~&(…), and Hoon's =+ =? and =.
222−:: =(a b), =/, *mold, ^-(…) and ?-(…). The lexer can't, since =( =/ and *
249+:: The lexer can't, since = and * begin valid Jibb too: open=(not
223−:: begin valid Jibb too: open=(not open.s), scry=/todos, a * mold.
250+:: open.s), scry=/todos, a * mold.
224::
251::
225:: 2.7 Paths. Right after a / or %/ glyph, a run of knot characters
252:: 2.7 Paths. Right after a / or %/ glyph, a run of knot characters
226:: [a-z0-9._~-] is one knot token, tight. So /posts/~zod is / knot / knot;
253:: [a-z0-9._~-] is one knot token, tight. So /posts/~zod is / knot / knot;
@@ -241,17 +268,38 @@
241::
268::
242:: 2.8 Literals. The lexer takes a literal's run (2.6), then reads it
269:: 2.8 Literals. The lexer takes a literal's run (2.6), then reads it
243:: with Hoon's own parser, (nuck:so [[line col] run]), whose edge says
270:: 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:
245:: - It read the whole run, as an aura Jibb takes: the token. Numbers
294:: - It read the whole run, as an aura Jibb takes: the token. Numbers
246:: take %ud, %ux and %uv: 1.000, 0x1f, 0v5.fdf99 (Hoon reads 0x1F
295:: take %ud, %ux and %uv: 1.000, 0x1f, 0v5.fdf99 (Hoon reads 0x1F
247:: too). ~ runs take %p, %da, %dr and %ta: ~zod, ~sampel-palnet,
296:: too). ~ runs take %p, %da, %dr and %ta: ~zod, ~sampel-palnet,
248−:: ~2026.10.23..14.30.00, ~h1.m30, ~.my-post.
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).
249−:: - It read the run or part of it as an aura Jibb doesn't take: 0w1,
300+:: - It read the run or part of it as another aura Jibb doesn't take:
250−:: 0i1, ~~a (a cord), ~-a (a @c). An error at 2nd, "Jibb writes no
301+:: an error at 2nd that names the aura, as "Jibb writes no @if
251−:: @uw literals". A run starting 0b, 0c, 0i or 0w gets that error
302+:: literals".
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.
255:: - It read only part of the run, as an aura Jibb takes: that part is
303:: - It read only part of the run, as an aura Jibb takes: that part is
256:: a token, then an error token at p.edge, the furthest character
304:: a token, then an error token at p.edge, the furthest character
257:: Hoon's parser looked at, where Hoon reports it too. 1000 is the
305:: Hoon's parser looked at, where Hoon reports it too. 1000 is the
@@ -267,13 +315,12 @@
267:: d h m or s, if that is later: Hoon's parser reads a syllable's
315:: d h m or s, if that is later: Hoon's parser reads a syllable's
268:: three letters before it looks them up, so it looks past that
316:: three letters before it looks them up, so it looks past that
269:: letter. `++ x ~x` fails at the x, 1:7, as no syllable starts with
317:: letter. `++ x ~x` fails at the x, 1:7, as no syllable starts with
270−:: x, and ~sampel-palnez at the z.
318+:: x, and ~sampel-palnez at the z. The error token's from is the
271−:: A run that starts as a date BC does, ~ and a year then -, fails at the
319+:: run's start, since the whole run is what fails (2.0).
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
320+:: The token is [%lit [form aura val txt]]: form names the literal rule
275−:: matched, aura and val are the dime Hoon's parser gives. Terms,
321+:: that matched, aura and val are the dime Hoon's parser gives, and txt
276−:: loobeans and the bare ~ are read by hand (2.6).
322+:: is the literal as written. Terms, loobeans and the bare ~ are read by
323+:: hand (2.6).
277::
324::
278:: 2.9 Strings. A " starts a string, which ends on the same line. Up to
325:: 2.9 Strings. A " starts a string, which ends on the same line. Up to
279:: the closing ":
326:: the closing ":
@@ -342,14 +389,15 @@
342:: descent is shorter, and each error names what its construct expected.
389:: descent is shorter, and each error names what its construct expected.
343:: An operand that isn't where an expression starts (a call's argument,
390:: An operand that isn't where an expression starts (a call's argument,
344:: an item, a pair's or unit's operand, the wide gate's body) can't be a
391:: 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:
392+:: rune, so there |= is a constructor and needs its term at once, or
346−:: (state.cart |= %got) is an error at the space after |=, 1:20. A loop
393+:: the ( of the wide gate: in ++ x (state.cart |= %got) the space after
347−:: over many items (definitions, arms, lines, items) is a trap whose
394+:: |= is an error, 1:20. A loop over many items (definitions, arms,
348−:: every step, through +then, is a tail call, so a long module grows no
395+:: lines, items) is a trap whose every step, through +then, is a tail
349−:: stack. Nesting does, by a few frames a level: 100.000 nested
396+:: call, so a long module grows no stack. Nesting does, by a few frames
350−:: parentheses parse, and so does a 20.000-line module. +golden's tree
397+:: a level: 100.000 nested parentheses parse, and so does a 20.000-line
351−:: is another matter: its indent grows with depth, so 7.000 nested
398+:: module. +golden's tree stops indenting past 64 levels (4.2), so its
352−:: parentheses print as 49 MB and 10.000 run out of memory.
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.
353::
401::
354:: The EBNF and its nodes (see the types below):
402:: The EBNF and its nodes (see the types below):
355:: module { import NEWLINE } { definition NEWLINE }, then the end
403:: module { import NEWLINE } { definition NEWLINE }, then the end
@@ -357,7 +405,9 @@
357:: "expected a definition, found `/-`; imports come first"
405:: "expected a definition, found `/-`; imports come first"
358:: import /- name -> %sur; /% term -> %mark; /= name pathlit ->
406:: import /- name -> %sur; /% term -> %mark; /= name pathlit ->
359:: %jibb. /% takes % and a name only: no mark is called %0,
407:: %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)
361:: definition +$ name mold, or the mold alone on a deeper line ->
411:: definition +$ name mold, or the mold alone on a deeper line ->
362:: %mold (both layouts give one node); ++ name expr or body
412:: %mold (both layouts give one node); ++ name expr or body
363:: -> %value (a body becomes a %body expr)
413:: -> %value (a body becomes a %body expr)
@@ -404,13 +454,15 @@
404:: - Spaces, comments and blank lines: the layout pass, and Spacing
454:: - Spaces, comments and blank lines: the layout pass, and Spacing
405:: below.
455:: below.
406:: - pathlit as an operand (above), with / alone the empty path.
456:: - pathlit as an operand (above), with / alone the empty path.
407−:: - knot may be empty: only / alone uses that, as the empty path; //
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 /
408−:: and a trailing / are errors (doc question).
459+:: are errors (doc question).
409:: - Open brackets in molds: mold has no open form, so a mold's [ or (
460:: - Open brackets in molds: mold has no open form, so a mold's [ or (
410:: closes on its line, and only $? takes lines below (doc question).
461:: closes on its line, and only $? takes lines below (doc question).
411:: - Two brackets left open on one line, as (column ~[: the last one
462:: - Two brackets left open on one line, as (column ~[: the last one
412:: takes the deeper lines, and the other is then unclosed, an error
463:: takes the deeper lines, and the other is then unclosed, an error
464+:: at the end of that line, where nothing can close it any more
413−:: (doc question).
465+:: (doc question; Errors below).
414:: - Local definitions: the EBNF takes them in every body (of ++, |=,
466:: - Local definitions: the EBNF takes them in every body (of ++, |=,
415:: ^-, ~& and arms), the Runes prose says "inside a gate"; the parser
467:: ^-, ~& and arms), the Runes prose says "inside a gate"; the parser
416:: takes them in every body and leaves the rest to the checker (doc
468:: takes them in every body and leaves the rest to the checker (doc
@@ -428,12 +480,13 @@
428:: right before a closer ) ] or } (the theme example writes `[ space=`),
480:: right before a closer ) ] or } (the theme example writes `[ space=`),
429:: the ( and ) of an application path's segment included; inside
481:: the ( and ) of an application path's segment included; inside
430:: them the expression is spaced as anywhere else, as %/x/(f a)
482:: 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
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
432−:: inside a tight form, at the space (Errors). A rune with children, and
485+:: (Errors). A rune with children, and an import glyph, is followed by
433−:: an import glyph, is followed by a space (or, for $? with its cases
486+:: a space (or, for $? with its cases below, the end of the line).
434−:: below, the end of the line). Items are separated by one or more
487+:: Items are separated by one or more spaces; how many isn't checked.
435−:: spaces; how many isn't checked. This is how the parser makes "one
488+:: This is how the parser makes "one space between items; more for
436−:: space between items; more for alignment" precise (doc question).
489+:: alignment" precise (doc question).
437::
490::
438:: Errors. The parser stops at the first token it can't accept and
491:: Errors. The parser stops at the first token it can't accept and
439:: reports "expected <what>, found <token>", with an optional "; <hint>",
492:: reports "expected <what>, found <token>", with an optional "; <hint>",
@@ -444,30 +497,78 @@
444:: the same depth" (NEWLINE), "a shallower line" (DEDENT), or "the end of
497:: the same depth" (NEWLINE), "a shallower line" (DEDENT), or "the end of
445:: the file" (an empty span, 2.5). Each error points at the first
498:: the file" (an empty span, 2.5). Each error points at the first
446:: character that can't begin a valid module (2.0):
499:: 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
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
448−:: line it begins, or just past the last token at the end of the
507+:: the start of the line it begins, or just past the last token at
449−:: file (+where). So `++ view` above `++ main view` is an error at
508+:: the end of the file (+where). So `++ view` above `++ main view`
450−:: 2:1, the line that isn't deeper.
509+:: is an error at 2:1, the line that isn't deeper.
451:: - Where a tight form needs its next token at once (after name+, `,
510:: - 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
511+:: |= in an operand, name=, the = of a pun, a / after a path
453−:: typed segment's parts) and finds a space: at the end of the
512+:: segment, a typed segment's parts) and finds a space or the end
454−:: previous token, where the space starts, "expected a term right
513+:: of the line: at the end of the previous token, where the space or
455−:: after `|=`, found a space" (+fail-space). A wing and a ( after a
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
456−:: space are no error: that is a call.
517+:: error: that is a call; nor is / or %/ alone, a whole path.
457−:: - At an error token: the lexer's position and message, unchanged.
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.
458−:: - Three pattern errors point inside their token, where it stops
547+:: - Pattern errors point inside their token, where it stops being a
459−:: being a pattern: a date, duration or knot at its second character
548+:: pattern: a date or knot at its second character (~ alone is
460−:: (~ alone is null, and no ship goes on so), ~[ at its [, and a
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
461−:: string with {…} at its {.
551+:: with {…} at its {.
462:: In a bracket, a closer that doesn't match is "expected `]` to close
552:: In a bracket, a closer that doesn't match is "expected `]` to close
463:: the `~[` at 1:6, found `)`", checked before spacing; after an item, a
553:: the `~[` at 1:6, found `)`", checked before spacing; after an item, a
464:: tight token that isn't a closer is "expected a space between items,
554:: tight token that isn't a closer is "expected a space between items,
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
465−:: found `M`". Hints name the left-out forms the lexer can't see (2.6):
559+:: name the left-out forms the lexer can't see (2.6): where an
466−:: where an expression starts, = followed tight by ( is "=(a b) is left
560+:: expression starts, = followed tight by ( is "=(a b) is left out: eq
467−:: out: eq is a gate", = followed tight by / is "=/ is left out: ++
561+:: is a gate"; = followed tight by / is "=/ is left out: ++ defines
468−:: defines values", and * is "*mold is left out: no defaults"; ^- or ?-
562+:: values", and so for Hoon's =+ =? and =.; * is "*mold is left out: no
469−:: followed tight by ( is "the wide form ^-(…) is left out: indentation
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
470−:: covers it". The messages quote that code in backticks (2.0), as in
571+:: `+$`". The messages quote that code in backticks (2.0), as in
471:: "`=(a b)` is left out: eq is a gate". Examples:
572:: "`=(a b)` is left out: eq is a gate". Examples:
472:: expected `]` or an item on a deeper line, found a line at the same
573:: expected `]` or an item on a deeper line, found a line at the same
473:: depth
574:: depth
@@ -524,7 +625,10 @@
524:: (a string's quoted text, an application path's knots). A node whose
625:: (a string's quoted text, an application path's knots). A node whose
525:: kids are all leaves prints on one line; otherwise each kid goes on its
626:: kids are all leaves prints on one line; otherwise each kid goes on its
526:: own line, indented two more spaces, and the closing parens end the
627:: 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
528:: print as their mold, and a cell sample as (cell …) of its samples, a
632:: print as their mold, and a cell sample as (cell …) of its samples, a
529:: bare name there as (bind …); unnamed items print as their expr;
633:: bare name there as (bind …); unnamed items print as their expr;
530:: strings print text pieces quoted, between their interpolated exprs;
634:: strings print text pieces quoted, between their interpolated exprs;
@@ -627,7 +731,7 @@
627 [%knot p=@ta] :: path segment
731 [%knot p=@ta] :: path segment
628 [%aura p=@ta] :: @ud as 'ud', @ as ''
732 [%aura p=@ta] :: @ud as 'ud', @ as ''
629 [%tvar p=@t] :: M
733 [%tvar p=@t] :: M
630− [%error p=tape] :: 2.0: what broke
734+ [%error p=tape from=loc c=@] :: 2.0: what broke
631 ==
735 ==
632::
736::
633:: +glyph: a token that is its text, and the layout tokens
737:: +glyph: a token that is its text, and the layout tokens
@@ -646,8 +750,10 @@
646::
750::
647:: +lit: a literal other than a string, as Hoon's parsers read it
751:: +lit: a literal other than a string, as Hoon's parsers read it
648::
752::
649−:: form is the literal rule that matched; aura and val are the dime
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
650−:: nuck:so gives, or for terms and loobeans:
756+:: the dime nuck:so gives, or for terms and loobeans:
651:: %number 1.000 0x1f 0v5.fdf99 %ud %ux %uv
757:: %number 1.000 0x1f 0v5.fdf99 %ud %ux %uv
652:: %ship ~zod %p
758:: %ship ~zod %p
653:: %date ~2026.10.23 %da
759:: %date ~2026.10.23 %da
@@ -657,7 +763,7 @@
657:: %loobean %.y %.n %f 0, %f 1
763:: %loobean %.y %.n %f 0, %f 1
658:: %null ~ %n 0
764:: %null ~ %n 0
659::
765::
660−+$ lit [form=lit-form aura=@ta val=@]
766++$ lit [form=lit-form aura=@ta val=@ txt=@t]
661+$ lit-form
767+$ lit-form
662 ?(%number %ship %date %duration %knot %term %loobean %null)
768 ?(%number %ship %date %duration %knot %term %loobean %null)
663::
769::
@@ -794,8 +900,8 @@
794::
900::
795:: +layout: source to tokens (design: section 2)
901:: +layout: source to tokens (design: section 2)
796::
902::
797−:: Never fails: an error it finds is its last token, [%error msg], at
903+:: Never fails: an error it finds is its last token, [%error msg from
798−:: the error's position (2.0). +lexer does the work.
904+:: c], at the error's position (2.0). +lexer does the work.
799::
905::
800++ layout
906++ layout
801 |= [file=path src=@t]
907 |= [file=path src=@t]
@@ -827,7 +933,7 @@
827++ parse-tokens
933++ parse-tokens
828 |= [file=path toks=(list token)]
934 |= [file=path toks=(list token)]
829 ^- (each module error)
935 ^- (each module error)
830− (~(read-module parser file) toks)
936+ (~(read-module parser file toks) toks)
831::
937::
832:: +golden: both stages printed, or the rendered error
938:: +golden: both stages printed, or the rendered error
833::
939::
@@ -962,10 +1068,23 @@
962 ::
1068 ::
963 :: +err: the error token, at column c of this line (2.0)
1069 :: +err: the error token, at column c of this line (2.0)
964 ::
1070 ::
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+ ::
965 ++ err
1077 ++ err
966 |= [c=@ud msg=tape]
1078 |= [c=@ud msg=tape]
967 ^+ cor
1079 ^+ cor
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
968− cor(out [[[[lin c] [lin c]] | [%error msg]] out])
1087+ cor(out [[[[lin c] [lin c]] =(from pend) [%error msg from first]] out])
969 ::
1088 ::
970 :: +put: a token from beg to end on this line, with rest the text
1089 :: +put: a token from beg to end on this line, with rest the text
971 :: after it, which starts at end
1090 :: after it, which starts at end
@@ -1023,10 +1142,10 @@
1023 ?: =('%' a) (percent b c)
1142 ?: =('%' a) (percent b c)
1024 ?: =('=' a)
1143 ?: =('=' a)
1025 ?: |(=('<' b) =('>' b))
1144 ?: |(=('<' b) =('>' b))
1026− %+ err col
1145+ %+ err +(col)
1027 "`={[b ~]}` is left out: names never shadow, and `.` reads imports too"
1146 "`={[b ~]}` is left out: names never shadow, and `.` reads imports too"
1028 ?: =('=' b)
1147 ?: =('=' b)
1029− (err col "the closer `==` is left out: indentation covers it")
1148+ (err +(col) "the closer `==` is left out: indentation covers it")
1030 (emit 1 %'=')
1149 (emit 1 %'=')
1031 ?: =('`' a) (emit 1 %'`')
1150 ?: =('`' a) (emit 1 %'`')
1032 ?: =('*' a) (emit 1 %'*')
1151 ?: =('*' a) (emit 1 %'*')
@@ -1035,7 +1154,7 @@
1035 ?: =('&' b) (emit 2 %'~&')
1154 ?: =('&' b) (emit 2 %'~&')
1036 ?: =('|' b) (err +(col) "`~|` is left out: `~&` covers debugging")
1155 ?: =('|' b) (err +(col) "`~|` is left out: `~&` covers debugging")
1037 =/ n=@ud (run-len t.cs knot-mask)
1156 =/ 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 '~'])
1039 (literal +(n))
1158 (literal +(n))
1040 ?: =('/' a)
1159 ?: =('/' a)
1041 ?: &(=(1 col) |(=('-' b) =('%' b) =('=' b)))
1160 ?: &(=(1 col) |(=('-' b) =('%' b) =('=' b)))
@@ -1061,7 +1180,7 @@
1061 ?: &(=('-' b) =('(' c)) (emit 3 %'$-(')
1180 ?: &(=('-' b) =('(' c)) (emit 3 %'$-(')
1062 ?: =('-' b)
1181 ?: =('-' b)
1063 (err (add 2 col) "`$-` has only the wide form `$-(sample product)`")
1182 (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")
1065 ?: =('%' b) (err +(col) "`$%` is left out: `$?` covers unions")
1184 ?: =('%' b) (err +(col) "`$%` is left out: `$?` covers unions")
1066 (err +(col) "`$` begins `$?`, `$?(` or `$-(`")
1185 (err +(col) "`$` begins `$?`, `$?(` or `$-(`")
1067 ?: =('^' a)
1186 ?: =('^' a)
@@ -1069,10 +1188,12 @@
1069 (err +(col) "`^` begins `^-`")
1188 (err +(col) "`^` begins `^-`")
1070 ?: =('?' a)
1189 ?: =('?' a)
1071 ?: =('-' b) (emit 2 %'?-')
1190 ?: =('-' b) (emit 2 %'?-')
1072− ?: =('+' b) (err +(col) "`?+` is left out: `?-` is the branch")
1073 ?: &(=(':' b) !=(':' c))
1191 ?: &(=(':' b) !=(':' c))
1074 (err +(col) "`?:` is left out: `?-` is the branch")
1192 (err +(col) "`?:` is left out: `?-` is the branch")
1075 ?: =('!' b) (err +(col) "`?!` is left out: eq and not are gates")
1193 ?: =('!' 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")
1076 (emit 1 %'?')
1197 (emit 1 %'?')
1077 ?: =('!' a)
1198 ?: =('!' a)
1078 ?: =('!' b) (emit 2 %'!!')
1199 ?: =('!' b) (emit 2 %'!!')
@@ -1098,6 +1219,9 @@
1098 (err +(col) "`:~` is left out: indentation covers it; write ~[…]")
1219 (err +(col) "`:~` is left out: indentation covers it; write ~[…]")
1099 ?: =('*' b)
1220 ?: =('*' b)
1100 (err +(col) "`:*` is left out: indentation covers it; write […]")
1221 (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]"
1101 ?: &(=(pend [lin col]) ?=([[* * ?([%name *] [%wing *])] *] out))
1225 ?: &(=(pend [lin col]) ?=([[* * ?([%name *] [%wing *])] *] out))
1102 %+ err +(col)
1226 %+ err +(col)
1103 %+ weld "`a:b` is left out: names never shadow, "
1227 %+ weld "`a:b` is left out: names never shadow, "
@@ -1114,6 +1238,8 @@
1114 (err col "the closer `--` is left out: indentation covers it")
1238 (err col "the closer `--` is left out: indentation covers it")
1115 (err col (unexpected a))
1239 (err col (unexpected a))
1116 ?: =(';' a)
1240 ?: =(';' a)
1241+ ?: =(':' b)
1242+ (err col "`;:` is left out: nest the calls, as (add a (add b c))")
1117 (err col "Sail's `;` runes are left out: layout is Jibb's elements")
1243 (err col "Sail's `;` runes are left out: layout is Jibb's elements")
1118 ?: =('\'' a) (err col "there is no '…' form: strings are \"…\"")
1244 ?: =('\'' a) (err col "there is no '…' form: strings are \"…\"")
1119 ?: =('{' a)
1245 ?: =('{' a)
@@ -1146,24 +1272,28 @@
1146 ^+ cor
1272 ^+ cor
1147 ?: =('/' b) segment:(emit 2 %'%/')
1273 ?: =('/' b) segment:(emit 2 %'%/')
1148 ?: =('.' b)
1274 ?: =('.' b)
1149− ?: =('y' c) (emit 3 [%lit %loobean %f 0])
1275+ ?: =('y' c) (emit 3 [%lit %loobean %f 0 '%.y'])
1150− ?: =('n' c) (emit 3 [%lit %loobean %f 1])
1276+ ?: =('n' c) (emit 3 [%lit %loobean %f 1 '%.n'])
1151 (err (add 2 col) "the loobeans are `%.y` and `%.n`")
1277 (err (add 2 col) "the loobeans are `%.y` and `%.n`")
1152− ?: =('&' b) (emit 2 [%lit %term %f 0])
1278+ ?: =('&' b) (emit 2 [%lit %term %f 0 '%&'])
1153− ?: =('|' b) (emit 2 [%lit %term %f 1])
1279+ ?: =('|' b) (emit 2 [%lit %term %f 1 '%|'])
1280+ ?: |(=(':' b) =('-' b) =('+' b) =('^' b) =('~' b))
1281+ %+ err +(col)
1154− ?: =(':' b) (err +(col) "`%:` is left out: indentation covers it")
1282+ "`%{[b ~]}` is left out: indentation covers it; a call is (f a b)"
1155 ?: =('=' b)
1283 ?: =('=' b)
1156 %+ err +(col)
1284 %+ err +(col)
1157 "`%=` is left out: indentation covers it; write a change, as m(a=b)"
1285 "`%=` is left out: indentation covers it; write a change, as m(a=b)"
1158 =/ rest=tape ?~(cs ~ t.cs)
1286 =/ rest=tape ?~(cs ~ t.cs)
1159 ?: (is-lower b)
1287 ?: (is-lower b)
1160 =/ n=@ud (run-len rest name-mask)
1288 =/ n=@ud (run-len rest name-mask)
1289+ =/ nam=tape (scag n rest)
1161− => (emit +(n) [%lit %term %tas (crip (scag n rest))])
1290+ => (emit +(n) [%lit %term %tas (crip nam) (crip ['%' nam])])
1162 ?. &(?=(^ cs) |((is-upper i.cs) =('_' i.cs))) cor
1291 ?. &(?=(^ cs) |((is-upper i.cs) =('_' i.cs))) cor
1163 (err col "names are lowercase letters, digits and -")
1292 (err col "names are lowercase letters, digits and -")
1164 ?: (is-digit b)
1293 ?: (is-digit b)
1165 =/ n=@ud (run-len rest digit-mask)
1294 =/ n=@ud (run-len rest digit-mask)
1295+ =/ dig=tape (scag n rest)
1166− => (emit +(n) [%lit %term %ud (decimal (scag n rest))])
1296+ => (emit +(n) [%lit %term %ud (decimal dig) (crip ['%' dig])])
1167 ?. &(?=(^ cs) (in i.cs term-tail-mask)) cor
1297 ?. &(?=(^ cs) (in i.cs term-tail-mask)) cor
1168 %+ err col
1298 %+ err col
1169 "unexpected `{[i.cs ~]}`: a numeric term is `%` and digits only, as %1000"
1299 "unexpected `{[i.cs ~]}`: a numeric term is `%` and digits only, as %1000"
@@ -1217,9 +1347,20 @@
1217 =/ run=tape (scag n cs)
1347 =/ run=tape (scag n cs)
1218 =/ a=@ ?~(run 0 i.run)
1348 =/ a=@ ?~(run 0 i.run)
1219 =/ b=@ ?~(run 0 ?~(t.run 0 i.t.run))
1349 =/ 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
1221 ?: &(=('0' a) |(=('b' b) =('c' b) =('i' b) =('w' b)))
1352 ?: &(=('0' a) |(=('b' b) =('c' b) =('i' b) =('w' b)))
1222 (err +(col) "Jibb writes no @u{[b ~]} literals")
1353 (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")
1223 :: a year BC that Hoon's dates can't hold, which its date code
1364 :: a year BC that Hoon's dates can't hold, which its date code
1224 :: crashes on: an error at the - that makes it BC
1365 :: crashes on: an error at the - that makes it BC
1225 =/ bc=(unit [at=@ud y=@ud]) (year-bc col run)
1366 =/ bc=(unit [at=@ud y=@ud]) (year-bc col run)
@@ -1227,7 +1368,18 @@
1227 (err at.u.bc "there is no year 0 BC: 1 BC is ~1-, as ~1-.1.1")
1368 (err at.u.bc "there is no year 0 BC: 1 BC is ~1-, as ~1-.1.1")
1228 ?: &(?=(^ bc) (gth y.u.bc 292.277.024.401))
1369 ?: &(?=(^ bc) (gth y.u.bc 292.277.024.401))
1229 (err at.u.bc "Hoon's dates begin in 292.277.024.401 BC")
1370 (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
1231 ?~ q.ed (err q.p.ed (literal-msg run %$))
1383 ?~ q.ed (err q.p.ed (literal-msg run %$))
1232 =/ used=@ud (sub n (lent q.q.u.q.ed))
1384 =/ used=@ud (sub n (lent q.q.u.q.ed))
1233 =/ con=coin p.u.q.ed
1385 =/ con=coin p.u.q.ed
@@ -1238,7 +1390,7 @@
1238 %+ err +(col)
1390 %+ err +(col)
1239 %+ weld "Jibb writes no @{(trip p.p.con)} literals"
1391 %+ weld "Jibb writes no @{(trip p.p.con)} literals"
1240 ?:(=(%t p.p.con) "; strings are \"…\"" "")
1392 ?:(=(%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))]
1242 ?: =(used n)
1394 ?: =(used n)
1243 ?. =(%ta p.p.con) (emit n lex)
1395 ?. =(%ta p.p.con) (emit n lex)
1244 :: a ~. knot is followed as a path segment is (2.7)
1396 :: a ~. knot is followed as a path segment is (2.7)
@@ -1255,7 +1407,9 @@
1255 =? at &(=('~' a) (is-lower b) ?=(?(%n %p) p.p.con))
1407 =? at &(=('~' a) (is-lower b) ?=(?(%n %p) p.p.con))
1256 =/ dur=@ud ?:(|(=('d' b) =('h' b) =('m' b) =('s' b)) 2 1)
1408 =/ dur=@ud ?:(|(=('d' b) =('h' b) =('m' b) =('s' b)) 2 1)
1257 (min at (add col (max dur (ship-stop run))))
1409 (min at (add col (max dur (ship-stop run))))
1410+ :: the text that fails is the whole run, from its start, though its
1411+ :: first part is a token
1258− (err:(emit used lex) at (literal-msg run p.p.con))
1412+ (err-from:(emit used lex) at (literal-msg run p.p.con) [lin col] a)
1259 ::
1413 ::
1260 :: +text: a string's text, from its opening " or the } that closes
1414 :: +text: a string's text, from its opening " or the } that closes
1261 :: an interpolation, through the " or { that ends it (2.9). mid: it
1415 :: an interpolation, through the " or { that ends it (2.9). mid: it
@@ -1336,6 +1490,31 @@
1336++ seg-bad-mask 0x1800.0001.57ff.ffff.f800.1cfe.0000.0000
1490++ seg-bad-mask 0x1800.0001.57ff.ffff.f800.1cfe.0000.0000
1337:: after a numeric term: a-z A-Z _ - .
1491:: after a numeric term: a-z A-Z _ - .
1338++ term-tail-mask 0x7ff.fffe.87ff.fffe.0000.6000.0000.0000
1492++ 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 :: ]
1339::
1518::
1340:: +cont-mask: UTF-8 continuation bytes, 10xx.xxxx, which start no
1519:: +cont-mask: UTF-8 continuation bytes, 10xx.xxxx, which start no
1341:: column (1)
1520:: column (1)
@@ -1437,6 +1616,62 @@
1437 ?. ?=([%'-' *] rest) ~
1616 ?. ?=([%'-' *] rest) ~
1438 `[(add col +((lent ds))) (decimal ds)]
1617 `[(add col +((lent ds))) (decimal ds)]
1439::
1618::
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+::
1440:: +ship-stop: how many characters of a ~ literal's run, from its ~,
1675:: +ship-stop: how many characters of a ~ literal's run, from its ~,
1441:: could still begin a ship (2.8)
1676:: could still begin a ship (2.8)
1442::
1677::
@@ -1554,11 +1789,8 @@
1554 ^- @t
1789 ^- @t
1555 =/ kids=(list sexp)
1790 =/ kids=(list sexp)
1556 (weld (turn imports.mod sexp-import) (turn defs.mod sexp-def))
1791 (weld (turn imports.mod sexp-import) (turn defs.mod sexp-def))
1557− =/ lines=wall
1558− ?~ kids ~["(module)"]
1792+ ?~ kids '(module)'
1559− :- "(module"
1560− (close (zing (turn kids |=(k=sexp (render 2 k)))))
1561− (of-wain:format (turn lines crip))
1793+ (of-wain:format (turn (render kids) crip))
1562::
1794::
1563:: +show-error: "<file>:<line>:<col>: <message>", the line, a caret
1795:: +show-error: "<file>:<line>:<col>: <message>", the line, a caret
1564::
1796::
@@ -1654,17 +1886,15 @@
1654 ?~ t.ns (trip i.ns)
1886 ?~ t.ns (trip i.ns)
1655 "{(trip i.ns)}.{$(ns t.ns)}"
1887 "{(trip i.ns)}.{$(ns t.ns)}"
1656::
1888::
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
1658::
1892::
1659++ show-lit
1893++ show-lit
1660 |= l=lit
1894 |= l=lit
1661 ^- tape
1895 ^- tape
1662 ?- form.l
1896 ?- form.l
1663− %number (scow aura.l val.l)
1897+ ?(%number %ship %date %duration %knot) (trip txt.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)
1668 %loobean ?:(=(0 val.l) "%.y" "%.n")
1898 %loobean ?:(=(0 val.l) "%.y" "%.n")
1669 %null "~"
1899 %null "~"
1670 %term
1900 %term
@@ -1726,20 +1956,57 @@
1726 [%node head=tape kids=(list sexp)]
1956 [%node head=tape kids=(list sexp)]
1727 ==
1957 ==
1728::
1958::
1729−:: +render: a node as lines, at an indent
1959+:: +render: a module's kids as the tree's lines (4.2)
1730::
1960::
1731−:: On one line when every kid is a leaf: an atom, or a node whose kids
1961+:: A node whose kids are all leaves goes on one line; else its head,
1732−:: are all atoms (a string's text, a path's knots). Else each kid on
1962+:: then each kid a level deeper, and its ) at the end of its last
1733−:: its own lines, two spaces deeper.
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.
1734::
1967::
1735++ render
1968++ render
1736− |= [ind=@ud s=sexp]
1969+ |= kids=(list sexp)
1737 ^- wall
1970 ^- wall
1738− =/ pad=tape (reap ind ' ')
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)
1739− ?: ?=(%atom -.s) ~[(weld pad p.s)]
1987+ ?: ?=(%atom -.s) [[dep p.s 0] acc]
1740− ?: (levy kids.s is-leaf) ~[(weld pad (flat s))]
1988+ ?: (levy kids.s is-leaf) [[dep (flat s) 0] acc]
1989+ =/ ks=(list sexp) kids.s
1741− :- "{pad}({head.s}"
1990+ =. acc [[dep "({head.s}" 0] acc]
1742− (close (zing (turn kids.s |=(k=sexp (render (add ind 2) k)))))
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 ')'))
1743::
2010::
1744++ is-leaf
2011++ is-leaf
1745 |= s=sexp
2012 |= s=sexp
@@ -1753,15 +2020,6 @@
1753 ?: ?=(%atom -.s) p.s
2020 ?: ?=(%atom -.s) p.s
1754 "({head.s}{(zing (turn kids.s |=(k=sexp (weld " " (flat k)))))})"
2021 "({head.s}{(zing (turn kids.s |=(k=sexp (weld " " (flat k)))))})"
1755::
2022::
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−::
1765:: +nod: a node's sexp: "kind line:col extra" and its kids
2023:: +nod: a node's sexp: "kind line:col extra" and its kids
1766::
2024::
1767++ nod
2025++ nod
@@ -1927,49 +2185,195 @@
1927::
2185::
1928:: +fail: the error "expected <want>, found <the next token>"
2186:: +fail: the error "expected <want>, found <the next token>"
1929::
2187::
1930−:: At an error token, the layout pass's error instead (2.0). The token
2188+:: At the layout pass's error instead (+lexer-error). The token list
1931−:: list always ends with NEWLINE or an error token (2.5), and the
2189+:: always ends with NEWLINE or an error token (2.5), and the parser
1932−:: parser stops at either, so it never runs out; if it did, the error
2190+:: stops at either, so it never runs out; if it did, the error would
1933−:: would sit at 1:1.
2191+:: sit at 1:1.
1934::
2192::
1935++ fail
2193++ fail
1936 |= [file=path toks=(list token) want=tape]
2194 |= [file=path toks=(list token) want=tape]
1937 ^- [%| p=error]
2195 ^- [%| p=error]
1938 ?~ toks [%| file 1 1 "expected {want}, found the end of the tokens"]
2196 ?~ toks [%| file 1 1 "expected {want}, found the end of the tokens"]
1939− ?: ?=([%error *] lex.i.toks)
2197+ =/ lex=(unit error) (lexer-error file toks)
1940− [%| file line.beg.at.i.toks col.beg.at.i.toks p.lex.i.toks]
2198+ ?^ lex [%| u.lex]
1941 =/ l=loc (where i.toks)
2199 =/ l=loc (where i.toks)
1942 [%| file line.l col.l "expected {want}, found {(show-found i.toks)}"]
2200 [%| file line.l col.l "expected {want}, found {(show-found i.toks)}"]
1943::
2201::
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
1945::
2203::
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+::
1946−:: The error sits where the space starts, just past prev, the token
2295+:: The error sits just past prev, the token that needs its next one
1947−:: that needs its next one at once (section 3, Errors). If the next
2296+:: at once, where the space or the end of the line starts (section 3,
1948−:: token is a layout or error token, it is +fail's error instead.
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.
1949::
2301::
1950++ fail-space
2302++ fail-space
1951− |= [file=path prev=token toks=(list token) want=tape]
2303+ |= [file=path prev=token toks=(list token) want=tape why=tape]
1952 ^- [%| p=error]
2304 ^- [%| p=error]
1953− ?: ?| ?=(~ toks)
2305+ =/ at=loc end.at.prev
1954− ?=(?(%indent %dedent %newline) lex.i.toks)
1955− ?=([%error *] lex.i.toks)
2306+ ?: &(?=(^ toks) ?=([%error *] lex.i.toks) =(at from.lex.i.toks))
1956− ==
1957 (fail file toks want)
2307 (fail file toks want)
1958− :+ %| file
2308+ =/ found=tape
1959− :+ line.end.at.prev col.end.at.prev
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
1960− "expected {want} right after {(show-found prev)}, found a space"
2317+ "expected {want} right after {(show-found prev)}, found {found}"
2318+ [%| file line.at col.at ?~(why msg "{msg}; {why}")]
1961::
2319::
1962:: +fail-why: +fail with a hint after its message, "; <why>"
2320:: +fail-why: +fail with a hint after its message, "; <why>"
1963::
2321::
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).
1965::
2323::
1966++ fail-why
2324++ fail-why
1967 |= [file=path toks=(list token) want=tape why=tape]
2325 |= [file=path toks=(list token) want=tape why=tape]
1968 ^- [%| p=error]
2326 ^- [%| p=error]
1969 =/ e=[%| p=error] (fail file toks want)
2327 =/ 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)
1970 ?: &(?=(^ toks) ?=([%error *] lex.i.toks)) e
2337 ?: &(?=(^ toks) ?=([%error *] lex.i.toks)) e
2338+ ?^ (lexer-error file toks) e
1971 e(msg.p (weld msg.p.e "; {why}"))
2339 e(msg.p (weld msg.p.e "; {why}"))
1972::
2340::
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+::
1973:: Token tests for the parser
2377:: Token tests for the parser
1974::
2378::
1975:: +is-layout: INDENT, DEDENT or NEWLINE
2379:: +is-layout: INDENT, DEDENT or NEWLINE
@@ -2001,6 +2405,28 @@
2001 ?=([%error *] lex.t)
2405 ?=([%error *] lex.t)
2002 ==
2406 ==
2003::
2407::
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+::
2004:: +is-operand-start: a token an operand starts with; where an operand
2430:: +is-operand-start: a token an operand starts with; where an operand
2005:: goes, |= is the constructor's (section 3)
2431:: goes, |= is the constructor's (section 3)
2006::
2432::
@@ -2093,10 +2519,11 @@
2093:: (section 3), so it never backtracks. A loop over items is a trap
2519:: (section 3), so it never backtracks. A loop over items is a trap
2094:: whose every step, through +then, is a tail call, so a long module
2520:: whose every step, through +then, is a tail call, so a long module
2095:: grows no stack; only nesting does, and a line's nesting is bounded
2521:: 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).
2097::
2524::
2098++ parser
2525++ parser
2099− |_ file=path
2526+ |_ [file=path all=(list token)]
2100 ::
2527 ::
2101 :: +bad: "expected <want>, found <the next token>" (+fail)
2528 :: +bad: "expected <want>, found <the next token>" (+fail)
2102 ::
2529 ::
@@ -2112,82 +2539,161 @@
2112 ^- [%| p=error]
2539 ^- [%| p=error]
2113 (fail-why file ts want why)
2540 (fail-why file ts want why)
2114 ::
2541 ::
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+ ::
2115− :: +bad-space: a tight form that found a space after prev
2557+ :: +bad-space: a tight form that found no next token right after prev
2116 :: (+fail-space)
2558 :: (+fail-space)
2117 ::
2559 ::
2118 ++ bad-space
2560 ++ bad-space
2119 |= [prev=token ts=(list token) want=tape]
2561 |= [prev=token ts=(list token) want=tape]
2120 ^- [%| p=error]
2562 ^- [%| p=error]
2121− (fail-space file prev ts want)
2563+ (fail-space file prev ts want "")
2122 ::
2564 ::
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
2124 ::
2566 ::
2125 ++ bad-at
2567 ++ bad-at
2126 |= [at=loc msg=tape]
2568 |= [at=loc msg=tape]
2127 ^- [%| p=error]
2569 ^- [%| p=error]
2128 [%| file line.at col.at msg]
2570 [%| file line.at col.at msg]
2129 ::
2571 ::
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+ ::
2130− :: +bad-end: a line that should end and goes on
2579+ :: +bad-end: a line that should end and goes on, after a call
2131 ::
2580 ::
2132 ++ bad-end
2581 ++ bad-end
2133 |= ts=(list token)
2582 |= ts=(list token)
2134 ^- [%| p=error]
2583 ^- [%| p=error]
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"
2135− ?. ?=([[* * %indent] *] ts) (bad ts "the end of the line")
2595+ ?: ?=([[* * %indent] *] ts)
2136− %^ bad-why ts "the end of the line"
2596+ %^ bad-why ts want
2137− %+ weld "only a bracket open at the end of a line, "
2597+ %+ weld "only a bracket open at the end of a line, "
2138− "or a rune's body, takes deeper lines"
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)]
2139 ::
2615 ::
2140 :: +no-space: a token tight after an item, where a space goes
2616 :: +no-space: a token tight after an item, where a space goes
2141 ::
2617 ::
2142 ++ no-space
2618 ++ no-space
2143 |= ts=(list token)
2619 |= ts=(list token)
2144 ^- [%| p=error]
2620 ^- [%| p=error]
2621+ =/ te=(unit error) (tight-error file ts)
2622+ ?^ te [%| u.te]
2145 ?. ?=([[* * %'='] *] ts) (bad ts "a space between items")
2623 ?. ?=([[* * %'='] *] ts) (bad ts "a space between items")
2146 %^ bad-why ts "a space between items"
2624 %^ bad-why ts "a space between items"
2147 "`name=value` goes in a cell, as [a=1], or a change, as m(a=1)"
2625 "`name=value` goes in a cell, as [a=1], or a change, as m(a=1)"
2148 ::
2626 ::
2149− :: +no-operand: a token where an operand goes that starts none, with
2627+ :: +no-space-pattern: +no-space in a cell pattern
2150− :: a hint for the left-out forms the lexer can't see (2.6)
2151 ::
2628 ::
2152− ++ no-operand
2629+ ++ no-space-pattern
2153 |= ts=(list token)
2630 |= ts=(list token)
2154 ^- [%| p=error]
2631 ^- [%| 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]
2155 =/ want=tape "an expression"
2643 =/ want=tape "an expression"
2156 ?: ?=([[* * %'='] [* %& %'('] *] ts)
2644 ?: ?=([[* * %'='] [* %& %'('] *] ts)
2157 (bad-why ts want "`=(a b)` is left out: eq is a gate")
2645 (bad-why ts want "`=(a b)` is left out: eq is a gate")
2158 ?: ?=([[* * %'='] [* %& %'/'] *] ts)
2646 ?: ?=([[* * %'='] [* %& %'/'] *] ts)
2159 (bad-why ts want "`=/` is left out: `++` defines values")
2647 (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")
2160 ?: ?=([[* * %'*'] *] ts)
2656 ?: ?=([[* * %'*'] *] ts)
2161 (bad-why ts want "`*mold` is left out: no defaults")
2657 (bad-why ts want "`*mold` is left out: no defaults")
2162 ?: ?=([[* * %'+'] *] ts)
2658 ?: ?=([[* * %'+'] *] ts)
2163 (bad-why ts want "a pair takes no spaces, as gap+%s2")
2659 (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+ ==
2164 ?: &(?=(^ ts) (is-rune i.ts))
2664 ?: &(?=(^ ts) (is-rune i.ts))
2165− (bad-why ts want "a rune here goes in parentheses")
2665+ (bad-in-why ts want can "a rune here goes in parentheses")
2166− (bad ts want)
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)
2167 ::
2680 ::
2168 :: +unclosed: where the closer of the bracket op opened should be
2681 :: +unclosed: where the closer of the bracket op opened should be
2169 ::
2682 ::
2170 ++ unclosed
2683 ++ unclosed
2171 |= [op=token close=tape ts=(list token)]
2684 |= [op=token close=tape ts=(list token)]
2172 ^- [%| p=error]
2685 ^- [%| p=error]
2173− =/ want=tape
2686+ =/ want=tape (closing op close)
2174− "`{close}` to close the {(show-found op)} at {(show-loc beg.at.op)}"
2175 ?. ?=([[* * %indent] *] ts) (bad ts want)
2687 ?. ?=([[* * %indent] *] ts) (bad ts want)
2176 (bad-why ts want "this bracket closes on its line")
2688 (bad-why ts want "this bracket closes on its line")
2177 ::
2689 ::
2178 :: +unclosed-open: a bracket that may be left open, whose line ends
2690 :: +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
2691+ :: with neither its closer nor deeper lines; noun names its items
2180− :: span, and noun names its items
2181 ::
2692 ::
2182 ++ unclosed-open
2693 ++ 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)]
2184 ^- [%| p=error]
2695 ^- [%| p=error]
2185 ?. ?=([[* * ?(%newline %dedent)] *] ts) (unclosed op close ts)
2696 ?. ?=([[* * ?(%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"
2191 (bad ts "`{close}` or {noun} on a deeper line")
2697 (bad ts "`{close}` or {noun} on a deeper line")
2192 ::
2698 ::
2193 :: +wide-rune: a rune followed tight; txt( is a left-out wide form
2699 :: +wide-rune: a rune followed tight; txt( is a left-out wide form
@@ -2196,7 +2702,7 @@
2196 |= [txt=tape ts=(list token)]
2702 |= [txt=tape ts=(list token)]
2197 ^- [%| p=error]
2703 ^- [%| p=error]
2198 =/ want=tape "a space after `{txt}`"
2704 =/ want=tape "a space after `{txt}`"
2199− ?. ?=([[* * %'('] *] ts) (bad ts want)
2705+ ?. ?=([[* * %'('] *] ts) (no-gap ts want)
2200 %^ bad-why ts want
2706 %^ bad-why ts want
2201 "the wide form `{txt}(…)` is left out: indentation covers it"
2707 "the wide form `{txt}(…)` is left out: indentation covers it"
2202 ::
2708 ::
@@ -2208,6 +2714,62 @@
2208 %^ bad-why ts "a named item"
2714 %^ bad-why ts "a named item"
2209 "a change's items are named, as in m(done=%.y)"
2715 "a change's items are named, as in m(done=%.y)"
2210 ::
2716 ::
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+ ::
2211 :: +read-module: { import NEWLINE } { definition NEWLINE }, then the
2773 :: +read-module: { import NEWLINE } { definition NEWLINE }, then the
2212 :: end of the tokens
2774 :: end of the tokens
2213 ::
2775 ::
@@ -2218,15 +2780,17 @@
2218 |- ^- (each module error)
2780 |- ^- (each module error)
2219 ?: ?=([[* * ?(%'/-' %'/%' %'/=')] *] ts)
2781 ?: ?=([[* * ?(%'/-' %'/%' %'/=')] *] ts)
2220 ;< [im=import after=(list token)] then (read-import ts)
2782 ;< [im=import after=(list token)] then (read-import ts)
2221− ?. ?=([[* * %newline] *] after) (bad-end after)
2783+ ?. ?=([[* * %newline] *] after) (bad-end-in after 0)
2222 $(ims [im ims], ts t.after)
2784 $(ims [im ims], ts t.after)
2223 =| defs=(list def)
2785 =| defs=(list def)
2224 |- ^- (each module error)
2786 |- ^- (each module error)
2225 ?~ ts [%& (flop ims) (flop defs)]
2787 ?~ ts [%& (flop ims) (flop defs)]
2226 ?: ?=([[* * ?(%'/-' %'/%' %'/=')] *] ts)
2788 ?: ?=([[* * ?(%'/-' %'/%' %'/=')] *] ts)
2227 (bad-why ts "a definition" "imports come first")
2789 (bad-why ts "a definition" "imports come first")
2790+ :: what may begin the line: a definition, or before any, an import
2791+ =/ can=@ ?~(defs (con plus-mask fas-mask) plus-mask)
2228− ;< [d=def after=(list token)] then (read-def ts)
2792+ ;< [d=def after=(list token)] then (read-def ts can)
2229− ?. ?=([[* * %newline] *] after) (bad-end after)
2793+ ?. ?=([[* * %newline] *] after) (bad-end-in after (def-can d))
2230 $(defs [d defs], ts t.after)
2794 $(defs [d defs], ts t.after)
2231 ::
2795 ::
2232 :: +read-import: /- name, /% term, or /= name pathlit
2796 :: +read-import: /- name, /% term, or /= name pathlit
@@ -2238,34 +2802,36 @@
2238 =* g i.ts
2802 =* g i.ts
2239 =/ rest=(list token) t.ts
2803 =/ rest=(list token) t.ts
2240 ?: &(?=(^ rest) tight.i.rest)
2804 ?: &(?=(^ rest) tight.i.rest)
2241− (bad rest "a space after {(show-found g)}")
2805+ (no-gap rest "a space after {(show-found g)}")
2242 ?: =(%'/%' lex.g)
2806 ?: =(%'/%' lex.g)
2243 ?: ?=([[* * [%lit %term %tas *]] *] rest)
2807 ?: ?=([[* * [%lit %term %tas *]] *] rest)
2244 [%& [%mark [beg.at.g end.at.i.rest] val.p.lex.i.rest] t.rest]
2808 [%& [%mark [beg.at.g end.at.i.rest] val.p.lex.i.rest] t.rest]
2245 =/ want=tape "a mark's term, as `%todo-action`"
2809 =/ want=tape "a mark's term, as `%todo-action`"
2246− ?. ?=([[* * [%name *]] *] rest) (bad rest want)
2810+ ?. ?=([[* * [%name *]] *] rest) (bad-in rest want cen-mask)
2247 (bad-why rest want "`/%` takes no face: it names the type after its mark")
2811 (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)
2249 =* nam i.rest
2813 =* nam i.rest
2250 ?. =(%'/=' lex.g)
2814 ?. =(%'/=' lex.g)
2251 [%& [%sur [beg.at.g end.at.nam] p.lex.nam] t.rest]
2815 [%& [%sur [beg.at.g end.at.nam] p.lex.nam] t.rest]
2252 =/ more=(list token) t.rest
2816 =/ 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")
2254 ?. ?=([[* * %'/'] *] more)
2818 ?. ?=([[* * %'/'] *] 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)
2256 ;< [[sp=span segs=(list @ta)] after=(list token)] then
2820 ;< [[sp=span segs=(list @ta)] after=(list token)] then
2257− (read-pathlit i.more t.more)
2821+ (read-pathlit i.more t.more |)
2258 [%& [%jibb [beg.at.g end.sp] p.lex.nam segs] after]
2822 [%& [%jibb [beg.at.g end.sp] p.lex.nam segs] after]
2259 ::
2823 ::
2260 :: +read-pathlit: after a path's /, its knots, each after a tight /
2824 :: +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)
2262 ::
2827 ::
2263 ++ read-pathlit
2828 ++ read-pathlit
2264− |= [sl=token ts=(list token)]
2829+ |= [sl=token ts=(list token) empty=?]
2265 ^- (pare [span (list @ta)])
2830 ^- (pare [span (list @ta)])
2266 ?. ?=([[* %& [%knot *]] *] ts)
2831 ?. ?=([[* %& [%knot *]] *] ts)
2267 ?: &(?=(^ ts) tight.i.ts !(is-closer i.ts))
2832 ?: &(?=(^ ts) tight.i.ts !(is-closer i.ts))
2268 (bad ts "a path segment")
2833 (bad ts "a path segment")
2834+ ?. empty (bad-space sl ts "a path segment")
2269 [%& [at.sl ~] ts]
2835 [%& [at.sl ~] ts]
2270 =/ segs=(list @ta) ~[p.lex.i.ts]
2836 =/ segs=(list @ta) ~[p.lex.i.ts]
2271 =/ fin=loc end.at.i.ts
2837 =/ fin=loc end.at.i.ts
@@ -2280,10 +2846,11 @@
2280 (bad-space i.rest nex "a path segment")
2846 (bad-space i.rest nex "a path segment")
2281 ::
2847 ::
2282 :: +read-def: ++ name, then an expression or a body; +$ name, then a
2848 :: +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).
2284 ::
2851 ::
2285 ++ read-def
2852 ++ read-def
2286− |= ts=(list token)
2853+ |= [ts=(list token) can=@]
2287 ^- (pare def)
2854 ^- (pare def)
2288 ?~ ts (bad ts "a definition")
2855 ?~ ts (bad ts "a definition")
2289 =* rune i.ts
2856 =* rune i.ts
@@ -2295,18 +2862,23 @@
2295 ?: (is-closer rune)
2862 ?: (is-closer rune)
2296 %^ bad-why ts "a definition"
2863 %^ bad-why ts "a definition"
2297 "this closes no bracket, as one open at the end of its line needs none"
2864 "this closes no bracket, as one open at the end of its line needs none"
2865+ =/ want=tape
2866+ ?.((in '/' can) "a definition" "an import or a definition")
2298− ?. =(%'+$' lex.rune) (bad ts "a definition")
2867+ ?: =(%'+' lex.rune)
2868+ (bad-in-why ts want can "`+` begins `++` or `+$`")
2869+ ?. =(%'+$' lex.rune) (bad-in ts want can)
2299 ;< [nam=term after=(list token)] then (read-def-name rune t.ts)
2870 ;< [nam=term after=(list token)] then (read-def-name rune t.ts)
2300 ?: ?=([[* * %indent] *] after)
2871 ?: ?=([[* * %indent] *] after)
2301 ;< [s=shape more=(list token)] then (read-mold t.after)
2872 ;< [s=shape more=(list token)] then (read-mold t.after)
2302 ?: ?=([[* * %dedent] *] more)
2873 ?: ?=([[* * %dedent] *] more)
2303 [%& [%mold [beg.at.rune end:(span-of s)] nam s] t.more]
2874 [%& [%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)
2305 %^ bad-why more "the end of the mold"
2876 %^ bad-why more "the end of the mold"
2306 "a `+$` takes one mold; a union is `$?` with its cases below"
2877 "a `+$` takes one mold; a union is `$?` with its cases below"
2307 ?: ?=([[* * ?(%newline %dedent)] *] after)
2878 ?: ?=([[* * ?(%newline %dedent)] *] after)
2308 (bad after "a mold, on its line or a deeper one")
2879 (bad after "a mold, on its line or a deeper one")
2880+ ?: &(?=(^ after) tight.i.after)
2309− ?: &(?=(^ after) tight.i.after) (bad after "a space after the name")
2881+ (no-gap after "a space after the name")
2310 ;< [s=shape more=(list token)] then (read-mold after)
2882 ;< [s=shape more=(list token)] then (read-mold after)
2311 [%& [%mold [beg.at.rune end:(span-of s)] nam s] more]
2883 [%& [%mold [beg.at.rune end:(span-of s)] nam s] more]
2312 ::
2884 ::
@@ -2316,8 +2888,8 @@
2316 |= [rune=token ts=(list token)]
2888 |= [rune=token ts=(list token)]
2317 ^- (pare term)
2889 ^- (pare term)
2318 ?: &(?=(^ ts) tight.i.ts)
2890 ?: &(?=(^ ts) tight.i.ts)
2319− (bad ts "a space after {(show-found rune)}")
2891+ (no-gap ts "a space after {(show-found rune)}")
2320− ?. ?=([[* * [%name *]] *] ts) (bad ts "a name")
2892+ ?. ?=([[* * [%name *]] *] ts) (no-name ts)
2321 [%& p.lex.i.ts t.ts]
2893 [%& p.lex.i.ts t.ts]
2322 ::
2894 ::
2323 :: +read-expr-or-body: a space and an expression on the line, or a
2895 :: +read-expr-or-body: a space and an expression on the line, or a
@@ -2329,7 +2901,7 @@
2329 ?: ?=([[* * %indent] *] ts) (read-body t.ts)
2901 ?: ?=([[* * %indent] *] ts) (read-body t.ts)
2330 ?: ?=([[* * ?(%newline %dedent)] *] ts)
2902 ?: ?=([[* * ?(%newline %dedent)] *] ts)
2331 (bad ts "an expression, or a body on deeper lines")
2903 (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}")
2333 (read-expr ts)
2905 (read-expr ts)
2334 ::
2906 ::
2335 :: +read-body: after its INDENT, { definition NEWLINE } expr DEDENT
2907 :: +read-body: after its INDENT, { definition NEWLINE } expr DEDENT
@@ -2340,16 +2912,20 @@
2340 =| defs=(list def)
2912 =| defs=(list def)
2341 |- ^- (pare expr)
2913 |- ^- (pare expr)
2342 ?: ?=([[* * ?(%'++' %'+$')] *] ts)
2914 ?: ?=([[* * ?(%'++' %'+$')] *] ts)
2343− ;< [d=def after=(list token)] then (read-def ts)
2915+ ;< [d=def after=(list token)] then (read-def ts plus-mask)
2344 ?: ?=([[* * %newline] *] after) $(defs [d defs], ts t.after)
2916 ?: ?=([[* * %newline] *] after) $(defs [d defs], ts t.after)
2345− ?. ?=([[* * %dedent] *] after) (bad-end after)
2917+ ?. ?=([[* * %dedent] *] after) (bad-end-in after (def-can d))
2346 (bad after "the body's final expression, after its definitions")
2918 (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+ ==
2347 ;< [e=expr after=(list token)] then (read-expr ts)
2923 ;< [e=expr after=(list token)] then (read-expr ts)
2348 ?: ?=([[* * %dedent] *] after)
2924 ?: ?=([[* * %dedent] *] after)
2349 =/ ds=(list def) (flop defs)
2925 =/ ds=(list def) (flop defs)
2350 =/ beg=loc ?~(ds beg:(span-of e) beg:(span-of i.ds))
2926 =/ beg=loc ?~(ds beg:(span-of e) beg:(span-of i.ds))
2351 [%& [%body [beg end:(span-of e)] ds e] t.after]
2927 [%& [%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))
2353 %^ bad-why after "the end of the body"
2929 %^ bad-why after "the end of the body"
2354 "a body's final expression is its last line"
2930 "a body's final expression is its last line"
2355 ::
2931 ::
@@ -2374,7 +2950,7 @@
2374 |= ts=(list token)
2950 |= ts=(list token)
2375 ^- (pare expr)
2951 ^- (pare expr)
2376 ;< [els=(list expr) after=(list token)] then (read-operands ts)
2952 ;< [els=(list expr) after=(list token)] then (read-operands ts)
2377− ?~ els (no-operand ts)
2953+ ?~ els (no-operand ts expr-mask)
2378 [%& (call-of els) after]
2954 [%& (call-of els) after]
2379 ::
2955 ::
2380 :: +read-operands: a call's operands, or those on a group's first
2956 :: +read-operands: a call's operands, or those on a group's first
@@ -2387,15 +2963,27 @@
2387 |- ^- (pare (list expr))
2963 |- ^- (pare (list expr))
2388 ?~ ts [%& (flop els) ts]
2964 ?~ ts [%& (flop els) ts]
2389 =* t i.ts
2965 =* 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]
2391 ?: &(tight.t ?=(^ els)) (no-space ts)
2978 ?: &(tight.t ?=(^ els)) (no-space ts)
2392 ?: (is-operand-start t)
2979 ?: (is-operand-start t)
2393 ;< [e=expr more=(list token)] then (read-operand ts)
2980 ;< [e=expr more=(list token)] then (read-operand ts)
2394 $(els [e els], ts more)
2981 $(els [e els], ts more)
2395 ?: &(?=(^ els) (is-rune t))
2982 ?: &(?=(^ els) (is-rune t))
2396− %^ bad-why ts "an expression"
2983+ %: bad-in-why ts "an expression" operand-mask
2397− "inside a call, a rune goes in parentheses"
2984+ "inside a call, a rune goes in parentheses"
2985+ ==
2398− (no-operand ts)
2986+ (no-operand ts ?~(els expr-mask operand-mask))
2399 ::
2987 ::
2400 :: +read-operand: one operand, told by its first token and, after a
2988 :: +read-operand: one operand, told by its first token and, after a
2401 :: name or a wing, by a tight ( or +
2989 :: name or a wing, by a tight ( or +
@@ -2405,7 +2993,7 @@
2405 ^- (pare expr)
2993 ^- (pare expr)
2406 ?~ ts (bad ts "an expression")
2994 ?~ ts (bad ts "an expression")
2407 =* t i.ts
2995 =* t i.ts
2408− ?+ lex.t (no-operand ts)
2996+ ?+ lex.t (no-operand ts operand-mask)
2409 [%lit *] [%& [%lit at.t p.lex.t] t.ts]
2997 [%lit *] [%& [%lit at.t p.lex.t] t.ts]
2410 [%str *] [%& [%str at.t (text-piece p.lex.t)] t.ts]
2998 [%str *] [%& [%str at.t (text-piece p.lex.t)] t.ts]
2411 [%str-head *] (read-string t t.ts)
2999 [%str-head *] (read-string t t.ts)
@@ -2454,11 +3042,19 @@
2454 ::
3042 ::
2455 :: +read-ctor: |= and a term, with no space: a case's constructor
3043 :: +read-ctor: |= and a term, with no space: a case's constructor
2456 ::
3044 ::
3045+ :: Where an operand goes, |= can only be a constructor or begin |=(,
3046+ :: so a tall gate there fails at the space after |=.
3047+ ::
2457 ++ read-ctor
3048 ++ read-ctor
2458 |= [bar=token ts=(list token)]
3049 |= [bar=token ts=(list token)]
2459 ^- (pare expr)
3050 ^- (pare expr)
2460− ?: |(?=(~ ts) !tight.i.ts) (bad-space bar 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+ ==
2461− ?. ?=([[* * [%lit %term *]] *] ts) (bad ts "a term")
3057+ ?. ?=([[* * [%lit %term *]] *] ts) (bad-in ts "a term" cen-mask)
2462 [%& [%ctor [beg.at.bar end.at.i.ts] p.lex.i.ts] t.ts]
3058 [%& [%ctor [beg.at.bar end.at.i.ts] p.lex.i.ts] t.ts]
2463 ::
3059 ::
2464 :: +read-path: a path literal, as /posts/~zod (doc question)
3060 :: +read-path: a path literal, as /posts/~zod (doc question)
@@ -2467,7 +3063,7 @@
2467 |= [sl=token ts=(list token)]
3063 |= [sl=token ts=(list token)]
2468 ^- (pare expr)
3064 ^- (pare expr)
2469 ;< [[sp=span segs=(list @ta)] after=(list token)] then
3065 ;< [[sp=span segs=(list @ta)] after=(list token)] then
2470− (read-pathlit sl ts)
3066+ (read-pathlit sl ts &)
2471 [%& [%path sp segs] after]
3067 [%& [%path sp segs] after]
2472 ::
3068 ::
2473 :: +read-qath: %/, then its segments, knots or (expr), each after a
3069 :: +read-qath: %/, then its segments, knots or (expr), each after a
@@ -2502,7 +3098,10 @@
2502 ?. ?=([[* * %'('] *] ts) (bad ts "a path segment")
3098 ?. ?=([[* * %'('] *] ts) (bad ts "a path segment")
2503 =* par i.ts
3099 =* par i.ts
2504 ;< [e=expr after=(list token)] then (read-expr t.ts)
3100 ;< [e=expr after=(list token)] then (read-expr t.ts)
3101+ ?. ?=([[* * %')'] *] after)
3102+ =/ dm (doomed t.ts after (closing par ")"))
3103+ ?^ dm u.dm
2505− ?. ?=([[* * %')'] *] after) (unclosed par ")" after)
3104+ (unclosed par ")" after)
2506 [%& [[%expr e] end.at.i.after] t.after]
3105 [%& [[%expr e] end.at.i.after] t.after]
2507 ::
3106 ::
2508 :: +read-string: after its str-head, a string's interpolations and
3107 :: +read-string: after its str-head, a string's interpolations and
@@ -2521,7 +3120,10 @@
2521 $(ps (weld (text-piece p.lex.i.after) ps), op i.after, ts t.after)
3120 $(ps (weld (text-piece p.lex.i.after) ps), op i.after, ts t.after)
2522 ?. ?=([[* * [%str-tail *]] *] after)
3121 ?. ?=([[* * [%str-tail *]] *] after)
2523 =/ brace=loc [line.end.at.op (dec (max 2 col.end.at.op))]
3122 =/ 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)
2525 =. ps (weld (text-piece p.lex.i.after) ps)
3127 =. ps (weld (text-piece p.lex.i.after) ps)
2526 [%& [%str [beg.at.head end.at.i.after] (flop ps)] t.after]
3128 [%& [%str [beg.at.head end.at.i.after] (flop ps)] t.after]
2527 ::
3129 ::
@@ -2537,15 +3139,19 @@
2537 ^- (pare expr)
3139 ^- (pare expr)
2538 ?: (is-rune-start ts)
3140 ?: (is-rune-start ts)
2539 ;< [e=expr after=(list token)] then (read-expr ts)
3141 ;< [e=expr after=(list token)] then (read-expr ts)
3142+ ?. ?=([[* * %')'] *] after)
3143+ =/ dm (doomed ts after (closing par ")"))
3144+ ?^ dm u.dm
2540− ?. ?=([[* * %')'] *] after) (unclosed par ")" after)
3145+ (unclosed par ")" after)
2541 [%& [%group [beg.at.par end.at.i.after] e] t.after]
3146 [%& [%group [beg.at.par end.at.i.after] e] t.after]
2542 ;< [els=(list expr) after=(list token)] then (read-operands ts)
3147 ;< [els=(list expr) after=(list token)] then (read-operands ts)
2543 ?: ?=([[* * %')'] *] after)
3148 ?: ?=([[* * %')'] *] after)
2544 ?~ els (bad after "an expression")
3149 ?~ els (bad after "an expression")
2545 [%& [%group [beg.at.par end.at.i.after] (call-of els)] t.after]
3150 [%& [%group [beg.at.par end.at.i.after] (call-of els)] t.after]
2546 ?. ?=([[* * %indent] *] after)
3151 ?. ?=([[* * %indent] *] after)
2547− =/ last=(unit span) ?~(els ~ `(span-of (rear els)))
3152+ =/ dm (doomed ts after (closing par ")"))
3153+ ?^ dm u.dm
2548− (unclosed-open par ")" "an argument" last after)
3154+ (unclosed-open par ")" "an argument" after)
2549 ;< [ls=(list item) more=(list token)] then
3155 ;< [ls=(list item) more=(list token)] then
2550 (read-lines %group t.after)
3156 (read-lines %group t.after)
2551 =/ inner=expr (call-of (weld els (turn ls |=(i=item val.i))))
3157 =/ inner=expr (call-of (weld els (turn ls |=(i=item val.i))))
@@ -2554,6 +3160,8 @@
2554 :: +read-bracket: a tuple's, list's or change's items, to its closer
3160 :: +read-bracket: a tuple's, list's or change's items, to its closer
2555 :: on the line, or to the end of its lines below when left open
3161 :: on the line, or to the end of its lines below when left open
2556 ::
3162 ::
3163+ :: pre is the tokens from the last item on, for +doomed.
3164+ ::
2557 ++ read-bracket
3165 ++ read-bracket
2558 |= $: kind=?(%tuple %list %change)
3166 |= $: kind=?(%tuple %list %change)
2559 op=token
3167 op=token
@@ -2563,6 +3171,7 @@
2563 ^- (pare expr)
3171 ^- (pare expr)
2564 =/ close=?(%')' %']') ?:(?=(%change kind) %')' %']')
3172 =/ close=?(%')' %']') ?:(?=(%change kind) %')' %']')
2565 =| its=(list item)
3173 =| its=(list item)
3174+ =| pre=(list token)
2566 |- ^- (pare expr)
3175 |- ^- (pare expr)
2567 ?~ ts (bad ts "an item")
3176 ?~ ts (bad ts "an item")
2568 =* t i.ts
3177 =* t i.ts
@@ -2571,15 +3180,16 @@
2571 ?: (is-closer t) (unclosed op (trip close) ts)
3180 ?: (is-closer t) (unclosed op (trip close) ts)
2572 ?: ?=(%indent lex.t)
3181 ?: ?=(%indent lex.t)
2573 ;< [ls=(list item) more=(list token)] then (read-lines kind t.ts)
3182 ;< [ls=(list item) more=(list token)] then (read-lines kind t.ts)
2574− =/ all=(list item) (weld (flop its) ls)
3183+ =/ every=(list item) (weld (flop its) ls)
2575− =/ fin=loc ?~(all end.at.op end.at:(rear all))
3184+ =/ fin=loc ?~(every end.at.op end.at:(rear every))
2576− [%& (bracket-node kind op target all fin) more]
3185+ [%& (bracket-node kind op target every fin) more]
2577 ?: ?=(?(%newline %dedent) lex.t)
3186 ?: ?=(?(%newline %dedent) lex.t)
2578− =/ last=(unit span) ?~(its ~ `at.i.its)
3187+ =/ dm (doomed pre ts (closing op (trip close)))
3188+ ?^ dm u.dm
2579− (unclosed-open op (trip close) "an item" last ts)
3189+ (unclosed-open op (trip close) "an item" ts)
2580 ?: &(tight.t ?=(^ its)) (no-space ts)
3190 ?: &(tight.t ?=(^ its)) (no-space ts)
2581 ;< [i=item more=(list token)] then (read-item kind ts)
3191 ;< [i=item more=(list token)] then (read-item kind ts)
2582− $(its [i its], ts more)
3192+ $(its [i its], ts more, pre ts)
2583 ::
3193 ::
2584 :: +read-item: [ name= ] operand; a tuple's item may be named, a
3194 :: +read-item: [ name= ] operand; a tuple's item may be named, a
2585 :: change's must be, a list's is not
3195 :: change's must be, a list's is not
@@ -2595,8 +3205,9 @@
2595 [%& [[beg.at.nam end:(span-of v)] `p.lex.nam v] after]
3205 [%& [[beg.at.nam end:(span-of v)] `p.lex.nam v] after]
2596 ?: ?=(%change kind) (unnamed ts)
3206 ?: ?=(%change kind) (unnamed ts)
2597 ?: &(?=(^ ts) (is-rune i.ts))
3207 ?: &(?=(^ ts) (is-rune i.ts))
2598− %^ bad-why ts "an expression"
3208+ %: bad-in-why ts "an expression" operand-mask
2599− "inside brackets, a rune goes in parentheses"
3209+ "inside brackets, a rune goes in parentheses"
3210+ ==
2600 ;< [v=expr after=(list token)] then (read-operand ts)
3211 ;< [v=expr after=(list token)] then (read-operand ts)
2601 [%& [(span-of v) ~ v] after]
3212 [%& [(span-of v) ~ v] after]
2602 ::
3213 ::
@@ -2611,7 +3222,7 @@
2611 ;< [l=item after=(list token)] then (read-line kind ts)
3222 ;< [l=item after=(list token)] then (read-line kind ts)
2612 ?: ?=([[* * %newline] *] after) $(ls [l ls], ts t.after)
3223 ?: ?=([[* * %newline] *] after) $(ls [l ls], ts t.after)
2613 ?: ?=([[* * %dedent] *] after) [%& (flop [l ls]) t.after]
3224 ?: ?=([[* * %dedent] *] after) [%& (flop [l ls]) t.after]
2614− ?. ?=([[* * ?(%')' %']')] *] after) (bad-end after)
3225+ ?. ?=([[* * ?(%')' %']')] *] after) (bad-end-in after (tail-can val.l))
2615 %^ bad-why after "the end of the line"
3226 %^ bad-why after "the end of the line"
2616 "a bracket open at the end of its line takes no closer"
3227 "a bracket open at the end of its line takes no closer"
2617 ::
3228 ::
@@ -2622,6 +3233,10 @@
2622 ++ read-line
3233 ++ read-line
2623 |= [kind=?(%tuple %list %change %group) ts=(list token)]
3234 |= [kind=?(%tuple %list %change %group) ts=(list token)]
2624 ^- (pare item)
3235 ^- (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"
2625 ?: ?& ?=(?(%tuple %change) kind)
3240 ?: ?& ?=(?(%tuple %change) kind)
2626 ?=([[* * [%name *]] [* %& %'='] *] ts)
3241 ?=([[* * [%name *]] [* %& %'='] *] ts)
2627 ==
3242 ==
@@ -2641,17 +3256,22 @@
2641 ^- (pare expr)
3256 ^- (pare expr)
2642 ;< [s=sample after=(list token)] then (read-sample ts)
3257 ;< [s=sample after=(list token)] then (read-sample ts)
2643 ?: ?=([[* * %')'] *] after) (bad after "the gate's body")
3258 ?: ?=([[* * %')'] *] after) (bad after "the gate's body")
3259+ ?: &(?=(^ after) tight.i.after)
2644− ?: &(?=(^ after) tight.i.after) (bad after "a space after the sample")
3260+ (no-gap after "a space after the sample")
3261+ =/ dm (doomed ts after "the gate's body")
3262+ ?^ dm u.dm
2645 ?: &(?=(^ after) (is-rune i.after))
3263 ?: &(?=(^ after) (is-rune i.after))
2646− %^ bad-why after "an expression"
3264+ %: bad-in-why after "an expression" operand-mask
2647− "the wide gate's body is an operand, so a rune goes in parentheses"
3265+ "the wide gate's body is an operand, so a rune goes in parentheses"
3266+ ==
2648 ;< [b=expr more=(list token)] then (read-operand after)
3267 ;< [b=expr more=(list token)] then (read-operand after)
2649 ?: ?=([[* * %')'] *] more)
3268 ?: ?=([[* * %')'] *] more)
2650 [%& [%gate-wide [beg.at.op end.at.i.more] s b] t.more]
3269 [%& [%gate-wide [beg.at.op end.at.i.more] s b] t.more]
3270+ =/ dn (doomed after more (closing op ")"))
3271+ ?^ dn u.dn
2651 ?. &(?=(^ more) !tight.i.more (is-operand-start i.more))
3272 ?. &(?=(^ more) !tight.i.more (is-operand-start i.more))
2652 (unclosed op ")" more)
3273 (unclosed op ")" more)
2653− %^ bad-why more
3274+ %^ bad-why more (closing op ")")
2654− "`)` to close the `|=(` at {(show-loc beg.at.op)}"
2655 "the wide gate's body is one operand, so a call goes in parentheses"
3275 "the wide gate's body is one operand, so a call goes in parentheses"
2656 ::
3276 ::
2657 :: +read-gate: |= sample, then an expression or a body
3277 :: +read-gate: |= sample, then an expression or a body
@@ -2659,8 +3279,13 @@
2659 ++ read-gate
3279 ++ read-gate
2660 |= [bar=token ts=(list token)]
3280 |= [bar=token ts=(list token)]
2661 ^- (pare expr)
3281 ^- (pare expr)
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)
2662− ?: &(?=(^ ts) tight.i.ts) (bad ts "a space after `|=`")
3285+ (no-gap ts "a space after `|=`")
2663 ;< [s=sample after=(list token)] then (read-sample ts)
3286 ;< [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
2664 ;< [e=expr more=(list token)] then
3289 ;< [e=expr more=(list token)] then
2665 (read-expr-or-body "the sample" after)
3290 (read-expr-or-body "the sample" after)
2666 [%& [%gate [beg.at.bar end:(span-of e)] s e] more]
3291 [%& [%gate [beg.at.bar end:(span-of e)] s e] more]
@@ -2672,6 +3297,8 @@
2672 ^- (pare expr)
3297 ^- (pare expr)
2673 ?: &(?=(^ ts) tight.i.ts) (wide-rune "^-" ts)
3298 ?: &(?=(^ ts) tight.i.ts) (wide-rune "^-" ts)
2674 ;< [s=shape after=(list token)] then (read-mold ts)
3299 ;< [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
2675 ;< [e=expr more=(list token)] then
3302 ;< [e=expr more=(list token)] then
2676 (read-expr-or-body "the mold" after)
3303 (read-expr-or-body "the mold" after)
2677 [%& [%cast [beg.at.ket end:(span-of e)] s e] more]
3304 [%& [%cast [beg.at.ket end:(span-of e)] s e] more]
@@ -2681,9 +3308,11 @@
2681 ++ read-trace
3308 ++ read-trace
2682 |= [sig=token ts=(list token)]
3309 |= [sig=token ts=(list token)]
2683 ^- (pare expr)
3310 ^- (pare expr)
2684− ?: &(?=(^ ts) tight.i.ts) (bad ts "a space after `~&`")
3311+ ?: &(?=(^ ts) tight.i.ts) (wide-rune "~&" ts)
2685 ;< [v=expr after=(list token)] then (read-expr ts)
3312 ;< [v=expr after=(list token)] then (read-expr ts)
2686 ?. ?=([[* * %indent] *] after)
3313 ?. ?=([[* * %indent] *] after)
3314+ =/ dm (doomed ts after "`~&`'s body on deeper lines")
3315+ ?^ dm u.dm
2687 (bad after "`~&`'s body on deeper lines")
3316 (bad after "`~&`'s body on deeper lines")
2688 ;< [b=expr more=(list token)] then (read-body t.after)
3317 ;< [b=expr more=(list token)] then (read-body t.after)
2689 [%& [%trace [beg.at.sig end:(span-of b)] v b] more]
3318 [%& [%trace [beg.at.sig end:(span-of b)] v b] more]
@@ -2696,13 +3325,15 @@
2696 ?: &(?=(^ ts) tight.i.ts) (wide-rune "?-" ts)
3325 ?: &(?=(^ ts) tight.i.ts) (wide-rune "?-" ts)
2697 ;< [s=expr after=(list token)] then (read-expr ts)
3326 ;< [s=expr after=(list token)] then (read-expr ts)
2698 ?. ?=([[* * %indent] *] after)
3327 ?. ?=([[* * %indent] *] after)
3328+ =/ dm (doomed ts after "`?-`'s arms on deeper lines")
3329+ ?^ dm u.dm
2699 (bad after "`?-`'s arms on deeper lines")
3330 (bad after "`?-`'s arms on deeper lines")
2700 =| arms=(list arm)
3331 =| arms=(list arm)
2701 =/ rest=(list token) t.after
3332 =/ rest=(list token) t.after
2702 |- ^- (pare expr)
3333 |- ^- (pare expr)
2703 ;< [a=arm more=(list token)] then (read-arm rest)
3334 ;< [a=arm more=(list token)] then (read-arm rest)
2704 ?: ?=([[* * %newline] *] more) $(arms [a arms], rest t.more)
3335 ?: ?=([[* * %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))
2706 [%& [%branch [beg.at.wut end.at.a] s (flop [a arms])] t.more]
3337 [%& [%branch [beg.at.wut end.at.a] s (flop [a arms])] t.more]
2707 ::
3338 ::
2708 :: +read-arm: a pattern, then an expression or a body
3339 :: +read-arm: a pattern, then an expression or a body
@@ -2714,6 +3345,9 @@
2714 ?: ?=([[* %& %'+'] *] after)
3345 ?: ?=([[* %& %'+'] *] after)
2715 %^ bad-why after "a space after the pattern"
3346 %^ bad-why after "a space after the pattern"
2716 "patterns take no pairs: write a cell, as [%gap %s2]"
3347 "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]"
2717 ;< [e=expr more=(list token)] then
3351 ;< [e=expr more=(list token)] then
2718 (read-expr-or-body "the pattern" after)
3352 (read-expr-or-body "the pattern" after)
2719 [%& [[beg:(span-of p) end:(span-of e)] p e] more]
3353 [%& [[beg:(span-of p) end:(span-of e)] p e] more]
@@ -2721,17 +3355,18 @@
2721 :: +read-pattern: a term, number, string, ship, loobean, ~, * or name,
3355 :: +read-pattern: a term, number, string, ship, loobean, ~, * or name,
2722 :: or a cell of patterns
3356 :: or a cell of patterns
2723 ::
3357 ::
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
2724− :: A date, duration or knot fails at its second character, since ~
3360+ :: at its second character, since ~ alone is null; a duration at its
2725− :: alone is null and no ship goes on so; ~[ at its [; and a string
3361+ :: third, as ~s could begin the ship ~sev; ~[ at its [; a string
2726− :: with {…} at its { (section 3, Errors).
3362+ :: with {…} at its {; a wing at its first dot.
2727 ::
3363 ::
2728 ++ read-pattern
3364 ++ read-pattern
2729 |= ts=(list token)
3365 |= ts=(list token)
2730 ^- (pare pattern)
3366 ^- (pare pattern)
2731 ?~ ts (bad ts "a pattern")
3367 ?~ ts (bad ts "a pattern")
2732 =* t i.ts
3368 =* 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)
2735 [%lit *]
3370 [%lit *]
2736 =* l p.lex.t
3371 =* l p.lex.t
2737 ?: ?=(?(%number %ship %term %loobean %null) form.l)
3372 ?: ?=(?(%number %ship %term %loobean %null) form.l)
@@ -2742,7 +3377,8 @@
2742 %duration "durations"
3377 %duration "durations"
2743 %knot "knots"
3378 %knot "knots"
2744 ==
3379 ==
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)]
2746 ;: weld
3382 ;: weld
2747 "expected a pattern, found {(show-found t)}; patterns take no "
3383 "expected a pattern, found {(show-found t)}; patterns take no "
2748 what
3384 what
@@ -2754,6 +3390,11 @@
2754 [%name *] [%& [%bind at.t p.lex.t] t.ts]
3390 [%name *] [%& [%bind at.t p.lex.t] t.ts]
2755 %'[' (read-cell-pattern t t.ts)
3391 %'[' (read-cell-pattern t t.ts)
2756 %'`' (bad-why ts "a pattern" "patterns take no units: write [~ x]")
3392 %'`' (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+ ==
2757 ::
3398 ::
2758 [%str-head *]
3399 [%str-head *]
2759 %+ bad-at [line.end.at.t (dec (max 2 col.end.at.t))]
3400 %+ bad-at [line.end.at.t (dec (max 2 col.end.at.t))]
@@ -2761,7 +3402,7 @@
2761 "patterns take strings without `\{…}`"
3402 "patterns take strings without `\{…}`"
2762 ::
3403 ::
2763 %'~['
3404 %'~['
2764− %+ bad-at next
3405+ %+ bad-at [line.beg.at.t +(col.beg.at.t)]
2765 "expected a pattern, found `~[`; patterns take no lists"
3406 "expected a pattern, found `~[`; patterns take no lists"
2766 ==
3407 ==
2767 ::
3408 ::
@@ -2777,7 +3418,7 @@
2777 [%& [%cell [beg.at.op end.at.i.ts] (flop ps)] t.ts]
3418 [%& [%cell [beg.at.op end.at.i.ts] (flop ps)] t.ts]
2778 ?: &(?=(^ ts) |((is-closer i.ts) (is-layout i.ts)))
3419 ?: &(?=(^ ts) |((is-closer i.ts) (is-layout i.ts)))
2779 (unclosed op "]" ts)
3420 (unclosed op "]" ts)
2780− ?: &(?=(^ ps) ?=(^ ts) tight.i.ts) (no-space ts)
3421+ ?: &(?=(^ ps) ?=(^ ts) tight.i.ts) (no-space-pattern ts)
2781 ;< [p=pattern after=(list token)] then (read-pattern ts)
3422 ;< [p=pattern after=(list token)] then (read-pattern ts)
2782 $(ps [p ps], ts after)
3423 $(ps [p ps], ts after)
2783 ::
3424 ::
@@ -2791,21 +3432,26 @@
2791 ?: ?=([[* * [%name *]] *] ts) [%& [%bind at.i.ts p.lex.i.ts] t.ts]
3432 ?: ?=([[* * [%name *]] *] ts) [%& [%bind at.i.ts p.lex.i.ts] t.ts]
2792 ?: ?=([[* * %'='] *] ts) (read-pun i.ts t.ts)
3433 ?: ?=([[* * %'='] *] ts) (read-pun i.ts t.ts)
2793 ?: &(?=(^ ts) (is-layout i.ts)) (bad ts "a sample")
3434 ?: &(?=(^ ts) (is-layout i.ts)) (bad ts "a sample")
3435+ ?: ?=([[* * [%error *]] *] ts)
3436+ (bad-in ts "a mold" (con mold-mask tis-mask))
2794 ?. ?=([[* * %'['] *] ts)
3437 ?. ?=([[* * %'['] *] ts)
2795 ;< [s=shape after=(list token)] then (read-mold ts)
3438 ;< [s=shape after=(list token)] then (read-mold ts)
2796 [%& [%bare (span-of s) s] after]
3439 [%& [%bare (span-of s) s] after]
2797 =* op i.ts
3440 =* op i.ts
2798 =| ss=(list sample)
3441 =| ss=(list sample)
3442+ =| pre=(list token)
2799 =/ rest=(list token) t.ts
3443 =/ rest=(list token) t.ts
2800 |- ^- (pare sample)
3444 |- ^- (pare sample)
2801 ?: ?=([[* * %']'] *] rest)
3445 ?: ?=([[* * %']'] *] rest)
2802 ?~ ss (bad rest "a sample")
3446 ?~ ss (bad rest "a sample")
2803 [%& [%cell [beg.at.op end.at.i.rest] (flop ss)] t.rest]
3447 [%& [%cell [beg.at.op end.at.i.rest] (flop ss)] t.rest]
2804 ?: &(?=(^ rest) |((is-closer i.rest) (is-layout i.rest)))
3448 ?: &(?=(^ rest) |((is-closer i.rest) (is-layout i.rest)))
3449+ =/ dm (doomed pre rest (closing op "]"))
3450+ ?^ dm u.dm
2805 (unclosed op "]" rest)
3451 (unclosed op "]" rest)
2806 ?: &(?=(^ ss) ?=(^ rest) tight.i.rest) (no-space rest)
3452 ?: &(?=(^ ss) ?=(^ rest) tight.i.rest) (no-space rest)
2807 ;< [s=sample after=(list token)] then (read-sample rest)
3453 ;< [s=sample after=(list token)] then (read-sample rest)
2808− $(ss [s ss], rest after)
3454+ $(ss [s ss], rest after, pre rest)
2809 ::
3455 ::
2810 :: +read-field: a cell mold's field: name=mold, =name, or a mold
3456 :: +read-field: a cell mold's field: name=mold, =name, or a mold
2811 ::
3457 ::
@@ -2814,6 +3460,9 @@
2814 ^- (pare field)
3460 ^- (pare field)
2815 ?: ?=([[* * [%name *]] [* %& %'='] *] ts) (read-face ts)
3461 ?: ?=([[* * [%name *]] [* %& %'='] *] ts) (read-face ts)
2816 ?: ?=([[* * %'='] *] ts) (read-pun i.ts t.ts)
3462 ?: ?=([[* * %'='] *] 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))
2817 ;< [s=shape after=(list token)] then (read-mold ts)
3466 ;< [s=shape after=(list token)] then (read-mold ts)
2818 [%& [%bare (span-of s) s] after]
3467 [%& [%bare (span-of s) s] after]
2819 ::
3468 ::
@@ -2835,7 +3484,7 @@
2835 |= [tis=token ts=(list token)]
3484 |= [tis=token ts=(list token)]
2836 ^- (pare field)
3485 ^- (pare field)
2837 ?: |(?=(~ ts) !tight.i.ts) (bad-space tis ts "a name")
3486 ?: |(?=(~ ts) !tight.i.ts) (bad-space tis ts "a name")
2838− ?. ?=([[* * [%name *]] *] ts) (bad ts "a name")
3487+ ?. ?=([[* * [%name *]] *] ts) (no-name ts)
2839 [%& [%pun [beg.at.tis end.at.i.ts] p.lex.i.ts] t.ts]
3488 [%& [%pun [beg.at.tis end.at.i.ts] p.lex.i.ts] t.ts]
2840 ::
3489 ::
2841 :: +read-mold: one mold
3490 :: +read-mold: one mold
@@ -2845,7 +3494,7 @@
2845 ^- (pare shape)
3494 ^- (pare shape)
2846 ?~ ts (bad ts "a mold")
3495 ?~ ts (bad ts "a mold")
2847 =* t i.ts
3496 =* t i.ts
2848− ?+ lex.t (bad ts "a mold")
3497+ ?+ lex.t (bad-in ts "a mold" mold-mask)
2849 [%aura *] [%& [%aura at.t p.lex.t] t.ts]
3498 [%aura *] [%& [%aura at.t p.lex.t] t.ts]
2850 %'*' [%& [%noun at.t ~] t.ts]
3499 %'*' [%& [%noun at.t ~] t.ts]
2851 %'!!' [%& [%void at.t ~] t.ts]
3500 %'!!' [%& [%void at.t ~] t.ts]
@@ -2860,9 +3509,15 @@
2860 %'$?(' (read-union-wide t t.ts)
3509 %'$?(' (read-union-wide t t.ts)
2861 %'$-(' (read-fn t t.ts)
3510 %'$-(' (read-fn t t.ts)
2862 %'|$' (read-generic t t.ts)
3511 %'|$' (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+ ==
2863 ::
3517 ::
2864 [%lit *]
3518 [%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)
2866 [%& [%const at.t p.lex.t] t.ts]
3521 [%& [%const at.t p.lex.t] t.ts]
2867 ==
3522 ==
2868 ::
3523 ::
@@ -2873,15 +3528,18 @@
2873 |= [op=token spaced=? ts=(list token)]
3528 |= [op=token spaced=? ts=(list token)]
2874 ^- (pare [(list shape) loc])
3529 ^- (pare [(list shape) loc])
2875 =| ms=(list shape)
3530 =| ms=(list shape)
3531+ =| pre=(list token)
2876 |- ^- (pare [(list shape) loc])
3532 |- ^- (pare [(list shape) loc])
2877 ?: ?=([[* * %')'] *] ts)
3533 ?: ?=([[* * %')'] *] ts)
2878 ?~ ms (bad ts "a mold")
3534 ?~ ms (bad ts "a mold")
2879 [%& [(flop ms) end.at.i.ts] t.ts]
3535 [%& [(flop ms) end.at.i.ts] t.ts]
2880 ?: &(?=(^ ts) |((is-closer i.ts) (is-layout i.ts)))
3536 ?: &(?=(^ ts) |((is-closer i.ts) (is-layout i.ts)))
3537+ =/ dm (doomed pre ts (closing op ")"))
3538+ ?^ dm u.dm
2881 (unclosed op ")" ts)
3539 (unclosed op ")" ts)
2882 ?: &(?=(^ ts) tight.i.ts |(spaced ?=(^ ms))) (no-space ts)
3540 ?: &(?=(^ ts) tight.i.ts |(spaced ?=(^ ms))) (no-space ts)
2883 ;< [m=shape after=(list token)] then (read-mold ts)
3541 ;< [m=shape after=(list token)] then (read-mold ts)
2884− $(ms [m ms], ts after)
3542+ $(ms [m ms], ts after, pre ts)
2885 ::
3543 ::
2886 :: +read-apply: ( ref mold { mold } )
3544 :: +read-apply: ( ref mold { mold } )
2887 ::
3545 ::
@@ -2889,7 +3547,7 @@
2889 |= [op=token ts=(list token)]
3547 |= [op=token ts=(list token)]
2890 ^- (pare shape)
3548 ^- (pare shape)
2891 ?. ?=([[* * ?([%name *] [%wing *])] *] ts)
3549 ?. ?=([[* * ?([%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)
2893 ;< [[ms=(list shape) fin=loc] after=(list token)] then
3551 ;< [[ms=(list shape) fin=loc] after=(list token)] then
2894 (read-molds op & t.ts)
3552 (read-molds op & t.ts)
2895 [%& [%apply [beg.at.op fin] (names-of lex.i.ts) ms] after]
3553 [%& [%apply [beg.at.op fin] (names-of lex.i.ts) ms] after]
@@ -2911,10 +3569,15 @@
2911 ;< [a=shape after=(list token)] then (read-mold ts)
3569 ;< [a=shape after=(list token)] then (read-mold ts)
2912 ?: ?=([[* * %')'] *] after) (bad after "a mold, the product")
3570 ?: ?=([[* * %')'] *] after) (bad after "a mold, the product")
2913 ?: &(?=(^ after) |((is-closer i.after) (is-layout i.after)))
3571 ?: &(?=(^ after) |((is-closer i.after) (is-layout i.after)))
3572+ =/ dm (doomed ts after (closing op ")"))
3573+ ?^ dm u.dm
2914 (unclosed op ")" after)
3574 (unclosed op ")" after)
2915 ?: &(?=(^ after) tight.i.after) (no-space after)
3575 ?: &(?=(^ after) tight.i.after) (no-space after)
2916 ;< [b=shape more=(list token)] then (read-mold after)
3576 ;< [b=shape more=(list token)] then (read-mold after)
3577+ ?. ?=([[* * %')'] *] more)
3578+ =/ dn (doomed after more (closing op ")"))
3579+ ?^ dn u.dn
2917− ?. ?=([[* * %')'] *] more) (unclosed op ")" more)
3580+ (unclosed op ")" more)
2918 [%& [%fn [beg.at.op end.at.i.more] a b] t.more]
3581 [%& [%fn [beg.at.op end.at.i.more] a b] t.more]
2919 ::
3582 ::
2920 :: +read-cell-mold: [ field { field } ]
3583 :: +read-cell-mold: [ field { field } ]
@@ -2923,15 +3586,18 @@
2923 |= [op=token ts=(list token)]
3586 |= [op=token ts=(list token)]
2924 ^- (pare shape)
3587 ^- (pare shape)
2925 =| fs=(list field)
3588 =| fs=(list field)
3589+ =| pre=(list token)
2926 |- ^- (pare shape)
3590 |- ^- (pare shape)
2927 ?: ?=([[* * %']'] *] ts)
3591 ?: ?=([[* * %']'] *] ts)
2928 ?~ fs (bad ts "a mold")
3592 ?~ fs (bad ts "a mold")
2929 [%& [%cell [beg.at.op end.at.i.ts] (flop fs)] t.ts]
3593 [%& [%cell [beg.at.op end.at.i.ts] (flop fs)] t.ts]
2930 ?: &(?=(^ ts) |((is-closer i.ts) (is-layout i.ts)))
3594 ?: &(?=(^ ts) |((is-closer i.ts) (is-layout i.ts)))
3595+ =/ dm (doomed pre ts (closing op "]"))
3596+ ?^ dm u.dm
2931 (unclosed op "]" ts)
3597 (unclosed op "]" ts)
2932 ?: &(?=(^ fs) ?=(^ ts) tight.i.ts) (no-space ts)
3598 ?: &(?=(^ fs) ?=(^ ts) tight.i.ts) (no-space ts)
2933 ;< [f=field after=(list token)] then (read-field ts)
3599 ;< [f=field after=(list token)] then (read-field ts)
2934− $(fs [f fs], ts after)
3600+ $(fs [f fs], ts after, pre ts)
2935 ::
3601 ::
2936 :: +read-union: $?, then its cases below, one mold per line
3602 :: +read-union: $?, then its cases below, one mold per line
2937 ::
3603 ::
@@ -2951,6 +3617,7 @@
2951 ?: ?=([[* * %dedent] *] after)
3617 ?: ?=([[* * %dedent] *] after)
2952 [%& [%union [beg.at.buc end:(span-of c)] (flop [c cs])] t.after]
3618 [%& [%union [beg.at.buc end:(span-of c)] (flop [c cs])] t.after]
2953 ?: ?=([[* * %indent] *] after) (bad-end after)
3619 ?: ?=([[* * %indent] *] after) (bad-end after)
3620+ ?: &(?=(^ after) (stray i.after)) (bad-end after)
2954 (bad-why after "the end of the line" "a union takes one case per line")
3621 (bad-why after "the end of the line" "a union takes one case per line")
2955 ::
3622 ::
2956 :: +read-generic: |$ [ typevar { typevar } ] mold
3623 :: +read-generic: |$ [ typevar { typevar } ] mold
@@ -2958,9 +3625,9 @@
2958 ++ read-generic
3625 ++ read-generic
2959 |= [bar=token ts=(list token)]
3626 |= [bar=token ts=(list token)]
2960 ^- (pare shape)
3627 ^- (pare shape)
2961− ?: &(?=(^ ts) tight.i.ts) (bad ts "a space after `|$`")
3628+ ?: &(?=(^ ts) tight.i.ts) (wide-rune "|$" ts)
2962 ?. ?=([[* * %'['] *] ts)
3629 ?. ?=([[* * %'['] *] ts)
2963− (bad ts "`[` and its type variables, as in |$ [M]")
3630+ (bad-in ts "`[` and its type variables, as in |$ [M]" sel-mask)
2964 =* op i.ts
3631 =* op i.ts
2965 =| vs=(list @t)
3632 =| vs=(list @t)
2966 =/ rest=(list token) t.ts
3633 =/ rest=(list token) t.ts
@@ -2968,13 +3635,14 @@
2968 ?: ?=([[* * %']'] *] rest)
3635 ?: ?=([[* * %']'] *] rest)
2969 ?~ vs (bad rest "a type variable")
3636 ?~ vs (bad rest "a type variable")
2970 =/ more=(list token) t.rest
3637 =/ 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 `]`")
2972 ;< [b=shape after=(list token)] then (read-mold more)
3639 ;< [b=shape after=(list token)] then (read-mold more)
2973 [%& [%generic [beg.at.bar end:(span-of b)] (flop vs) b] after]
3640 [%& [%generic [beg.at.bar end:(span-of b)] (flop vs) b] after]
2974 ?: &(?=(^ rest) |((is-closer i.rest) (is-layout i.rest)))
3641 ?: &(?=(^ rest) |((is-closer i.rest) (is-layout i.rest)))
2975 (unclosed op "]" rest)
3642 (unclosed op "]" rest)
2976 ?: &(?=(^ vs) ?=(^ rest) tight.i.rest) (no-space rest)
3643 ?: &(?=(^ vs) ?=(^ rest) tight.i.rest) (no-space rest)
3644+ ?. ?=([[* * [%tvar *]] *] rest)
2977− ?. ?=([[* * [%tvar *]] *] rest) (bad rest "a type variable")
3645+ (bad-in rest "a type variable" upper-mask)
2978 $(vs [p.lex.i.rest vs], rest t.rest)
3646 $(vs [p.lex.i.rest vs], rest t.rest)
2979 ::
3647 ::
2980 :: +read-pathmold: / [ segment { / segment } ], each / and segment
3648 :: +read-pathmold: / [ segment { / segment } ], each / and segment
@@ -3010,16 +3678,16 @@
3010 =* op i.ts
3678 =* op i.ts
3011 =/ r1=(list token) t.ts
3679 =/ r1=(list token) t.ts
3012 ?: |(?=(~ r1) !tight.i.r1) (bad-space op r1 "a name")
3680 ?: |(?=(~ r1) !tight.i.r1) (bad-space op r1 "a name")
3013− ?. ?=([[* * [%name *]] *] r1) (bad r1 "a name")
3681+ ?. ?=([[* * [%name *]] *] r1) (no-name r1)
3014 =/ r2=(list token) t.r1
3682 =/ r2=(list token) t.r1
3015 ?: |(?=(~ r2) !tight.i.r2) (bad-space i.r1 r2 "`=`")
3683 ?: |(?=(~ r2) !tight.i.r2) (bad-space i.r1 r2 "`=`")
3016− ?. ?=([[* * %'='] *] r2) (bad r2 "`=`")
3684+ ?. ?=([[* * %'='] *] r2) (bad-in r2 "`=`" tis-mask)
3017 =/ r3=(list token) t.r2
3685 =/ r3=(list token) t.r2
3018 ?: |(?=(~ r3) !tight.i.r3) (bad-space i.r2 r3 "an aura")
3686 ?: |(?=(~ 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)
3020 =/ r4=(list token) t.r3
3688 =/ r4=(list token) t.r3
3021 ?: |(?=(~ r4) !tight.i.r4) (bad-space i.r3 r4 "`]`")
3689 ?: |(?=(~ r4) !tight.i.r4) (bad-space i.r3 r4 "`]`")
3022− ?. ?=([[* * %']'] *] r4) (bad r4 "`]`")
3690+ ?. ?=([[* * %']'] *] r4) (bad-in r4 "`]`" ser-mask)
3023 =/ at=span [beg.at.op end.at.i.r4]
3691 =/ at=span [beg.at.op end.at.i.r4]
3024 [%& [[%typed at p.lex.i.r1 p.lex.i.r3] end.at.i.r4] t.r4]
3692 [%& [[%typed at p.lex.i.r1 p.lex.i.r3] end.at.i.r4] t.r4]
3025 --
3693 --
@@ -3029,38 +3697,97 @@
3029:: +outline: a node as +check-spans sees it
3697:: +outline: a node as +check-spans sees it
3030::
3698::
3031:: lead lists the kinds (+kind-of) of token the node may start with,
3699:: 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
3700+:: or is ~ when it starts with its first child; stop says where it
3033−:: end, and open lets a bracket that may be left open end with its
3701+:: ends (+stop).
3034−:: last child instead.
3035::
3702::
3036+$ outline
3703+$ outline
3037− $~ [%$ *span ~ ~ | ~]
3704+ $~ [%$ *span ~ %kid ~]
3038 $: kind=@tas
3705 $: kind=@tas
3039 at=span
3706 at=span
3040 lead=(list @)
3707 lead=(list @)
3041− last=(list @)
3708+ =stop
3042− open=?
3043 kids=(list outline)
3709 kids=(list outline)
3044 ==
3710 ==
3045::
3711::
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+::
3046:: +check-spans: whether a module's spans follow section 1's rules
3734:: +check-spans: whether a module's spans follow section 1's rules
3047::
3735::
3048:: A node starts at its first token and ends where its last token
3736:: A node starts at its first token and ends where its last token
3049:: ends, never at a layout token: at its own token where it has one
3737:: 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
3738+:: there (a rune, a name, an opener), else where its first child does;
3051−:: first or last child does. Its children's spans lie inside its own
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
3052−:: in source order, and so do the module's imports and definitions.
3741+:: spans lie inside its own in source order, and so do the module's
3053−:: Gives the first node that breaks a rule, and how, or ~.
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.
3054::
3745::
3055++ check-spans
3746++ check-spans
3056 |= [mod=module toks=(list token)]
3747 |= [mod=module toks=(list token)]
3057 ^- (unit tape)
3748 ^- (unit tape)
3058− =/ real=(list token) (skip toks is-layout)
3749+ %+ check-outlines toks
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] ~
3062 (weld (turn imports.mod outline-import) (turn defs.mod outline-def))
3750 (weld (turn imports.mod outline-import) (turn defs.mod outline-def))
3063::
3751::
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+::
3064:: +kind-of: a token's kind: a glyph, or its lexeme's tag
3791:: +kind-of: a token's kind: a glyph, or its lexeme's tag
3065::
3792::
3066++ kind-of
3793++ kind-of
@@ -3071,7 +3798,10 @@
3071:: +check-kids: nodes in source order, inside the span in, each checked
3798:: +check-kids: nodes in source order, inside the span in, each checked
3072::
3799::
3073++ check-kids
3800++ check-kids
3801+ |= $: idx=[info=(map loc tinfo) mat=(map loc loc)]
3802+ in=(unit span)
3074− |= [maps=[begs=(map loc @) ends=(map loc @)] in=(unit span) os=(list outline)]
3803+ os=(list outline)
3804+ ==
3075 ^- (unit tape)
3805 ^- (unit tape)
3076 =| prev=(unit span)
3806 =| prev=(unit span)
3077 |- ^- (unit tape)
3807 |- ^- (unit tape)
@@ -3083,14 +3813,14 @@
3083 `(span-bad o "ends after its parent")
3813 `(span-bad o "ends after its parent")
3084 ?: &(?=(^ prev) (loc-lth beg.at.o end.u.prev))
3814 ?: &(?=(^ prev) (loc-lth beg.at.o end.u.prev))
3085 `(span-bad o "starts before the node before it ends")
3815 `(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)
3087 ?^ bad bad
3817 ?^ bad bad
3088 $(prev `at.o, os t.os)
3818 $(prev `at.o, os t.os)
3089::
3819::
3090:: +check-outline: one node's start and end, then its children
3820:: +check-outline: one node's start and end, then its children
3091::
3821::
3092++ check-outline
3822++ check-outline
3093− |= [maps=[begs=(map loc @) ends=(map loc @)] o=outline]
3823+ |= [idx=[info=(map loc tinfo) mat=(map loc loc)] o=outline]
3094 ^- (unit tape)
3824 ^- (unit tape)
3095 =* ks kids.o
3825 =* ks kids.o
3096 =/ head=(unit span) ?~(ks ~ `at.i.ks)
3826 =/ head=(unit span) ?~(ks ~ `at.i.ks)
@@ -3102,29 +3832,95 @@
3102 ?~ head `"has no token or child to start with"
3832 ?~ head `"has no token or child to start with"
3103 ?: =(beg.at.o beg.u.head) ~
3833 ?: =(beg.at.o beg.u.head) ~
3104 `"should start where its first child does, at {(show-loc beg.u.head)}"
3834 `"should start where its first child does, at {(show-loc beg.u.head)}"
3105− =/ k=(unit @) (~(get by begs.maps) beg.at.o)
3835+ =/ t=(unit tinfo) (~(get by info.idx) beg.at.o)
3106− ?~ k `"starts where no token does"
3836+ ?~ t `"starts where no token does"
3107− ?. (lien `(list @)`lead.o |=(a=@ =(a u.k)))
3837+ ?. (lien `(list @)`lead.o |=(a=@ =(a kind.u.t)))
3108 `"starts at a token of a kind it can't start with"
3838 `"starts at a token of a kind it can't start with"
3109 ?: &(?=(^ head) !(loc-lth beg.at.o beg.u.head))
3839 ?: &(?=(^ head) !(loc-lth beg.at.o beg.u.head))
3110 `"should start with its own token, before its first child"
3840 `"should start with its own token, before its first child"
3111 ~
3841 ~
3112 ?^ start `(span-bad o u.start)
3842 ?^ start `(span-bad o u.start)
3113− :: the end: its own token, or its last child's
3843+ :: the end: where +stop says
3114− =/ stop=(unit tape)
3844+ =/ want=(unit loc) (stop-of idx o tail)
3115− ?: &(|(?=(~ last.o) open.o) ?=(^ tail) =(end.at.o end.u.tail)) ~
3845+ ?~ want `(span-bad o "has no end that its tokens give")
3116− ?~ last.o
3846+ ?. =(u.want end.at.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)}"
3847+ `(span-bad o "should end at {(show-loc u.want)}")
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)
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+ ==
3128::
3924::
3129:: +span-bad: a span check's error, naming the node by kind and span
3925:: +span-bad: a span check's error, naming the node by kind and span
3130::
3926::
@@ -3146,75 +3942,75 @@
3146 |= i=import
3942 |= i=import
3147 ^- outline
3943 ^- outline
3148 ?- -.i
3944 ?- -.i
3149− %sur [%sur at.i ~[%'/-'] ~[%name] | ~]
3945+ %sur [%sur at.i ~[%'/-'] %two ~]
3150− %mark [%mark at.i ~[%'/%'] ~[%lit] | ~]
3946+ %mark [%mark at.i ~[%'/%'] %two ~]
3151− %jibb [%jibb at.i ~[%'/='] ~[%'/' %knot] | ~]
3947+ %jibb [%jibb at.i ~[%'/='] %run3 ~]
3152 ==
3948 ==
3153::
3949::
3154++ outline-def
3950++ outline-def
3155 |= d=def
3951 |= d=def
3156 ^- outline
3952 ^- outline
3157 ?- -.d
3953 ?- -.d
3158− %mold [%mold at.d ~[%'+$'] ~ | ~[(outline-shape shape.d)]]
3954+ %mold [%mold at.d ~[%'+$'] %kid ~[(outline-shape shape.d)]]
3159− %value [%value at.d ~[%'++'] ~ | ~[(outline-expr val.d)]]
3955+ %value [%value at.d ~[%'++'] %kid ~[(outline-expr val.d)]]
3160 ==
3956 ==
3161::
3957::
3162++ outline-expr
3958++ outline-expr
3163 |= e=expr
3959 |= e=expr
3164 ^- outline
3960 ^- outline
3165 ?- -.e
3961 ?- -.e
3166− %lit [%lit at.e ~[%lit] ~[%lit] | ~]
3962+ %lit [%lit at.e ~[%lit] %one ~]
3167 %str (outline-str at.e pieces.e)
3963 %str (outline-str at.e pieces.e)
3168− %path [%path at.e ~[%'/'] ~[%'/' %knot] | ~]
3964+ %path [%path at.e ~[%'/'] %run ~]
3169− %wing [%wing at.e ~[%name %wing] ~[%name %wing] | ~]
3965+ %wing [%wing at.e ~[%name %wing] %one ~]
3170− %pair [%pair at.e ~[%name] ~ | ~[(outline-expr val.e)]]
3966+ %pair [%pair at.e ~[%name] %kid ~[(outline-expr val.e)]]
3171− %unit [%unit at.e ~[%'`'] ~ | ~[(outline-expr val.e)]]
3967+ %unit [%unit at.e ~[%'`'] %kid ~[(outline-expr val.e)]]
3172− %group [%group at.e ~[%'('] ~[%')'] & ~[(outline-expr inner.e)]]
3968+ %group [%group at.e ~[%'('] %shut ~[(outline-expr inner.e)]]
3173− %list [%list at.e ~[%'~['] ~[%']'] & (turn items.e outline-expr)]
3969+ %list [%list at.e ~[%'~['] %shut (turn items.e outline-expr)]
3174− %tuple [%tuple at.e ~[%'['] ~[%']'] & (turn items.e outline-item)]
3970+ %tuple [%tuple at.e ~[%'['] %shut (turn items.e outline-item)]
3175− %ctor [%ctor at.e ~[%'|='] ~[%lit] | ~]
3971+ %ctor [%ctor at.e ~[%'|='] %two ~]
3176− %crash [%crash at.e ~[%'!!'] ~[%'!!'] | ~]
3972+ %crash [%crash at.e ~[%'!!'] %one ~]
3177 ::
3973 ::
3178 %qath
3974 %qath
3179 =/ ks=(list outline)
3975 =/ ks=(list outline)
3180 %+ murn segs.e
3976 %+ murn segs.e
3181 |=(s=qseg ?.(?=(%expr -.s) ~ `(outline-expr p.s)))
3977 |=(s=qseg ?.(?=(%expr -.s) ~ `(outline-expr p.s)))
3182− [%qath at.e ~[%'%/'] ~[%'%/' %knot %')'] | ks]
3978+ [%qath at.e ~[%'%/'] %run ks]
3183 ::
3979 ::
3184 %change
3980 %change
3185 =/ ks=(list outline) (turn edits.e outline-edit)
3981 =/ ks=(list outline) (turn edits.e outline-edit)
3186− [%change at.e ~[%name %wing] ~[%')'] & ks]
3982+ [%change at.e ~[%name %wing] %shut2 ks]
3187 ::
3983 ::
3188 %gate-wide
3984 %gate-wide
3189 =/ ks=(list outline)
3985 =/ ks=(list outline)
3190 ~[(outline-sample sample.e) (outline-expr body.e)]
3986 ~[(outline-sample sample.e) (outline-expr body.e)]
3191− [%gate-wide at.e ~[%'|=('] ~[%')'] | ks]
3987+ [%gate-wide at.e ~[%'|=('] %shut ks]
3192 ::
3988 ::
3193 %call
3989 %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)]]
3195 ::
3991 ::
3196 %gate
3992 %gate
3197 =/ ks=(list outline)
3993 =/ ks=(list outline)
3198 ~[(outline-sample sample.e) (outline-expr body.e)]
3994 ~[(outline-sample sample.e) (outline-expr body.e)]
3199− [%gate at.e ~[%'|='] ~ | ks]
3995+ [%gate at.e ~[%'|='] %kid ks]
3200 ::
3996 ::
3201 %cast
3997 %cast
3202 =/ ks=(list outline) ~[(outline-shape shape.e) (outline-expr val.e)]
3998 =/ ks=(list outline) ~[(outline-shape shape.e) (outline-expr val.e)]
3203− [%cast at.e ~[%'^-'] ~ | ks]
3999+ [%cast at.e ~[%'^-'] %kid ks]
3204 ::
4000 ::
3205 %trace
4001 %trace
3206 =/ ks=(list outline) ~[(outline-expr val.e) (outline-expr then.e)]
4002 =/ ks=(list outline) ~[(outline-expr val.e) (outline-expr then.e)]
3207− [%trace at.e ~[%'~&'] ~ | ks]
4003+ [%trace at.e ~[%'~&'] %kid ks]
3208 ::
4004 ::
3209 %branch
4005 %branch
3210 =/ ks=(list outline)
4006 =/ ks=(list outline)
3211 [(outline-expr subject.e) (turn arms.e outline-arm)]
4007 [(outline-expr subject.e) (turn arms.e outline-arm)]
3212− [%branch at.e ~[%'?-'] ~ | ks]
4008+ [%branch at.e ~[%'?-'] %kid ks]
3213 ::
4009 ::
3214 %body
4010 %body
3215 =/ ks=(list outline)
4011 =/ ks=(list outline)
3216 (snoc (turn defs.e outline-def) (outline-expr final.e))
4012 (snoc (turn defs.e outline-def) (outline-expr final.e))
3217− [%body at.e ~ ~ | ks]
4013+ [%body at.e ~ %kid ks]
3218 ==
4014 ==
3219::
4015::
3220++ outline-str
4016++ outline-str
@@ -3222,60 +4018,60 @@
3222 ^- outline
4018 ^- outline
3223 =/ ks=(list outline)
4019 =/ ks=(list outline)
3224 (murn ps |=(p=piece ?.(?=(%expr -.p) ~ `(outline-expr p.p))))
4020 (murn ps |=(p=piece ?.(?=(%expr -.p) ~ `(outline-expr p.p))))
3225− ?~ ks [%str at ~[%str] ~[%str] | ~]
4021+ ?~ ks [%str at ~[%str] %one ~]
3226− [%str at ~[%str-head] ~[%str-tail] | ks]
4022+ [%str at ~[%str-head] %string ks]
3227::
4023::
3228++ outline-item
4024++ outline-item
3229 |= i=item
4025 |= i=item
3230 ^- outline
4026 ^- outline
3231− ?~ face.i [%item at.i ~ ~ | ~[(outline-expr val.i)]]
4027+ ?~ face.i [%item at.i ~ %kid ~[(outline-expr val.i)]]
3232− [%face at.i ~[%name] ~ | ~[(outline-expr val.i)]]
4028+ [%face at.i ~[%name] %kid ~[(outline-expr val.i)]]
3233::
4029::
3234++ outline-edit
4030++ outline-edit
3235 |= e=edit
4031 |= e=edit
3236 ^- outline
4032 ^- outline
3237− [%edit at.e ~[%name] ~ | ~[(outline-expr val.e)]]
4033+ [%edit at.e ~[%name] %kid ~[(outline-expr val.e)]]
3238::
4034::
3239++ outline-arm
4035++ outline-arm
3240 |= a=arm
4036 |= a=arm
3241 ^- outline
4037 ^- 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)]]
3243::
4039::
3244++ outline-sample
4040++ outline-sample
3245 |= s=sample
4041 |= s=sample
3246 ^- outline
4042 ^- outline
3247 ?- -.s
4043 ?- -.s
3248− %bind [%bind at.s ~[%name] ~[%name] | ~]
4044+ %bind [%bind at.s ~[%name] %one ~]
3249− %face [%face at.s ~[%name] ~ | ~[(outline-shape shape.s)]]
4045+ %face [%face at.s ~[%name] %kid ~[(outline-shape shape.s)]]
3250− %pun [%pun at.s ~[%'='] ~[%name] | ~]
4046+ %pun [%pun at.s ~[%'='] %two ~]
3251− %cell [%cell at.s ~[%'['] ~[%']'] | (turn items.s outline-sample)]
4047+ %cell [%cell at.s ~[%'['] %shut (turn items.s outline-sample)]
3252− %bare [%bare at.s ~ ~ | ~[(outline-shape shape.s)]]
4048+ %bare [%bare at.s ~ %kid ~[(outline-shape shape.s)]]
3253 ==
4049 ==
3254::
4050::
3255++ outline-pattern
4051++ outline-pattern
3256 |= p=pattern
4052 |= p=pattern
3257 ^- outline
4053 ^- outline
3258 ?- -.p
4054 ?- -.p
3259− %lit [%lit at.p ~[%lit] ~[%lit] | ~]
4055+ %lit [%lit at.p ~[%lit] %one ~]
3260− %str [%str at.p ~[%str] ~[%str] | ~]
4056+ %str [%str at.p ~[%str] %one ~]
3261− %any [%any at.p ~[%'*'] ~[%'*'] | ~]
4057+ %any [%any at.p ~[%'*'] %one ~]
3262− %bind [%bind at.p ~[%name] ~[%name] | ~]
4058+ %bind [%bind at.p ~[%name] %one ~]
3263− %cell [%cell at.p ~[%'['] ~[%']'] | (turn items.p outline-pattern)]
4059+ %cell [%cell at.p ~[%'['] %shut (turn items.p outline-pattern)]
3264 ==
4060 ==
3265::
4061::
3266++ outline-shape
4062++ outline-shape
3267 |= s=shape
4063 |= s=shape
3268 ^- outline
4064 ^- outline
3269 ?- -.s
4065 ?- -.s
3270− %aura [%aura at.s ~[%aura] ~[%aura] | ~]
4066+ %aura [%aura at.s ~[%aura] %one ~]
3271− %noun [%noun at.s ~[%'*'] ~[%'*'] | ~]
4067+ %noun [%noun at.s ~[%'*'] %one ~]
3272− %void [%void at.s ~[%'!!'] ~[%'!!'] | ~]
4068+ %void [%void at.s ~[%'!!'] %one ~]
3273− %flag [%flag at.s ~[%'?'] ~[%'?'] | ~]
4069+ %flag [%flag at.s ~[%'?'] %one ~]
3274− %const [%const at.s ~[%lit] ~[%lit] | ~]
4070+ %const [%const at.s ~[%lit] %one ~]
3275− %ref [%ref at.s ~[%name %wing] ~[%name %wing] | ~]
4071+ %ref [%ref at.s ~[%name %wing] %one ~]
3276− %tvar [%tvar at.s ~[%tvar] ~[%tvar] | ~]
4072+ %tvar [%tvar at.s ~[%tvar] %one ~]
3277− %apply [%apply at.s ~[%'('] ~[%')'] | (turn args.s outline-shape)]
4073+ %apply [%apply at.s ~[%'('] %shut (turn args.s outline-shape)]
3278− %cell [%cell at.s ~[%'['] ~[%']'] | (turn fields.s outline-sample)]
4074+ %cell [%cell at.s ~[%'['] %shut (turn fields.s outline-sample)]
3279 ::
4075 ::
3280 %path
4076 %path
3281 =/ ks=(list outline)
4077 =/ ks=(list outline)
@@ -3283,19 +4079,100 @@
3283 |= g=pseg
4079 |= g=pseg
3284 ^- (unit outline)
4080 ^- (unit outline)
3285 ?. ?=(%typed -.g) ~
4081 ?. ?=(%typed -.g) ~
3286− `[%typed at.g ~[%'['] ~[%']'] | ~]
4082+ `[%typed at.g ~[%'['] %shut ~]
3287− [%path at.s ~[%'/'] ~[%'/' %knot %']'] & ks]
4083+ [%path at.s ~[%'/'] %run ks]
3288 ::
4084 ::
3289 %union
4085 %union
3290 =/ ks=(list outline) (turn cases.s outline-shape)
4086 =/ ks=(list outline) (turn cases.s outline-shape)
3291− [%union at.s ~[%'$?' %'$?('] ~[%')'] & ks]
4087+ [%union at.s ~[%'$?' %'$?('] %shut ks]
3292 ::
4088 ::
3293 %fn
4089 %fn
3294 =/ ks=(list outline)
4090 =/ ks=(list outline)
3295 ~[(outline-shape sample.s) (outline-shape product.s)]
4091 ~[(outline-shape sample.s) (outline-shape product.s)]
3296− [%fn at.s ~[%'$-('] ~[%')'] | ks]
4092+ [%fn at.s ~[%'$-('] %shut ks]
3297 ::
4093 ::
3298 %generic
4094 %generic
3299− [%generic at.s ~[%'|$'] ~ | ~[(outline-shape body.s)]]
4095+ [%generic at.s ~[%'|$'] %kid ~[(outline-shape body.s)]]
3300 ==
4096 ==
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)
3301--
4178--
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
2++ x $(n 1)
2++ 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
2++ x $(n 1)
2++ x $(n 1)
3 ^
3 ^
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)
2++ x %: f a b
2++ x %: f a b
3 ^
3 ^
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)
2++ x %: f a b
2++ x %: f a b
3 ^
3 ^
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
2++ x =< a b
2++ 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
2++ x =< a b
2++ x =< a b
3 ^
3 ^
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
2++ x => a b
2++ 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
2++ x => a b
2++ x => a b
3 ^
3 ^
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
2==
2==
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
2==
2==
3^
3^
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 @@
1source: 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 ;`
1source: 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 ;`
2tests: two brackets left open at the end of one line, `(` and `~[`
2tests: 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
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− (text "a")
2+++ x (column ~ ~[
3− ^
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
2++ x (state.cart |= %got)
2++ x (state.cart |= %got)
3 ^
3 ^
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)
2++ x (turn ps |= (p title.p))
2++ x (turn ps |= (p title.p))
3 ^
3 ^
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 @@
21::
21::
22/+ jibb
22/+ jibb
23/* src-1 %jibb /tests/golden/doc-core-02-update/source/jibb
23/* 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
24/* src-2 %jibb /tests/golden/doc-grammar-01-imports/source/jibb
26/* 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
25/* src-3 %jibb /tests/golden/doc-grammar-02-buttons/source/jibb
29/* 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
26/* src-4 %jibb /tests/golden/doc-grammar-03-view-day/source/jibb
32/* 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
27/* src-5 %jibb /tests/golden/doc-grammar-04-step/source/jibb
35/* 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
28/* src-6 %jibb /tests/golden/doc-grammar-06-cart-store/source/jibb
38/* 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
29/* src-7 %jibb /tests/golden/doc-grammar-07-basket/source/jibb
41/* 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
30/* src-8 %jibb /tests/golden/doc-overview-01-cmd-sub/source/jibb
44/* 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
31/* src-9 %jibb /tests/golden/doc-overview-02-theme/source/jibb
47/* 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
32/* src-10 %jibb /tests/golden/doc-overview-04-todo-api/source/jibb
50/* 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
33/* src-11 %jibb /tests/golden/doc-overview-08-about/source/jibb
53/* 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
34/* src-12 %jibb /tests/golden/doc-overview-09-blog-index/source/jibb
56/* 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
35/* src-13 %jibb /tests/golden/doc-overview-10-todo-list/source/jibb
59/* 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
36/* src-14 %jibb /tests/golden/doc-overview-11-index/source/jibb
62/* 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
37/* src-15 %jibb /tests/golden/inline-base32/source/jibb
65/* 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
38/* src-16 %jibb /tests/golden/inline-call/source/jibb
68/* 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
39/* src-17 %jibb /tests/golden/inline-cell/source/jibb
71/* 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
40/* src-18 %jibb /tests/golden/inline-change-done/source/jibb
74/* 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
41/* src-19 %jibb /tests/golden/inline-change-draft/source/jibb
77/* 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
42/* src-20 %jibb /tests/golden/inline-crash/source/jibb
80/* 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
43/* src-21 %jibb /tests/golden/inline-ctor-typed/source/jibb
83/* 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
44/* src-22 %jibb /tests/golden/inline-date/source/jibb
86/* 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
45/* src-23 %jibb /tests/golden/inline-decimal/source/jibb
89/* 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
46/* src-24 %jibb /tests/golden/inline-duration/source/jibb
92/* 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
47/* src-25 %jibb /tests/golden/inline-fold-mold/source/jibb
95/* 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
48/* src-26 %jibb /tests/golden/inline-gate-mold/source/jibb
98/* 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
49/* src-27 %jibb /tests/golden/inline-gate-samples/source/jibb
101/* 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
50/* src-28 %jibb /tests/golden/inline-gate-wide/source/jibb
104/* 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
51/* src-29 %jibb /tests/golden/inline-generic-mold/source/jibb
107/* 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
52/* src-30 %jibb /tests/golden/inline-hex/source/jibb
110/* 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
53/* src-31 %jibb /tests/golden/inline-import-mark-face-bad/source/jibb
113/* src-31 %jibb /tests/golden/inline-import-mark-face-bad/source/jibb
54−/* src-32 %jibb /tests/golden/inline-imports-after-definition/source/jibb
114+/* tok-31 %txt /tests/golden/inline-import-mark-face-bad/tokens/txt
55−/* src-33 %jibb /tests/golden/inline-island/source/jibb
115+/* tre-31 %txt /tests/golden/inline-import-mark-face-bad/tree/txt
56−/* src-34 %jibb /tests/golden/inline-kinds/source/jibb
116+/* src-32 %jibb /tests/golden/inline-import-root-bad/source/jibb
57−/* src-35 %jibb /tests/golden/inline-knot/source/jibb
117+/* tok-32 %txt /tests/golden/inline-import-root-bad/tokens/txt
58−/* src-36 %jibb /tests/golden/inline-leftout-barcab/source/jibb
118+/* tre-32 %txt /tests/golden/inline-import-root-bad/tree/txt
59−/* src-37 %jibb /tests/golden/inline-leftout-barcen/source/jibb
119+/* src-33 %jibb /tests/golden/inline-imports-after-definition/source/jibb
60−/* src-38 %jibb /tests/golden/inline-leftout-barhep/source/jibb
120+/* tok-33 %txt /tests/golden/inline-imports-after-definition/tokens/txt
61−/* src-39 %jibb /tests/golden/inline-leftout-bartar/source/jibb
121+/* tre-33 %txt /tests/golden/inline-imports-after-definition/tree/txt
62−/* src-40 %jibb /tests/golden/inline-leftout-buc-paren/source/jibb
122+/* src-34 %jibb /tests/golden/inline-island/source/jibb
63−/* src-41 %jibb /tests/golden/inline-leftout-buccen/source/jibb
123+/* tok-34 %txt /tests/golden/inline-island/tokens/txt
64−/* src-42 %jibb /tests/golden/inline-leftout-cencol/source/jibb
124+/* tre-34 %txt /tests/golden/inline-island/tree/txt
65−/* src-43 %jibb /tests/golden/inline-leftout-centis/source/jibb
125+/* src-35 %jibb /tests/golden/inline-kinds/source/jibb
66−/* src-44 %jibb /tests/golden/inline-leftout-colon-wing/source/jibb
126+/* tok-35 %txt /tests/golden/inline-kinds/tokens/txt
67−/* src-45 %jibb /tests/golden/inline-leftout-colsig/source/jibb
127+/* tre-35 %txt /tests/golden/inline-kinds/tree/txt
68−/* src-46 %jibb /tests/golden/inline-leftout-coltar/source/jibb
128+/* src-36 %jibb /tests/golden/inline-knot/source/jibb
69−/* src-47 %jibb /tests/golden/inline-leftout-dottar/source/jibb
129+/* tok-36 %txt /tests/golden/inline-knot/tokens/txt
70−/* src-48 %jibb /tests/golden/inline-leftout-dottis/source/jibb
130+/* tre-36 %txt /tests/golden/inline-knot/tree/txt
71−/* src-49 %jibb /tests/golden/inline-leftout-faslus/source/jibb
131+/* src-37 %jibb /tests/golden/inline-leftout-barcab/source/jibb
72−/* src-50 %jibb /tests/golden/inline-leftout-hephep/source/jibb
132+/* tok-37 %txt /tests/golden/inline-leftout-barcab/tokens/txt
73−/* src-51 %jibb /tests/golden/inline-leftout-kethep-wide/source/jibb
133+/* tre-37 %txt /tests/golden/inline-leftout-barcab/tree/txt
74−/* src-52 %jibb /tests/golden/inline-leftout-kettar/source/jibb
134+/* src-38 %jibb /tests/golden/inline-leftout-barcen/source/jibb
75−/* src-53 %jibb /tests/golden/inline-leftout-sail/source/jibb
135+/* tok-38 %txt /tests/golden/inline-leftout-barcen/tokens/txt
76−/* src-54 %jibb /tests/golden/inline-leftout-sigbar/source/jibb
136+/* tre-38 %txt /tests/golden/inline-leftout-barcen/tree/txt
77−/* src-55 %jibb /tests/golden/inline-leftout-signed-float-auras/source/jibb
137+/* src-39 %jibb /tests/golden/inline-leftout-barcen-2/source/jibb
78−/* src-56 %jibb /tests/golden/inline-leftout-tis-paren/source/jibb
138+/* tok-39 %txt /tests/golden/inline-leftout-barcen-2/tokens/txt
79−/* src-57 %jibb /tests/golden/inline-leftout-tisfas/source/jibb
139+/* tre-39 %txt /tests/golden/inline-leftout-barcen-2/tree/txt
80−/* src-58 %jibb /tests/golden/inline-leftout-tisgal/source/jibb
140+/* src-40 %jibb /tests/golden/inline-leftout-barcen-3/source/jibb
81−/* src-59 %jibb /tests/golden/inline-leftout-tisgar/source/jibb
141+/* tok-40 %txt /tests/golden/inline-leftout-barcen-3/tokens/txt
82−/* src-60 %jibb /tests/golden/inline-leftout-tistis/source/jibb
142+/* tre-40 %txt /tests/golden/inline-leftout-barcen-3/tree/txt
83−/* src-61 %jibb /tests/golden/inline-leftout-wutcol/source/jibb
143+/* src-41 %jibb /tests/golden/inline-leftout-barhep/source/jibb
84−/* src-62 %jibb /tests/golden/inline-leftout-wuthep-wide/source/jibb
144+/* tok-41 %txt /tests/golden/inline-leftout-barhep/tokens/txt
85−/* src-63 %jibb /tests/golden/inline-leftout-wutlus/source/jibb
145+/* tre-41 %txt /tests/golden/inline-leftout-barhep/tree/txt
86−/* src-64 %jibb /tests/golden/inline-leftout-wutzap/source/jibb
146+/* src-42 %jibb /tests/golden/inline-leftout-bartar/source/jibb
87−/* src-65 %jibb /tests/golden/inline-leftout-zap-not/source/jibb
147+/* tok-42 %txt /tests/golden/inline-leftout-bartar/tokens/txt
88−/* src-66 %jibb /tests/golden/inline-leftout-zapgar/source/jibb
148+/* tre-42 %txt /tests/golden/inline-leftout-bartar/tree/txt
89−/* src-67 %jibb /tests/golden/inline-list/source/jibb
149+/* src-43 %jibb /tests/golden/inline-leftout-buc-paren/source/jibb
90−/* src-68 %jibb /tests/golden/inline-list-parens/source/jibb
150+/* tok-43 %txt /tests/golden/inline-leftout-buc-paren/tokens/txt
91−/* src-69 %jibb /tests/golden/inline-literal-defaults/source/jibb
151+/* tre-43 %txt /tests/golden/inline-leftout-buc-paren/tree/txt
92−/* src-70 %jibb /tests/golden/inline-load-slug/source/jibb
152+/* src-44 %jibb /tests/golden/inline-leftout-buc-paren-2/source/jibb
93−/* src-71 %jibb /tests/golden/inline-local-names/source/jibb
153+/* tok-44 %txt /tests/golden/inline-leftout-buc-paren-2/tokens/txt
94−/* src-72 %jibb /tests/golden/inline-loobean/source/jibb
154+/* tre-44 %txt /tests/golden/inline-leftout-buc-paren-2/tree/txt
95−/* src-73 %jibb /tests/golden/inline-mark-digit/source/jibb
155+/* src-45 %jibb /tests/golden/inline-leftout-buccen/source/jibb
96−/* src-74 %jibb /tests/golden/inline-module-definitions/source/jibb
156+/* tok-45 %txt /tests/golden/inline-leftout-buccen/tokens/txt
97−/* src-75 %jibb /tests/golden/inline-mold-add/source/jibb
157+/* tre-45 %txt /tests/golden/inline-leftout-buccen/tree/txt
98−/* src-76 %jibb /tests/golden/inline-mold-any-empty/source/jibb
158+/* src-46 %jibb /tests/golden/inline-leftout-cencol/source/jibb
99−/* src-77 %jibb /tests/golden/inline-mold-atoms/source/jibb
159+/* tok-46 %txt /tests/golden/inline-leftout-cencol/tokens/txt
100−/* src-78 %jibb /tests/golden/inline-mold-constants/source/jibb
160+/* tre-46 %txt /tests/golden/inline-leftout-cencol/tree/txt
101−/* src-79 %jibb /tests/golden/inline-mold-containers/source/jibb
161+/* src-47 %jibb /tests/golden/inline-leftout-cenhep/source/jibb
102−/* src-80 %jibb /tests/golden/inline-mold-gate/source/jibb
162+/* tok-47 %txt /tests/golden/inline-leftout-cenhep/tokens/txt
103−/* src-81 %jibb /tests/golden/inline-mold-generic/source/jibb
163+/* tre-47 %txt /tests/golden/inline-leftout-cenhep/tree/txt
104−/* src-82 %jibb /tests/golden/inline-mold-opaque/source/jibb
164+/* src-48 %jibb /tests/golden/inline-leftout-centis/source/jibb
105−/* src-83 %jibb /tests/golden/inline-mold-paths/source/jibb
165+/* tok-48 %txt /tests/golden/inline-leftout-centis/tokens/txt
106−/* src-84 %jibb /tests/golden/inline-mold-records/source/jibb
166+/* tre-48 %txt /tests/golden/inline-leftout-centis/tree/txt
107−/* src-85 %jibb /tests/golden/inline-namespaces/source/jibb
167+/* src-49 %jibb /tests/golden/inline-leftout-colhep/source/jibb
108−/* src-86 %jibb /tests/golden/inline-no-operators/source/jibb
168+/* tok-49 %txt /tests/golden/inline-leftout-colhep/tokens/txt
109−/* src-87 %jibb /tests/golden/inline-no-subs/source/jibb
169+/* tre-49 %txt /tests/golden/inline-leftout-colhep/tree/txt
110−/* src-88 %jibb /tests/golden/inline-null/source/jibb
170+/* src-50 %jibb /tests/golden/inline-leftout-colon-wing/source/jibb
111−/* src-89 %jibb /tests/golden/inline-pair/source/jibb
171+/* tok-50 %txt /tests/golden/inline-leftout-colon-wing/tokens/txt
112−/* src-90 %jibb /tests/golden/inline-pairs-two-items/source/jibb
172+/* tre-50 %txt /tests/golden/inline-leftout-colon-wing/tree/txt
113−/* src-91 %jibb /tests/golden/inline-path/source/jibb
173+/* src-51 %jibb /tests/golden/inline-leftout-colsig/source/jibb
114−/* src-92 %jibb /tests/golden/inline-pattern-any/source/jibb
174+/* tok-51 %txt /tests/golden/inline-leftout-colsig/tokens/txt
115−/* src-93 %jibb /tests/golden/inline-pattern-cell/source/jibb
175+/* tre-51 %txt /tests/golden/inline-leftout-colsig/tree/txt
116−/* src-94 %jibb /tests/golden/inline-pattern-crash-arm/source/jibb
176+/* src-52 %jibb /tests/golden/inline-leftout-coltar/source/jibb
117−/* src-95 %jibb /tests/golden/inline-pattern-date-bad/source/jibb
177+/* tok-52 %txt /tests/golden/inline-leftout-coltar/tokens/txt
118−/* src-96 %jibb /tests/golden/inline-pattern-eq/source/jibb
178+/* tre-52 %txt /tests/golden/inline-leftout-coltar/tree/txt
119−/* src-97 %jibb /tests/golden/inline-pattern-head-tag/source/jibb
179+/* src-53 %jibb /tests/golden/inline-leftout-dottar/source/jibb
120−/* src-98 %jibb /tests/golden/inline-pattern-interpolated-bad/source/jibb
180+/* tok-53 %txt /tests/golden/inline-leftout-dottar/tokens/txt
121−/* src-99 %jibb /tests/golden/inline-pattern-list-bad/source/jibb
181+/* tre-53 %txt /tests/golden/inline-leftout-dottar/tree/txt
122−/* src-100 %jibb /tests/golden/inline-pattern-literals/source/jibb
182+/* src-54 %jibb /tests/golden/inline-leftout-dottis/source/jibb
123−/* src-101 %jibb /tests/golden/inline-pattern-loobean/source/jibb
183+/* tok-54 %txt /tests/golden/inline-leftout-dottis/tokens/txt
124−/* src-102 %jibb /tests/golden/inline-pattern-move-any/source/jibb
184+/* tre-54 %txt /tests/golden/inline-leftout-dottis/tree/txt
125−/* src-103 %jibb /tests/golden/inline-pattern-name/source/jibb
185+/* src-55 %jibb /tests/golden/inline-leftout-faslus/source/jibb
126−/* src-104 %jibb /tests/golden/inline-pattern-null/source/jibb
186+/* tok-55 %txt /tests/golden/inline-leftout-faslus/tokens/txt
127−/* src-105 %jibb /tests/golden/inline-pattern-pair-bad/source/jibb
187+/* tre-55 %txt /tests/golden/inline-leftout-faslus/tree/txt
128−/* src-106 %jibb /tests/golden/inline-pattern-tail-tag/source/jibb
188+/* src-56 %jibb /tests/golden/inline-leftout-hephep/source/jibb
129−/* src-107 %jibb /tests/golden/inline-pattern-term/source/jibb
189+/* tok-56 %txt /tests/golden/inline-leftout-hephep/tokens/txt
130−/* src-108 %jibb /tests/golden/inline-pattern-two-tags/source/jibb
190+/* tre-56 %txt /tests/golden/inline-leftout-hephep/tree/txt
131−/* src-109 %jibb /tests/golden/inline-pattern-unit/source/jibb
191+/* src-57 %jibb /tests/golden/inline-leftout-kethep-wide/source/jibb
132−/* src-110 %jibb /tests/golden/inline-qath/source/jibb
192+/* tok-57 %txt /tests/golden/inline-leftout-kethep-wide/tokens/txt
133−/* src-111 %jibb /tests/golden/inline-requests/source/jibb
193+/* tre-57 %txt /tests/golden/inline-leftout-kethep-wide/tree/txt
134−/* src-112 %jibb /tests/golden/inline-scry-case/source/jibb
194+/* src-58 %jibb /tests/golden/inline-leftout-kettar/source/jibb
135−/* src-113 %jibb /tests/golden/inline-self-reference/source/jibb
195+/* tok-58 %txt /tests/golden/inline-leftout-kettar/tokens/txt
136−/* src-114 %jibb /tests/golden/inline-ship/source/jibb
196+/* tre-58 %txt /tests/golden/inline-leftout-kettar/tree/txt
137−/* src-115 %jibb /tests/golden/inline-static-image/source/jibb
197+/* src-59 %jibb /tests/golden/inline-leftout-miccol/source/jibb
138−/* src-116 %jibb /tests/golden/inline-string/source/jibb
198+/* tok-59 %txt /tests/golden/inline-leftout-miccol/tokens/txt
139−/* src-117 %jibb /tests/golden/inline-tag-shape/source/jibb
199+/* tre-59 %txt /tests/golden/inline-leftout-miccol/tree/txt
140−/* src-118 %jibb /tests/golden/inline-term/source/jibb
200+/* src-60 %jibb /tests/golden/inline-leftout-sail/source/jibb
141−/* src-119 %jibb /tests/golden/inline-text-items/source/jibb
201+/* tok-60 %txt /tests/golden/inline-leftout-sail/tokens/txt
142−/* src-120 %jibb /tests/golden/inline-union-wide/source/jibb
202+/* tre-60 %txt /tests/golden/inline-leftout-sail/tree/txt
143−/* src-121 %jibb /tests/golden/inline-unit/source/jibb
203+/* src-61 %jibb /tests/golden/inline-leftout-sigbar/source/jibb
144−/* src-122 %jibb /tests/golden/inline-wide-form-rune-bad/source/jibb
204+/* tok-61 %txt /tests/golden/inline-leftout-sigbar/tokens/txt
145−/* src-123 %jibb /tests/golden/inline-wide-forms/source/jibb
205+/* tre-61 %txt /tests/golden/inline-leftout-sigbar/tree/txt
146−/* src-124 %jibb /tests/golden/inline-wide-union-call/source/jibb
206+/* src-62 %jibb /tests/golden/inline-leftout-signed-float-auras/source/jibb
147−/* src-125 %jibb /tests/golden/inline-wings/source/jibb
207+/* tok-62 %txt /tests/golden/inline-leftout-signed-float-auras/tokens/txt
148−/* src-126 %jibb /tests/golden/lex-base32-bad-1/source/jibb
208+/* tre-62 %txt /tests/golden/inline-leftout-signed-float-auras/tree/txt
149−/* src-127 %jibb /tests/golden/lex-base32-ok-1/source/jibb
209+/* src-63 %jibb /tests/golden/inline-leftout-sigpam-wide/source/jibb
150−/* src-128 %jibb /tests/golden/lex-call-open-bad-1/source/jibb
210+/* tok-63 %txt /tests/golden/inline-leftout-sigpam-wide/tokens/txt
151−/* src-129 %jibb /tests/golden/lex-call-open-bad-2/source/jibb
211+/* tre-63 %txt /tests/golden/inline-leftout-sigpam-wide/tree/txt
152−/* src-130 %jibb /tests/golden/lex-call-open-bad-3/source/jibb
212+/* src-64 %jibb /tests/golden/inline-leftout-tis-paren/source/jibb
153−/* src-131 %jibb /tests/golden/lex-call-open-ok-1/source/jibb
213+/* tok-64 %txt /tests/golden/inline-leftout-tis-paren/tokens/txt
154−/* src-132 %jibb /tests/golden/lex-cell-bad-1/source/jibb
214+/* tre-64 %txt /tests/golden/inline-leftout-tis-paren/tree/txt
155−/* src-133 %jibb /tests/golden/lex-cell-ok-1/source/jibb
215+/* src-65 %jibb /tests/golden/inline-leftout-tisfas/source/jibb
156−/* src-134 %jibb /tests/golden/lex-comment-bad-1/source/jibb
216+/* tok-65 %txt /tests/golden/inline-leftout-tisfas/tokens/txt
157−/* src-135 %jibb /tests/golden/lex-comment-ok-1/source/jibb
217+/* tre-65 %txt /tests/golden/inline-leftout-tisfas/tree/txt
158−/* src-136 %jibb /tests/golden/lex-comment-ok-2/source/jibb
218+/* src-66 %jibb /tests/golden/inline-leftout-tisgal/source/jibb
159−/* src-137 %jibb /tests/golden/lex-comment-ok-3/source/jibb
219+/* tok-66 %txt /tests/golden/inline-leftout-tisgal/tokens/txt
160−/* src-138 %jibb /tests/golden/lex-date-bad-1/source/jibb
220+/* tre-66 %txt /tests/golden/inline-leftout-tisgal/tree/txt
161−/* src-139 %jibb /tests/golden/lex-date-bad-2/source/jibb
221+/* src-67 %jibb /tests/golden/inline-leftout-tisgal-2/source/jibb
162−/* src-140 %jibb /tests/golden/lex-date-ok-1/source/jibb
222+/* tok-67 %txt /tests/golden/inline-leftout-tisgal-2/tokens/txt
163−/* src-141 %jibb /tests/golden/lex-decimal-bad-1/source/jibb
223+/* tre-67 %txt /tests/golden/inline-leftout-tisgal-2/tree/txt
164−/* src-142 %jibb /tests/golden/lex-decimal-bad-2/source/jibb
224+/* src-68 %jibb /tests/golden/inline-leftout-tisgar/source/jibb
165−/* src-143 %jibb /tests/golden/lex-decimal-ok-1/source/jibb
225+/* tok-68 %txt /tests/golden/inline-leftout-tisgar/tokens/txt
166−/* src-144 %jibb /tests/golden/lex-duration-bad-1/source/jibb
226+/* tre-68 %txt /tests/golden/inline-leftout-tisgar/tree/txt
167−/* src-145 %jibb /tests/golden/lex-duration-ok-1/source/jibb
227+/* src-69 %jibb /tests/golden/inline-leftout-tislus/source/jibb
168−/* src-146 %jibb /tests/golden/lex-hex-bad-1/source/jibb
228+/* tok-69 %txt /tests/golden/inline-leftout-tislus/tokens/txt
169−/* src-147 %jibb /tests/golden/lex-hex-ok-1/source/jibb
229+/* tre-69 %txt /tests/golden/inline-leftout-tislus/tree/txt
170−/* src-148 %jibb /tests/golden/lex-indent-bad-1/source/jibb
230+/* src-70 %jibb /tests/golden/inline-leftout-tistis/source/jibb
171−/* src-149 %jibb /tests/golden/lex-indent-bad-2/source/jibb
231+/* tok-70 %txt /tests/golden/inline-leftout-tistis/tokens/txt
172−/* src-150 %jibb /tests/golden/lex-indent-bad-3/source/jibb
232+/* tre-70 %txt /tests/golden/inline-leftout-tistis/tree/txt
173−/* src-151 %jibb /tests/golden/lex-indent-ok-1/source/jibb
233+/* src-71 %jibb /tests/golden/inline-leftout-wutcol/source/jibb
174−/* src-152 %jibb /tests/golden/lex-indent-ok-2/source/jibb
234+/* tok-71 %txt /tests/golden/inline-leftout-wutcol/tokens/txt
175−/* src-153 %jibb /tests/golden/lex-indent-ok-3/source/jibb
235+/* tre-71 %txt /tests/golden/inline-leftout-wutcol/tree/txt
176−/* src-154 %jibb /tests/golden/lex-interp-bad-1/source/jibb
236+/* src-72 %jibb /tests/golden/inline-leftout-wutcol-2/source/jibb
177−/* src-155 %jibb /tests/golden/lex-interp-bad-2/source/jibb
237+/* tok-72 %txt /tests/golden/inline-leftout-wutcol-2/tokens/txt
178−/* src-156 %jibb /tests/golden/lex-interp-bad-3/source/jibb
238+/* tre-72 %txt /tests/golden/inline-leftout-wutcol-2/tree/txt
179−/* src-157 %jibb /tests/golden/lex-interp-bad-4/source/jibb
239+/* src-73 %jibb /tests/golden/inline-leftout-wuthep-wide/source/jibb
180−/* src-158 %jibb /tests/golden/lex-interp-ok-1/source/jibb
240+/* tok-73 %txt /tests/golden/inline-leftout-wuthep-wide/tokens/txt
181−/* src-159 %jibb /tests/golden/lex-interp-ok-2/source/jibb
241+/* tre-73 %txt /tests/golden/inline-leftout-wuthep-wide/tree/txt
182−/* src-160 %jibb /tests/golden/lex-knot-bad-1/source/jibb
242+/* src-74 %jibb /tests/golden/inline-leftout-wutlus/source/jibb
183−/* src-161 %jibb /tests/golden/lex-knot-ok-1/source/jibb
243+/* tok-74 %txt /tests/golden/inline-leftout-wutlus/tokens/txt
184−/* src-162 %jibb /tests/golden/lex-layout-bad-1/source/jibb
244+/* tre-74 %txt /tests/golden/inline-leftout-wutlus/tree/txt
185−/* src-163 %jibb /tests/golden/lex-layout-bad-2/source/jibb
245+/* src-75 %jibb /tests/golden/inline-leftout-wutsig/source/jibb
186−/* src-164 %jibb /tests/golden/lex-layout-bad-3/source/jibb
246+/* tok-75 %txt /tests/golden/inline-leftout-wutsig/tokens/txt
187−/* src-165 %jibb /tests/golden/lex-layout-bad-4/source/jibb
247+/* tre-75 %txt /tests/golden/inline-leftout-wutsig/tree/txt
188−/* src-166 %jibb /tests/golden/lex-layout-ok-1/source/jibb
248+/* src-76 %jibb /tests/golden/inline-leftout-wutzap/source/jibb
189−/* src-167 %jibb /tests/golden/lex-list-bad-1/source/jibb
249+/* tok-76 %txt /tests/golden/inline-leftout-wutzap/tokens/txt
190−/* src-168 %jibb /tests/golden/lex-list-ok-1/source/jibb
250+/* tre-76 %txt /tests/golden/inline-leftout-wutzap/tree/txt
191−/* src-169 %jibb /tests/golden/lex-loobean-bad-1/source/jibb
251+/* src-77 %jibb /tests/golden/inline-leftout-zap-not/source/jibb
192−/* src-170 %jibb /tests/golden/lex-loobean-ok-1/source/jibb
252+/* tok-77 %txt /tests/golden/inline-leftout-zap-not/tokens/txt
193−/* src-171 %jibb /tests/golden/lex-name-bad-1/source/jibb
253+/* tre-77 %txt /tests/golden/inline-leftout-zap-not/tree/txt
194−/* src-172 %jibb /tests/golden/lex-name-bad-2/source/jibb
254+/* src-78 %jibb /tests/golden/inline-leftout-zapgar/source/jibb
195−/* src-173 %jibb /tests/golden/lex-name-bad-3/source/jibb
255+/* tok-78 %txt /tests/golden/inline-leftout-zapgar/tokens/txt
196−/* src-174 %jibb /tests/golden/lex-name-bad-4/source/jibb
256+/* tre-78 %txt /tests/golden/inline-leftout-zapgar/tree/txt
197−/* src-175 %jibb /tests/golden/lex-name-ok-1/source/jibb
257+/* src-79 %jibb /tests/golden/inline-list/source/jibb
198−/* src-176 %jibb /tests/golden/lex-null-bad-1/source/jibb
258+/* tok-79 %txt /tests/golden/inline-list/tokens/txt
199−/* src-177 %jibb /tests/golden/lex-null-ok-1/source/jibb
259+/* tre-79 %txt /tests/golden/inline-list/tree/txt
200−/* src-178 %jibb /tests/golden/lex-open-bracket-bad-1/source/jibb
260+/* src-80 %jibb /tests/golden/inline-list-parens/source/jibb
201−/* src-179 %jibb /tests/golden/lex-open-bracket-bad-2/source/jibb
261+/* tok-80 %txt /tests/golden/inline-list-parens/tokens/txt
202−/* src-180 %jibb /tests/golden/lex-open-bracket-bad-3/source/jibb
262+/* tre-80 %txt /tests/golden/inline-list-parens/tree/txt
203−/* src-181 %jibb /tests/golden/lex-open-bracket-bad-4/source/jibb
263+/* src-81 %jibb /tests/golden/inline-literal-defaults/source/jibb
204−/* src-182 %jibb /tests/golden/lex-open-bracket-ok-1/source/jibb
264+/* tok-81 %txt /tests/golden/inline-literal-defaults/tokens/txt
205−/* src-183 %jibb /tests/golden/lex-open-bracket-ok-2/source/jibb
265+/* tre-81 %txt /tests/golden/inline-literal-defaults/tree/txt
206−/* src-184 %jibb /tests/golden/lex-pair-binding-bad-1/source/jibb
266+/* src-82 %jibb /tests/golden/inline-load-slug/source/jibb
207−/* src-185 %jibb /tests/golden/lex-pair-binding-ok-1/source/jibb
267+/* tok-82 %txt /tests/golden/inline-load-slug/tokens/txt
208−/* src-186 %jibb /tests/golden/lex-path-bad-1/source/jibb
268+/* tre-82 %txt /tests/golden/inline-load-slug/tree/txt
209−/* src-187 %jibb /tests/golden/lex-path-ok-1/source/jibb
269+/* src-83 %jibb /tests/golden/inline-local-names/source/jibb
210−/* src-188 %jibb /tests/golden/lex-rune-layout-bad-1/source/jibb
270+/* tok-83 %txt /tests/golden/inline-local-names/tokens/txt
211−/* src-189 %jibb /tests/golden/lex-rune-layout-bad-2/source/jibb
271+/* tre-83 %txt /tests/golden/inline-local-names/tree/txt
212−/* src-190 %jibb /tests/golden/lex-rune-layout-bad-3/source/jibb
272+/* src-84 %jibb /tests/golden/inline-loobean/source/jibb
213−/* src-191 %jibb /tests/golden/lex-rune-layout-bad-4/source/jibb
273+/* tok-84 %txt /tests/golden/inline-loobean/tokens/txt
214−/* src-192 %jibb /tests/golden/lex-rune-layout-ok-1/source/jibb
274+/* tre-84 %txt /tests/golden/inline-loobean/tree/txt
215−/* src-193 %jibb /tests/golden/lex-ship-bad-1/source/jibb
275+/* src-85 %jibb /tests/golden/inline-mark-digit/source/jibb
216−/* src-194 %jibb /tests/golden/lex-ship-ok-1/source/jibb
276+/* tok-85 %txt /tests/golden/inline-mark-digit/tokens/txt
217−/* src-195 %jibb /tests/golden/lex-spacing-bad-1/source/jibb
277+/* tre-85 %txt /tests/golden/inline-mark-digit/tree/txt
218−/* src-196 %jibb /tests/golden/lex-spacing-bad-2/source/jibb
278+/* src-86 %jibb /tests/golden/inline-module-definitions/source/jibb
219−/* src-197 %jibb /tests/golden/lex-spacing-bad-3/source/jibb
279+/* tok-86 %txt /tests/golden/inline-module-definitions/tokens/txt
220−/* src-198 %jibb /tests/golden/lex-spacing-bad-4/source/jibb
280+/* tre-86 %txt /tests/golden/inline-module-definitions/tree/txt
221−/* src-199 %jibb /tests/golden/lex-spacing-ok-1/source/jibb
281+/* src-87 %jibb /tests/golden/inline-mold-add/source/jibb
222−/* src-200 %jibb /tests/golden/lex-string-bad-1/source/jibb
282+/* tok-87 %txt /tests/golden/inline-mold-add/tokens/txt
223−/* src-201 %jibb /tests/golden/lex-string-bad-2/source/jibb
283+/* tre-87 %txt /tests/golden/inline-mold-add/tree/txt
224−/* src-202 %jibb /tests/golden/lex-string-ok-1/source/jibb
284+/* src-88 %jibb /tests/golden/inline-mold-any-empty/source/jibb
225−/* src-203 %jibb /tests/golden/lex-term-bad-1/source/jibb
285+/* tok-88 %txt /tests/golden/inline-mold-any-empty/tokens/txt
226−/* src-204 %jibb /tests/golden/lex-term-bad-2/source/jibb
286+/* tre-88 %txt /tests/golden/inline-mold-any-empty/tree/txt
227−/* src-205 %jibb /tests/golden/lex-term-bad-3/source/jibb
287+/* src-89 %jibb /tests/golden/inline-mold-atoms/source/jibb
228−/* src-206 %jibb /tests/golden/lex-term-ok-1/source/jibb
288+/* tok-89 %txt /tests/golden/inline-mold-atoms/tokens/txt
229−/* src-207 %jibb /tests/golden/lex-tight-change-bad-1/source/jibb
289+/* tre-89 %txt /tests/golden/inline-mold-atoms/tree/txt
230−/* src-208 %jibb /tests/golden/lex-tight-change-bad-2/source/jibb
290+/* src-90 %jibb /tests/golden/inline-mold-constants/source/jibb
231−/* src-209 %jibb /tests/golden/lex-tight-change-ok-1/source/jibb
291+/* tok-90 %txt /tests/golden/inline-mold-constants/tokens/txt
232−/* src-210 %jibb /tests/golden/lex-tight-ctor-bad-1/source/jibb
292+/* tre-90 %txt /tests/golden/inline-mold-constants/tree/txt
233−/* src-211 %jibb /tests/golden/lex-tight-ctor-bad-2/source/jibb
293+/* src-91 %jibb /tests/golden/inline-mold-containers/source/jibb
234−/* src-212 %jibb /tests/golden/lex-tight-ctor-ok-1/source/jibb
294+/* tok-91 %txt /tests/golden/inline-mold-containers/tokens/txt
235−/* src-213 %jibb /tests/golden/lex-tight-opener-bad-1/source/jibb
295+/* tre-91 %txt /tests/golden/inline-mold-containers/tree/txt
236−/* src-214 %jibb /tests/golden/lex-tight-opener-bad-2/source/jibb
296+/* src-92 %jibb /tests/golden/inline-mold-gate/source/jibb
237−/* src-215 %jibb /tests/golden/lex-tight-opener-bad-3/source/jibb
297+/* tok-92 %txt /tests/golden/inline-mold-gate/tokens/txt
238−/* src-216 %jibb /tests/golden/lex-tight-opener-bad-4/source/jibb
298+/* tre-92 %txt /tests/golden/inline-mold-gate/tree/txt
239−/* src-217 %jibb /tests/golden/lex-tight-opener-ok-1/source/jibb
299+/* src-93 %jibb /tests/golden/inline-mold-generic/source/jibb
240−/* src-218 %jibb /tests/golden/lex-tight-pair-bad-1/source/jibb
300+/* tok-93 %txt /tests/golden/inline-mold-generic/tokens/txt
241−/* src-219 %jibb /tests/golden/lex-tight-pair-ok-1/source/jibb
301+/* tre-93 %txt /tests/golden/inline-mold-generic/tree/txt
242−/* src-220 %jibb /tests/golden/lex-tight-qath-bad-1/source/jibb
302+/* src-94 %jibb /tests/golden/inline-mold-opaque/source/jibb
243−/* src-221 %jibb /tests/golden/lex-tight-qath-bad-2/source/jibb
303+/* tok-94 %txt /tests/golden/inline-mold-opaque/tokens/txt
244−/* src-222 %jibb /tests/golden/lex-tight-qath-bad-3/source/jibb
304+/* tre-94 %txt /tests/golden/inline-mold-opaque/tree/txt
245−/* src-223 %jibb /tests/golden/lex-tight-qath-ok-1/source/jibb
305+/* src-95 %jibb /tests/golden/inline-mold-paths/source/jibb
246−/* src-224 %jibb /tests/golden/lex-tight-unit-bad-1/source/jibb
306+/* tok-95 %txt /tests/golden/inline-mold-paths/tokens/txt
247−/* src-225 %jibb /tests/golden/lex-tight-unit-ok-1/source/jibb
307+/* tre-95 %txt /tests/golden/inline-mold-paths/tree/txt
248−/* src-226 %jibb /tests/golden/lex-tight-wing-bad-1/source/jibb
308+/* src-96 %jibb /tests/golden/inline-mold-records/source/jibb
249−/* src-227 %jibb /tests/golden/lex-tight-wing-ok-1/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
250|%
782|%
251:: one arm per case
783:: one arm per case
252::
784::
253++ test-doc-core-02-update
785++ 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)
255++ test-doc-grammar-01-imports
787++ 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)
257++ test-doc-grammar-02-buttons
789++ 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)
259++ test-doc-grammar-03-view-day
791++ 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)
261++ test-doc-grammar-04-step
793++ 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)
263++ test-doc-grammar-06-cart-store
795++ 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)
265++ test-doc-grammar-07-basket
797++ 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)
267++ test-doc-overview-01-cmd-sub
799++ 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)
269++ test-doc-overview-02-theme
801++ 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)
271++ test-doc-overview-04-todo-api
803++ 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)
273++ test-doc-overview-08-about
805++ 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)
275++ test-doc-overview-09-blog-index
807++ 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)
277++ test-doc-overview-10-todo-list
809++ 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)
279++ test-doc-overview-11-index
811++ 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)
281++ test-inline-base32
813++ test-inline-base32
282− (check ~.inline-base32 src-15 ~ ~)
814+ (check ~.inline-base32 src-15 `tok-15 `tre-15)
283++ test-inline-call
815++ test-inline-call
284− (check ~.inline-call src-16 ~ ~)
816+ (check ~.inline-call src-16 `tok-16 `tre-16)
285++ test-inline-cell
817++ test-inline-cell
286− (check ~.inline-cell src-17 ~ ~)
818+ (check ~.inline-cell src-17 `tok-17 `tre-17)
287++ test-inline-change-done
819++ test-inline-change-done
288− (check ~.inline-change-done src-18 ~ ~)
820+ (check ~.inline-change-done src-18 `tok-18 `tre-18)
289++ test-inline-change-draft
821++ test-inline-change-draft
290− (check ~.inline-change-draft src-19 ~ ~)
822+ (check ~.inline-change-draft src-19 `tok-19 `tre-19)
291++ test-inline-crash
823++ test-inline-crash
292− (check ~.inline-crash src-20 ~ ~)
824+ (check ~.inline-crash src-20 `tok-20 `tre-20)
293++ test-inline-ctor-typed
825++ test-inline-ctor-typed
294− (check ~.inline-ctor-typed src-21 ~ ~)
826+ (check ~.inline-ctor-typed src-21 `tok-21 `tre-21)
295++ test-inline-date
827++ test-inline-date
296− (check ~.inline-date src-22 ~ ~)
828+ (check ~.inline-date src-22 `tok-22 `tre-22)
297++ test-inline-decimal
829++ test-inline-decimal
298− (check ~.inline-decimal src-23 ~ ~)
830+ (check ~.inline-decimal src-23 `tok-23 `tre-23)
299++ test-inline-duration
831++ test-inline-duration
300− (check ~.inline-duration src-24 ~ ~)
832+ (check ~.inline-duration src-24 `tok-24 `tre-24)
301++ test-inline-fold-mold
833++ test-inline-fold-mold
302− (check ~.inline-fold-mold src-25 ~ ~)
834+ (check ~.inline-fold-mold src-25 `tok-25 `tre-25)
303++ test-inline-gate-mold
835++ test-inline-gate-mold
304− (check ~.inline-gate-mold src-26 ~ ~)
836+ (check ~.inline-gate-mold src-26 `tok-26 `tre-26)
305++ test-inline-gate-samples
837++ test-inline-gate-samples
306− (check ~.inline-gate-samples src-27 ~ ~)
838+ (check ~.inline-gate-samples src-27 `tok-27 `tre-27)
307++ test-inline-gate-wide
839++ test-inline-gate-wide
308− (check ~.inline-gate-wide src-28 ~ ~)
840+ (check ~.inline-gate-wide src-28 `tok-28 `tre-28)
309++ test-inline-generic-mold
841++ test-inline-generic-mold
310− (check ~.inline-generic-mold src-29 ~ ~)
842+ (check ~.inline-generic-mold src-29 `tok-29 `tre-29)
311++ test-inline-hex
843++ test-inline-hex
312− (check ~.inline-hex src-30 ~ ~)
844+ (check ~.inline-hex src-30 `tok-30 `tre-30)
313++ test-inline-import-mark-face-bad
845++ 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)
315++ test-inline-imports-after-definition
849++ 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)
317++ test-inline-island
851++ test-inline-island
318− (check ~.inline-island src-33 ~ ~)
852+ (check ~.inline-island src-34 `tok-34 `tre-34)
319++ test-inline-kinds
853++ test-inline-kinds
320− (check ~.inline-kinds src-34 ~ ~)
854+ (check ~.inline-kinds src-35 `tok-35 `tre-35)
321++ test-inline-knot
855++ test-inline-knot
322− (check ~.inline-knot src-35 ~ ~)
856+ (check ~.inline-knot src-36 `tok-36 `tre-36)
323++ test-inline-leftout-barcab
857++ test-inline-leftout-barcab
324− (check ~.inline-leftout-barcab src-36 ~ ~)
858+ (check ~.inline-leftout-barcab src-37 `tok-37 `tre-37)
325++ test-inline-leftout-barcen
859++ 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)
327++ test-inline-leftout-barhep
865++ test-inline-leftout-barhep
328− (check ~.inline-leftout-barhep src-38 ~ ~)
866+ (check ~.inline-leftout-barhep src-41 `tok-41 `tre-41)
329++ test-inline-leftout-bartar
867++ test-inline-leftout-bartar
330− (check ~.inline-leftout-bartar src-39 ~ ~)
868+ (check ~.inline-leftout-bartar src-42 `tok-42 `tre-42)
331++ test-inline-leftout-buc-paren
869++ 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)
333++ test-inline-leftout-buccen
873++ test-inline-leftout-buccen
334− (check ~.inline-leftout-buccen src-41 ~ ~)
874+ (check ~.inline-leftout-buccen src-45 `tok-45 `tre-45)
335++ test-inline-leftout-cencol
875++ 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)
337++ test-inline-leftout-centis
879++ 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)
339++ test-inline-leftout-colon-wing
883++ 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)
341++ test-inline-leftout-colsig
885++ test-inline-leftout-colsig
342− (check ~.inline-leftout-colsig src-45 ~ ~)
886+ (check ~.inline-leftout-colsig src-51 `tok-51 `tre-51)
343++ test-inline-leftout-coltar
887++ test-inline-leftout-coltar
344− (check ~.inline-leftout-coltar src-46 ~ ~)
888+ (check ~.inline-leftout-coltar src-52 `tok-52 `tre-52)
345++ test-inline-leftout-dottar
889++ test-inline-leftout-dottar
346− (check ~.inline-leftout-dottar src-47 ~ ~)
890+ (check ~.inline-leftout-dottar src-53 `tok-53 `tre-53)
347++ test-inline-leftout-dottis
891++ test-inline-leftout-dottis
348− (check ~.inline-leftout-dottis src-48 ~ ~)
892+ (check ~.inline-leftout-dottis src-54 `tok-54 `tre-54)
349++ test-inline-leftout-faslus
893++ test-inline-leftout-faslus
350− (check ~.inline-leftout-faslus src-49 ~ ~)
894+ (check ~.inline-leftout-faslus src-55 `tok-55 `tre-55)
351++ test-inline-leftout-hephep
895++ test-inline-leftout-hephep
352− (check ~.inline-leftout-hephep src-50 ~ ~)
896+ (check ~.inline-leftout-hephep src-56 `tok-56 `tre-56)
353++ test-inline-leftout-kethep-wide
897++ 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)
355++ test-inline-leftout-kettar
899++ 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)
357++ test-inline-leftout-sail
903++ test-inline-leftout-sail
358− (check ~.inline-leftout-sail src-53 ~ ~)
904+ (check ~.inline-leftout-sail src-60 `tok-60 `tre-60)
359++ test-inline-leftout-sigbar
905++ test-inline-leftout-sigbar
360− (check ~.inline-leftout-sigbar src-54 ~ ~)
906+ (check ~.inline-leftout-sigbar src-61 `tok-61 `tre-61)
361++ test-inline-leftout-signed-float-auras
907++ 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)
363++ test-inline-leftout-tis-paren
911++ 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)
365++ test-inline-leftout-tisfas
913++ test-inline-leftout-tisfas
366− (check ~.inline-leftout-tisfas src-57 ~ ~)
914+ (check ~.inline-leftout-tisfas src-65 `tok-65 `tre-65)
367++ test-inline-leftout-tisgal
915++ 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)
369++ test-inline-leftout-tisgar
919++ 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)
371++ test-inline-leftout-tistis
923++ test-inline-leftout-tistis
372− (check ~.inline-leftout-tistis src-60 ~ ~)
924+ (check ~.inline-leftout-tistis src-70 `tok-70 `tre-70)
373++ test-inline-leftout-wutcol
925++ 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)
375++ test-inline-leftout-wuthep-wide
929++ 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)
377++ test-inline-leftout-wutlus
931++ 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)
379++ test-inline-leftout-wutzap
935++ test-inline-leftout-wutzap
380− (check ~.inline-leftout-wutzap src-64 ~ ~)
936+ (check ~.inline-leftout-wutzap src-76 `tok-76 `tre-76)
381++ test-inline-leftout-zap-not
937++ 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)
383++ test-inline-leftout-zapgar
939++ test-inline-leftout-zapgar
384− (check ~.inline-leftout-zapgar src-66 ~ ~)
940+ (check ~.inline-leftout-zapgar src-78 `tok-78 `tre-78)
385++ test-inline-list
941++ test-inline-list
386− (check ~.inline-list src-67 ~ ~)
942+ (check ~.inline-list src-79 `tok-79 `tre-79)
387++ test-inline-list-parens
943++ test-inline-list-parens
388− (check ~.inline-list-parens src-68 ~ ~)
944+ (check ~.inline-list-parens src-80 `tok-80 `tre-80)
389++ test-inline-literal-defaults
945++ test-inline-literal-defaults
390− (check ~.inline-literal-defaults src-69 ~ ~)
946+ (check ~.inline-literal-defaults src-81 `tok-81 `tre-81)
391++ test-inline-load-slug
947++ test-inline-load-slug
392− (check ~.inline-load-slug src-70 ~ ~)
948+ (check ~.inline-load-slug src-82 `tok-82 `tre-82)
393++ test-inline-local-names
949++ test-inline-local-names
394− (check ~.inline-local-names src-71 ~ ~)
950+ (check ~.inline-local-names src-83 `tok-83 `tre-83)
395++ test-inline-loobean
951++ test-inline-loobean
396− (check ~.inline-loobean src-72 ~ ~)
952+ (check ~.inline-loobean src-84 `tok-84 `tre-84)
397++ test-inline-mark-digit
953++ test-inline-mark-digit
398− (check ~.inline-mark-digit src-73 ~ ~)
954+ (check ~.inline-mark-digit src-85 `tok-85 `tre-85)
399++ test-inline-module-definitions
955++ test-inline-module-definitions
400− (check ~.inline-module-definitions src-74 ~ ~)
956+ (check ~.inline-module-definitions src-86 `tok-86 `tre-86)
401++ test-inline-mold-add
957++ test-inline-mold-add
402− (check ~.inline-mold-add src-75 ~ ~)
958+ (check ~.inline-mold-add src-87 `tok-87 `tre-87)
403++ test-inline-mold-any-empty
959++ 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)
405++ test-inline-mold-atoms
961++ test-inline-mold-atoms
406− (check ~.inline-mold-atoms src-77 ~ ~)
962+ (check ~.inline-mold-atoms src-89 `tok-89 `tre-89)
407++ test-inline-mold-constants
963++ test-inline-mold-constants
408− (check ~.inline-mold-constants src-78 ~ ~)
964+ (check ~.inline-mold-constants src-90 `tok-90 `tre-90)
409++ test-inline-mold-containers
965++ test-inline-mold-containers
410− (check ~.inline-mold-containers src-79 ~ ~)
966+ (check ~.inline-mold-containers src-91 `tok-91 `tre-91)
411++ test-inline-mold-gate
967++ test-inline-mold-gate
412− (check ~.inline-mold-gate src-80 ~ ~)
968+ (check ~.inline-mold-gate src-92 `tok-92 `tre-92)
413++ test-inline-mold-generic
969++ test-inline-mold-generic
414− (check ~.inline-mold-generic src-81 ~ ~)
970+ (check ~.inline-mold-generic src-93 `tok-93 `tre-93)
415++ test-inline-mold-opaque
971++ test-inline-mold-opaque
416− (check ~.inline-mold-opaque src-82 ~ ~)
972+ (check ~.inline-mold-opaque src-94 `tok-94 `tre-94)
417++ test-inline-mold-paths
973++ test-inline-mold-paths
418− (check ~.inline-mold-paths src-83 ~ ~)
974+ (check ~.inline-mold-paths src-95 `tok-95 `tre-95)
419++ test-inline-mold-records
975++ test-inline-mold-records
420− (check ~.inline-mold-records src-84 ~ ~)
976+ (check ~.inline-mold-records src-96 `tok-96 `tre-96)
421++ test-inline-namespaces
977++ test-inline-namespaces
422− (check ~.inline-namespaces src-85 ~ ~)
978+ (check ~.inline-namespaces src-97 `tok-97 `tre-97)
423++ test-inline-no-operators
979++ test-inline-no-operators
424− (check ~.inline-no-operators src-86 ~ ~)
980+ (check ~.inline-no-operators src-98 `tok-98 `tre-98)
425++ test-inline-no-subs
981++ test-inline-no-subs
426− (check ~.inline-no-subs src-87 ~ ~)
982+ (check ~.inline-no-subs src-99 `tok-99 `tre-99)
427++ test-inline-null
983++ test-inline-null
428− (check ~.inline-null src-88 ~ ~)
984+ (check ~.inline-null src-100 `tok-100 `tre-100)
429++ test-inline-pair
985++ test-inline-pair
430− (check ~.inline-pair src-89 ~ ~)
986+ (check ~.inline-pair src-101 `tok-101 `tre-101)
431++ test-inline-pairs-two-items
987++ 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)
433++ test-inline-path
989++ test-inline-path
434− (check ~.inline-path src-91 ~ ~)
990+ (check ~.inline-path src-103 `tok-103 `tre-103)
435++ test-inline-pattern-any
991++ test-inline-pattern-any
436− (check ~.inline-pattern-any src-92 ~ ~)
992+ (check ~.inline-pattern-any src-104 `tok-104 `tre-104)
437++ test-inline-pattern-cell
993++ test-inline-pattern-cell
438− (check ~.inline-pattern-cell src-93 ~ ~)
994+ (check ~.inline-pattern-cell src-105 `tok-105 `tre-105)
439++ test-inline-pattern-crash-arm
995++ 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)
441++ test-inline-pattern-date-bad
997++ 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)
443++ test-inline-pattern-eq
1001++ 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)
445++ test-inline-pattern-head-tag
1005++ 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)
447++ test-inline-pattern-interpolated-bad
1007++ 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)
449++ test-inline-pattern-list-bad
1009++ 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)
451++ test-inline-pattern-literals
1011++ test-inline-pattern-literals
452− (check ~.inline-pattern-literals src-100 ~ ~)
1012+ (check ~.inline-pattern-literals src-114 `tok-114 `tre-114)
453++ test-inline-pattern-loobean
1013++ test-inline-pattern-loobean
454− (check ~.inline-pattern-loobean src-101 ~ ~)
1014+ (check ~.inline-pattern-loobean src-115 `tok-115 `tre-115)
455++ test-inline-pattern-move-any
1015++ 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)
457++ test-inline-pattern-name
1017++ test-inline-pattern-name
458− (check ~.inline-pattern-name src-103 ~ ~)
1018+ (check ~.inline-pattern-name src-117 `tok-117 `tre-117)
459++ test-inline-pattern-null
1019++ test-inline-pattern-null
460− (check ~.inline-pattern-null src-104 ~ ~)
1020+ (check ~.inline-pattern-null src-118 `tok-118 `tre-118)
461++ test-inline-pattern-pair-bad
1021++ 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)
463++ test-inline-pattern-tail-tag
1023++ 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)
465++ test-inline-pattern-term
1025++ test-inline-pattern-term
466− (check ~.inline-pattern-term src-107 ~ ~)
1026+ (check ~.inline-pattern-term src-121 `tok-121 `tre-121)
467++ test-inline-pattern-two-tags
1027++ 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)
469++ test-inline-pattern-unit
1029++ test-inline-pattern-unit
470− (check ~.inline-pattern-unit src-109 ~ ~)
1030+ (check ~.inline-pattern-unit src-123 `tok-123 `tre-123)
471++ test-inline-qath
1031++ test-inline-qath
472− (check ~.inline-qath src-110 ~ ~)
1032+ (check ~.inline-qath src-124 `tok-124 `tre-124)
473++ test-inline-requests
1033++ test-inline-requests
474− (check ~.inline-requests src-111 ~ ~)
1034+ (check ~.inline-requests src-125 `tok-125 `tre-125)
475++ test-inline-scry-case
1035++ test-inline-scry-case
476− (check ~.inline-scry-case src-112 ~ ~)
1036+ (check ~.inline-scry-case src-126 `tok-126 `tre-126)
477++ test-inline-self-reference
1037++ test-inline-self-reference
478− (check ~.inline-self-reference src-113 ~ ~)
1038+ (check ~.inline-self-reference src-127 `tok-127 `tre-127)
479++ test-inline-ship
1039++ test-inline-ship
480− (check ~.inline-ship src-114 ~ ~)
1040+ (check ~.inline-ship src-128 `tok-128 `tre-128)
481++ test-inline-static-image
1041++ test-inline-static-image
482− (check ~.inline-static-image src-115 ~ ~)
1042+ (check ~.inline-static-image src-129 `tok-129 `tre-129)
483++ test-inline-string
1043++ test-inline-string
484− (check ~.inline-string src-116 ~ ~)
1044+ (check ~.inline-string src-130 `tok-130 `tre-130)
485++ test-inline-tag-shape
1045++ test-inline-tag-shape
486− (check ~.inline-tag-shape src-117 ~ ~)
1046+ (check ~.inline-tag-shape src-131 `tok-131 `tre-131)
487++ test-inline-term
1047++ test-inline-term
488− (check ~.inline-term src-118 ~ ~)
1048+ (check ~.inline-term src-132 `tok-132 `tre-132)
489++ test-inline-text-items
1049++ test-inline-text-items
490− (check ~.inline-text-items src-119 ~ ~)
1050+ (check ~.inline-text-items src-133 `tok-133 `tre-133)
491++ test-inline-union-wide
1051++ test-inline-union-wide
492− (check ~.inline-union-wide src-120 ~ ~)
1052+ (check ~.inline-union-wide src-134 `tok-134 `tre-134)
493++ test-inline-unit
1053++ test-inline-unit
494− (check ~.inline-unit src-121 ~ ~)
1054+ (check ~.inline-unit src-135 `tok-135 `tre-135)
495++ test-inline-wide-form-rune-bad
1055++ 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)
497++ test-inline-wide-forms
1057++ test-inline-wide-forms
498− (check ~.inline-wide-forms src-123 ~ ~)
1058+ (check ~.inline-wide-forms src-137 `tok-137 `tre-137)
499++ test-inline-wide-union-call
1059++ 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)
501++ test-inline-wings
1061++ test-inline-wings
502− (check ~.inline-wings src-125 ~ ~)
1062+ (check ~.inline-wings src-139 `tok-139 `tre-139)
503++ test-lex-base32-bad-1
1063++ 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)
505++ test-lex-base32-ok-1
1065++ 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)
507++ test-lex-call-open-bad-1
1069++ 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)
509++ test-lex-call-open-bad-2
1071++ 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)
511++ test-lex-call-open-bad-3
1073++ 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)
513++ test-lex-call-open-ok-1
1075++ 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)
515++ test-lex-cell-bad-1
1077++ 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)
517++ test-lex-cell-ok-1
1079++ 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)
519++ test-lex-comment-bad-1
1089++ 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)
521++ test-lex-comment-ok-1
1091++ 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)
523++ test-lex-comment-ok-2
1093++ 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)
525++ test-lex-comment-ok-3
1095++ 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)
527++ test-lex-date-bad-1
1097++ 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)
529++ test-lex-date-bad-2
1099++ 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)
531++ test-lex-date-ok-1
1103++ 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)
533++ test-lex-decimal-bad-1
1105++ 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)
535++ test-lex-decimal-bad-2
1107++ 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)
537++ test-lex-decimal-ok-1
1109++ 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)
539++ test-lex-duration-bad-1
1111++ 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)
541++ test-lex-duration-ok-1
1115++ 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)
543++ test-lex-hex-bad-1
1117++ 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)
545++ test-lex-hex-ok-1
1119++ 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)
547++ test-lex-indent-bad-1
1121++ 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)
549++ test-lex-indent-bad-2
1123++ 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)
551++ test-lex-indent-bad-3
1125++ 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)
553++ test-lex-indent-ok-1
1127++ 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)
555++ test-lex-indent-ok-2
1129++ 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)
557++ test-lex-indent-ok-3
1131++ 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)
559++ test-lex-interp-bad-1
1133++ 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)
561++ test-lex-interp-bad-2
1135++ 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)
563++ test-lex-interp-bad-3
1137++ 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)
565++ test-lex-interp-bad-4
1139++ 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)
567++ test-lex-interp-ok-1
1141++ 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)
569++ test-lex-interp-ok-2
1143++ 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)
571++ test-lex-knot-bad-1
1145++ 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)
573++ test-lex-knot-ok-1
1147++ 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)
575++ test-lex-layout-bad-1
1149++ 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)
577++ test-lex-layout-bad-2
1151++ 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)
579++ test-lex-layout-bad-3
1153++ 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)
581++ test-lex-layout-bad-4
1155++ 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)
583++ test-lex-layout-ok-1
1157++ 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)
585++ test-lex-list-bad-1
1159++ 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)
587++ test-lex-list-ok-1
1161++ 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)
589++ test-lex-loobean-bad-1
1163++ 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)
591++ test-lex-loobean-ok-1
1165++ 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)
593++ test-lex-name-bad-1
1167++ 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)
595++ test-lex-name-bad-2
1169++ 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)
597++ test-lex-name-bad-3
1171++ 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)
599++ test-lex-name-bad-4
1173++ 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)
601++ test-lex-name-ok-1
1179++ 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)
603++ test-lex-null-bad-1
1181++ 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)
605++ test-lex-null-ok-1
1183++ 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)
607++ test-lex-open-bracket-bad-1
1185++ 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)
609++ test-lex-open-bracket-bad-2
1187++ 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)
611++ test-lex-open-bracket-bad-3
1189++ 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)
613++ test-lex-open-bracket-bad-4
1191++ 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)
615++ test-lex-open-bracket-ok-1
1195++ 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)
617++ test-lex-open-bracket-ok-2
1197++ 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)
619++ test-lex-pair-binding-bad-1
1199++ 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)
621++ test-lex-pair-binding-ok-1
1201++ 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)
623++ test-lex-path-bad-1
1203++ 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)
625++ test-lex-path-ok-1
1205++ 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)
627++ test-lex-rune-layout-bad-1
1207++ 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)
629++ test-lex-rune-layout-bad-2
1209++ 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)
631++ test-lex-rune-layout-bad-3
1211++ 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)
633++ test-lex-rune-layout-bad-4
1213++ 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)
635++ test-lex-rune-layout-ok-1
1215++ 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)
637++ test-lex-ship-bad-1
1217++ 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)
639++ test-lex-ship-ok-1
1219++ 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)
641++ test-lex-spacing-bad-1
1221++ 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)
643++ test-lex-spacing-bad-2
1223++ 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)
645++ test-lex-spacing-bad-3
1225++ 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)
647++ test-lex-spacing-bad-4
1227++ 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)
649++ test-lex-spacing-ok-1
1229++ 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)
651++ test-lex-string-bad-1
1231++ 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)
653++ test-lex-string-bad-2
1233++ 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)
655++ test-lex-string-ok-1
1235++ 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)
657++ test-lex-term-bad-1
1237++ 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)
659++ test-lex-term-bad-2
1239++ 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)
661++ test-lex-term-bad-3
1241++ 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)
663++ test-lex-term-ok-1
1243++ 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)
665++ test-lex-tight-change-bad-1
1245++ 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)
667++ test-lex-tight-change-bad-2
1247++ 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)
669++ test-lex-tight-change-ok-1
1249++ 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)
671++ test-lex-tight-ctor-bad-1
1251++ 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)
673++ test-lex-tight-ctor-bad-2
1253++ 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)
675++ test-lex-tight-ctor-ok-1
1255++ 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)
677++ test-lex-tight-opener-bad-1
1257++ 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)
679++ test-lex-tight-opener-bad-2
1259++ 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)
681++ test-lex-tight-opener-bad-3
1261++ 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)
683++ test-lex-tight-opener-bad-4
1263++ 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)
685++ test-lex-tight-opener-ok-1
1265++ 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)
687++ test-lex-tight-pair-bad-1
1267++ 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)
689++ test-lex-tight-pair-ok-1
1273++ 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)
691++ test-lex-tight-qath-bad-1
1275++ 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)
693++ test-lex-tight-qath-bad-2
1277++ 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)
695++ test-lex-tight-qath-bad-3
1279++ 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)
697++ test-lex-tight-qath-ok-1
1281++ 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)
699++ test-lex-tight-unit-bad-1
1283++ 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)
701++ test-lex-tight-unit-ok-1
1285++ 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)
703++ test-lex-tight-wing-bad-1
1287++ 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)
705++ test-lex-tight-wing-ok-1
1289++ 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)
707::
1291::
708:: +check: run golden:jibb on a case and compare both outputs
1292:: +check: run golden:jibb on a case and compare both outputs
709::
1293::
tools/hoon+10−1
@@ -71,7 +71,16 @@ def cord_binding(spec):
71 data = f.read()
71 data = f.read()
72 except OSError as e:
72 except OSError as e:
73 raise ue.ToolError('--cord %s: %s' % (spec, e.strerror))
73 raise ue.ToolError('--cord %s: %s' % (spec, e.strerror))
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
74− return '=/ %s=@t %s' % (name, ue.cord_literal(data)), name
82+ cords = ' '.join(ue.cord_literal(l) for l in lines)
83+ return '=/ %s=@t (rap 3 `(list @t)`~[%s])' % (name, cords), name
75
84
76
85
77def main(argv):
86def main(argv):