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
匹配了。因此出现解析错误。
我有这个词位:
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
匹配了。因此出现解析错误。