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

时间:2017-08-19 22:13:09

标签: 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'))

此计划的输出为['-', '1'],而不是预期的['2', '-', '1']

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

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

最后一个选项确实有效,但没有留下任何功能,但我不明白为什么它有用。到底是怎么回事?

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

1 个答案:

答案 0 :(得分:0)

还有一些TatSu无法处理的递归案例,并且可以解决当前处于搁置状态的问题。

您可以使用左/右join/gather operators来控制非左递归语法中的已解析表达式的关联性。