gpt4 book ai didi

python - 如何处理 PEG 语法中的负数?

转载 作者:太空狗 更新时间:2023-10-30 01:36:41 28 4
gpt4 key购买 nike

我正在尝试使用 tatsu 编写一个简单的 int 表达式解析器,一个基于 PEG 的 Python 解析器生成器。这是我的代码:

import tatsu

grammar = r'''
start = expression $ ;
expression = add | sub | term ;
add = expression '+' term ;
sub = expression '-' term ;
term = mul | div | number ;
mul = term '*' number ;
div = term '/' number ;
number = [ '-' ] /\d+/ ;
'''
parser = tatsu.compile(grammar)
print(parser.parse('2-1'))

此程序的输出是 ['-', '1'] 而不是预期的 ['2', '-', '1']

我得到正确的输出,如果我:

  • 移除对一元减号的支持,即将最后一条规则更改为 number =/\d+/;
  • 去掉了term、mul、div规则,只支持加减法
  • 将第二条规则替换为 expression = add |子 |多 |分区 |号码 ;

最后一个选项实际上没有遗漏任何功能,但我不明白为什么它会起作用。到底是怎么回事?

编辑:如果我只是翻转 add/sub/mul/div 规则来摆脱左递归,它也可以工作。但是随后评估表达式就成了一个问题,因为解析树被翻转了。 (3-2-1 变为 3-(2-1))

最佳答案

存在 TatSu 无法处理的左递归情况,正在努力解决当前搁置的问题。

您可以使用左/右 join/gather operators控制非左递归文法中解析表达式的结合性。

关于python - 如何处理 PEG 语法中的负数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45776731/

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