【问题标题】:PEGjs grammar star (*) not matching as expectedPEGjs 语法星号 (*) 与预期不匹配
【发布时间】:2021-05-24 03:02:26
【问题描述】:

我有这个词位:

a().length()

还有这个 PEGjs 语法:

start = func_call

func_call = header "(" ")"

header = "a" suffix*

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

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

输入解析成功。

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

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

然后输入解析失败:

第 1 行第 13 列:应为“(”或“.”,但找到了输入结尾。

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

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

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

【问题讨论】:

    标签: parsing peg ll pegjs


    【解决方案1】:

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

    所以当你写的时候

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

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

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

    但是在那之后,没有() 可以与func_call 匹配。因此解析错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 2018-08-21
      • 2019-05-18
      • 2015-05-26
      相关资源
      最近更新 更多