Parsing 如何最好地解析PEG语法中的逗号分隔列表

Parsing 如何最好地解析PEG语法中的逗号分隔列表,parsing,grammar,left-recursion,pegjs,Parsing,Grammar,Left Recursion,Pegjs,我试图解析一个逗号分隔的列表。为了简化,我只使用数字。这些表述将是有效的: (1,4,3) () (四) 我可以想出两种方法来做到这一点,我想知道为什么失败的例子不起作用。我相信这是一个正确的BNF,但我不能让它像PEG一样工作。有人能解释清楚原因吗?我试图更好地理解PEG解析逻辑 我在这里使用在线浏览器解析器生成器进行测试: 这不起作用: list = '(' some_digits? ')' some_digits = digit / ', ' some_digits digit = [0

我试图解析一个逗号分隔的列表。为了简化,我只使用数字。这些表述将是有效的:

(1,4,3)

()

(四)

我可以想出两种方法来做到这一点,我想知道为什么失败的例子不起作用。我相信这是一个正确的BNF,但我不能让它像PEG一样工作。有人能解释清楚原因吗?我试图更好地理解PEG解析逻辑

我在这里使用在线浏览器解析器生成器进行测试:

这不起作用:

list = '(' some_digits? ')'
some_digits = digit / ', ' some_digits
digit = [0-9]
(实际上,它解析得很好,喜欢()或(1),但不识别(1,2)

但这确实有效:

list = '(' some_digits? ')'
some_digits = digit another_digit*
another_digit = ', ' digit
digit = [0-9]

这是为什么?(这里是语法新手)

很酷的问题,在他们的文档中翻找了一秒钟后,我发现
/
字符的意思是:

尝试匹配第一个表达式,如果不成功,请尝试 第二个等,成功返回第一个的匹配结果 如果没有表达式匹配,请考虑匹配。 失败了

这就引出了解决方案:

list = '(' some_digits? ')'
some_digits = digit ', ' some_digits / digit
digit = [0-9]
这一做法奏效的原因是:

输入:(1,4)

  • 吃'('
  • 检查有没有数字
  • 检查一些数字-第一个条件:
    • 吃“1”
    • 吃“,”
    • 检查一些数字-第一个条件:
      • 吃‘4’
      • 不吃‘,’
    • 检查一些数字-第二个条件:
      • 吃‘4’
      • 成功
    • 成功
  • 吃“)”
  • 成功

如果你颠倒
某些数字的顺序,第一个数字会被
数字吃掉,并且不会发生递归。然后它会抛出一个错误,因为“.”不存在。

第二行的旁注也会这样做:
一些数字=数字(“,”一些数字)?
@LeonStarr哦,你想让我回答你文章的第二部分吗?对不起,我不需要James,你的回答为我澄清了PEG解析逻辑(这是我真正的问题)。但是谢谢你的邀请。