Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

被拒形态

不是每一种看起来合理的形态都能 parse。下面的情形都是有意拒收:parser 宁可拒收一个有歧义的咒文,也不会替你猜。

上下文头

你写的为什么失败
:( :)(无 parentRoot node must have a parent
:( foo: 1 :)同上:缺 parent
:( parent: r world: w :)(多属性单行)属性 >1 时必须多行

没 body 的 if / walk / @niche / match

if cond                /* parse error: body required */
walk it with x         /* parse error */
@slot                  /* parse error */
match e                /* parse error */

控制节点没 body 等于空操作。parser 宁可直接拒绝,不会默许这种形同摆设的语法落地。

on 的几种被拒形态

被拒的写法原因
on Tap { … } 写在 root,前面没部件on 必须有一个兄弟部件可附着
on Tap call_me() {}处理器要么 body 块、要么 (args) 形态,不能裸调用
on Foo::Bar::Baz { … }限定段只允许一段
on Tap 既无 body 又无 args处理器至少要带其中一种

壁龛名是单 ident

@foo::bar { } 不会 parse:壁龛名是单一 syn::Identmatch 里的模式则用 Pat::parse_multi_with_leading_vert 解析,凡 syn 在普通 match arm 里接受的,这里都接受。

什么不是

部件无子节点合法,header (text: "x")header (text: "x") {} 解析结果相同。部件不带括号也合法,container {} 是零属性零子节点。这些形态都对,读者有时会误以为不行。

这些拒收用例藏在哪

每条 error case 在 crates/xrune_nexus/src/tests.rs 里都有一条单测。测试名以 error_* 起头:真正的 ui! 块 parse 失败、错误消息一时又看不出端倪时,那卷 tests.rs 是个好去处。