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

its*_*dok 5 python parsing peg tatsu

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

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'))
Run Code Online (Sandbox Code Playgroud)

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

如果我要么得到正确的输出:

  • 删除对一元减号的支持,即将最后一条规则更改为 number = /\d+/ ;
  • 删除term,mul和div规则,仅支持加法和减法
  • 用第二个规则替换 expresssion = add | sub | mul | div | number ;

最后一个选项实际上可以工作而不会留下任何功能,但我不明白为什么它的工作原理.到底是怎么回事?

编辑:如果我只是翻转add/sub/mul/div规则来摆脱左递归,它也有效.但是,然后评估表达式成为一个问题,因为翻译了解析树.(3-2-1成为3-(2-1))

Apa*_*ala 1

存在 TatSu 无法处理的左递归情况,并致力于修复当前处于搁置状态的问题。

您可以使用左/右连接/聚集运算符来控制非左递归语法中解析表达式的关联性。