使用 Pest.rs,如何向树添加捕获?

问题描述

假设我有这样的规则,

conf = { SOI ~ ("FOO" ~ "BAR"?) ~ NEWLINE ~ EOI }

这将产生一个不区分“FOO”和“FOOBAR”的树,

Pair {
    rule: conf,span: Span {
        str: "FOOBAR\n",start: 0,end: 7,},inner: [
        Pair {
            rule: EOI,span: Span {
                str: "",start: 7,inner: [],],}

然而,这不是我想要的,我想要的是这样一棵树,

Pair {
    rule: conf,inner: [
        Pair {
            rule: term,span: Span {
                str: "FOOBAR",end: 6,Pair {
            rule: EOI,}

我可以用这个制作,

term = { "FOO" ~ "BAR"? }
conf = { SOI ~ term ~ NEWLINE ~ EOI }

但我实际上并不想为此指定 term,我希望能够内联规范。我想这样做是因为本质上我试图模拟这些条件,ifdef,ifndef,elifdef,elifndef,else,and endif。并且更干净地说,

conditional = {
  ( "ifndef" | "ifdef" ) ~ conditional_block
  ( ( "elifndef" | "elifdef" ) ~ conditional_block )?
  ( "else" ~ conditional_block )?
}

然后对每个ifdefifndef进行建模;和 elifdefelifndef 作为两个单独的标记,只会在那里使用。

_if      = { ".ifndef" | ".ifdef" }
_elseif  = { ".elifndef" | ".elifdef" }
_else    = { ".else" }
_endif   = { ".endif" }
conditional = {
  _if ~ conditional_block
  ~ ( _elseif ~ conditional_block )?
  ~ ( _else ~ conditional_block )?
  ~ _endif
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)