gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:15:20 26 4
gpt4 key购买 nike

我正在尝试解析逗号分隔的列表。为了简单起见,我只使用数字。这些表达式是有效的:

(1,4,3)

()

(4)

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

我正在此处使用在线浏览器解析器生成器进行测试: https://pegjs.org/online

这不起作用:

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]

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

最佳答案

很酷的问题,在深入研究他们的文档后,我发现 / 字符的含义是:

Try to match the first expression, if it does not succeed, try the second one, etc. Return the match result of the first successfully matched expression. If no expression matches, consider the match failed.

所以这引导我找到解决方案:

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

这样做的原因:

输入:(1, 4)

  • 吃“(”
  • 检查是否有数字?
  • 检查 some_digits - 第一个条件:
    • 吃“1”
    • 吃“,”
    • 检查 some_digits - 第一个条件:
      • 吃“4”
      • 没吃饭','
    • 检查 some_digits - 第二个条件:
      • 吃“4”
      • 成功
    • 成功
  • 吃“)”
  • 成功

如果颠倒 some_digits 条件的顺序,遇到的第一个数字会被 digit 吃掉,并且不会发生递归。然后它会抛出一个错误,因为 ')' 不存在。

关于parsing - 如何最好地解析 PEG 语法中的逗号分隔列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56553774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com