PEGjs 语法星 (*) 与预期不匹配

问题描述

我有这个词素:

extract(r_raster,sp,fun=mean,na.rm=T,weights=TRUE)
#     ra rb
#[1,] 10 35
#[2,] 10 35
#[3,] 10 35

extract(r_terra,sv,weights=TRUE)
#     ID ra rb
#[1,]  1 10 35
#[2,]  2 10 35
#[3,]  3 10 35

还有这个 PEGjs 语法:

install.packages('terra',repos='https://rspatial.r-universe.dev')

在语法中,我正在解析一个函数调用。这目前正在解析,您可以try online in the PEGjs playground

输入解析成功。

但是,如果我在后缀产生式的末尾添加一个星号,如下所示:

a().length()

然后输入解析失败:

第 1 行,第 13 列:应为“(”或“.”,但发现输入结束。

我不明白为什么。来自the documentation

expression * 匹配零个或多个重复的表达式,并在数组中返回它们的匹配结果。匹配是贪婪的

这应该是 start = func_call func_call = header "(" ")" header = "a" suffix* suffix = "(" ")" ("." "length") 的贪婪匹配,应该匹配一次。但相反,它根本不匹配。这与 suffix = "(" ")" ("." "length")* "." "length" 的嵌套使用有关吗?

解决方法

* 匹配 个或更多重复的操作数,如您所说。

所以当你写

suffix = "(" ")" ("." "length")*

您是说后缀是 () 后跟 或多次重复的 .length。因此它可能是 (),它的重复次数为零。

因此,suffix• 可以匹配 ().length() 作为 suffix 的两次重复,首先是 ().length,然后是 ()。那将是贪婪匹配,这是 PEG 的操作方式

但在那之后,就没有 () 可以被 func_call 匹配了。因此出现解析错误。