如何提交 Raku 语法标记中的交替分支?

VZ.*_*VZ. 9 grammar raku

假设我有一个包含以下标记的语法

token paragraph {
    (
        || <header>
        || <regular>
    )

    \n
}

token header { ^^ '---' '+'**1..5 ' ' \N+ }
token regular { \N+ }
Run Code Online (Sandbox Code Playgroud)

问题是,以 开头的行将---++Foo被解析为常规段落,因为“Foo”之前没有空格。在这种情况下,我想使解析失败,即以某种方式“提交”到该交替分支,例如在看到---我想要成功解析标头或完全失败匹配之后。

我怎样才能做到这一点?我看到的唯一方法是在之前使用否定先行断言来<regular>检查它是否不以 开头---,但这看起来相当丑陋且不切实际,考虑到我的实际语法不仅仅只有这两个分支。有更好的办法吗?提前致谢!

CIA*_*ash 5

如果我正确理解你的问题,你可以这样做:

token header {
    ^^ '---' [
                 || '+'**1..5 ' ' \N+
                 || { die "match failed near position $/.pos()" }
             ]
}
Run Code Online (Sandbox Code Playgroud)