我试图使用基于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+/ ;
expresssion = add | sub | mul | div | number ;
最后一个选项确实有效,但没有留下任何功能,但我不明白为什么它有用。到底是怎么回事?
编辑:如果我只是翻转add / sub / mul / div规则来摆脱左递归,它也可以。但是,然后评估表达式成为一个问题,因为翻译了解析树。 (3-2-1
变为3-(2-1)
)
答案 0 :(得分:0)
还有一些TatSu无法处理的递归案例,并且可以解决当前处于搁置状态的问题。
您可以使用左/右join/gather operators来控制非左递归语法中的已解析表达式的关联性。