如何解决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
匹配了。因此出现解析错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。