我目前正在解析自定义编程语言,并且在创建用于解析的“表达式”规则时,我正在努力寻找一种不会因递归而缓慢的方法。我的问题是,函数调用可以在表达式中,而表达式可以在函数调用(参数)中。因此,我最终得到的是一个基于Forward()
的糟糕系统,在func1(var1+1) + 1
上花费数秒,在func1(func1(var1+1)+1) + 1
上花费数分钟,这肯定是不可接受的。这是我当前的错误方法:
expression = Forward()
functionCall = Forward()
value = literal ^ identifier ^ Group(functionCall)
expression << Group(infixNotation(value, [
(memberOP, 2, opAssoc.LEFT),
...
]))
arguments = ZeroOrMore(delimitedList(expression))
...
functionCall << identifier + Literal("(").suppress() + Group(arguments) + Literal(")").suppress()
PyParsing可以记住以前的解析结果,并使用Packrat优化来重新使用它们。这为递归语法或通常在元素可以应用于不同上下文的情况下提供了性能上的好处。