使用语法在没有前瞻的情况下解析字符串?

Ste*_*ieD 4 grammar raku

得到这样的文字:

Want this || Not this

该行也可能如下所示:

Want this | Not this

用一根管子。

我使用这个语法来解析它:

    grammar HC {
       token TOP {  <pre> <divider> <post> }
       token pre { \N*? <?before <divider>> }
       token divider { <[|]> ** 1..2 } 
       token post { \N* }
    } 

Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?我很乐意能够做更多这样的事情:

    grammar HC {
       token TOP {  <pre> <divider> <post> }
       token pre { \N*? }
       token divider { <[|]> ** 1..2 }
       token post { \N* }
    } 

Run Code Online (Sandbox Code Playgroud)

但这是行不通的。如果我这样做:

    grammar HC {
       token TOP {  <pre>* <divider> <post> }
       token pre { \N }
       token divider { <[|]> ** 1..2 } }
       token post { \N* }
    } 

Run Code Online (Sandbox Code Playgroud)

分隔符之前的每个字符都有自己的<pre>捕获。谢谢。

rai*_*iph 7

一如既往,蒂姆托威迪。

我很想能够做更多这样的事情

你可以。只需将前两个规则声明从 切换tokenregex

grammar HC {
  regex TOP {  <pre> <divider> <post> }
  regex pre { \N*? }
  token divider { <[|]> ** 1..2 }
  token post { \N* }
} 
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为regex禁用:ratchettokenrule启用它不同)。

(解释为什么你需要关闭这两条规则超出了我的工资水平,当然是今晚,而且很可能直到其他人向我解释原因,这样我就可以假装我一直都知道。)

如果我这样做...每个角色都有自己的<pre>捕获

默认情况下,“调用命名正则表达式会安装具有相同名称的命名捕获” [...稍后几句话:]“如果不需要捕获,则前导点或与号将抑制它”。所以<pre>改成<.pre>.

接下来,您可以通过将模式包装$<name>=[pattern]在. 因此,要捕获与规则的连续调用匹配的整个字符串pre,请将捕获模式 ( <.pre>*?) 包装在$<pre>=[...]) 中:

grammar HC {
       token TOP { $<pre>=[<.pre>*?] <divider> <post> }
       token pre { \N }
       token divider { <[|]> ** 1..2 }
       token post { \N* }
    } 
Run Code Online (Sandbox Code Playgroud)