x.c:12 is a path, never the scheme x.cRuled 2026-09-18 (gritzko): a URI scheme can have no dots. RFC 3986 §3.1 allows them, so abc/URI.lex:34 reads the bare link x.c:12 as scheme x.c plus path 12, and a link that reaches the URI parser loses its file. No scheme we use is dotted; the registered ones (soap.beep, iris.beep, z39.50r) are dead weight. The grammar sits in the abc/ submodule (libabc) and serves every runtime.
abc/URI.lex:34 Scheme = (alpha ( alpha | digit | "+" | "-" | "." )*) ':'; its ragel twin is abc/URI.c.rl:240.abc/URI.lex:30 PathNoscheme = segment_nz_nc …: a relative ref's first segment takes no colon (RFC 3986 §4.2).uri._parse("x.c:name") gives {scheme:"x.c", path:"name"}, x.c:12 the same shape../x.c:12 and dir/x.c:12 parse as plain paths already: only a bare name.ext:anchor collides.[t](x.c:12) goes through uri._parse and comes out verbatim, a dead href.Scheme loses the ".": x.c:12, HUNK.c:HUNKu8sMakeURI and a.b.c:'x' carry no scheme.malformed, which dropping the dot alone would do.foo:bar, mailto:x@y.z, spot:.c#body, be://host/x?ref and http://h:80/p parse exactly as today.abc/test/URI.c: the dotted cases red, the undotted ones pinned green before the change.abc/URI.md and the INDEX entry say the scheme is dotless and why; the twin is regenerated, never hand-edited.URI.lex stays the one source of the grammar, whatever generates URI.c.rl from it is rerun.be, bee, beagle-ext, jab): none is expected, a hit is a finding.abc/URI.lex:28 segment_nz_dc = (path_char - (":"|"."))* "." (path_char - ":")* ":" path_char*.. before its first :, and a : after it; PathNoscheme (:31) takes it beside segment_nz_nc.segment_nz_dc demands one, segment_nz_nc takes no colon.URIonPathNoscheme (abc/URI.c:10).a.b://host/p is a PATH holding the whole text: with no scheme there is no authority, and //host/p is plain segments.F tokens to tok.link); it is for text that reaches the URI parser anyway.abc/test/URI.c: dotted heads red, the undotted pins greenURI.lex: the dotless scheme, the dotted-head path rule; the twin regeneratedabc/URI.md, INDEX entryabc/test/URI.c URITestDotlessScheme pins 18 rows; the 11 undotted ones passed before the grammar moved, the 7 dotted failed.dog/build/abc/lex URI c, then ragel -C URI.c.rl -o URI.rl.c -L.lex is otherwise byte-stable: the URI.c.rl diff is the two rules plus the action-index renumbering they shift..lex has no comment syntax (abc/LEX.lex:17 Line), so the why lives in abc/URI.md and the INDEX entry, not in the grammar.file, be, keeper, spot, grep, du, work.uri._parse("x.c:name") gives {path:"x.c:name"}, so [t](x.c:12) is a live href now.JABCbass times out pre-existing); bee 79/79 before and after.abc/URI.lex:33 drivePath is dead weight, no rule references it.