Parsing 如何最好地解析PEG语法中的逗号分隔列表
我试图解析一个逗号分隔的列表。为了简化,我只使用数字。这些表述将是有效的: (1,4,3) () (四) 我可以想出两种方法来做到这一点,我想知道为什么失败的例子不起作用。我相信这是一个正确的BNF,但我不能让它像PEG一样工作。有人能解释清楚原因吗?我试图更好地理解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
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解析逻辑(这是我真正的问题)。但是谢谢你的邀请。