PEGjs 语法星号 (*) 未按预期匹配

PEGjs grammar star (*) not matching as expected

我有这个词位:

a().length()

还有这个 PEGjs 语法:

start = func_call

func_call = header "(" ")"

header = "a" suffix*

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

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

Input parsed successfully.

但是,如果我在后缀生产的末尾添加一个星号,就像这样:

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

然后输入解析失败:

Line 1, column 13: Expected "(" or "." but end of input found.

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

expression * Match zero or more repetitions of the expression and return their match results in an array. The matching is greedy

这应该是 "." "length" 的贪婪匹配,应该匹配一次。但相反,它根本不匹配。这与在header中嵌套使用*有关吗?

* 匹配 零次 次或更多次操作数,如您所说。

所以当你写

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

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

因此,suffix*(在header中)可以将().length()匹配为suffix的两次重复,首先是().length,然后是().那将是贪心匹配,这是 PEG 的 作案手法

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