我一直在努力为我的小玩具实验性编程语言添加运算符优先级,我一直在写这个语言叫[mio-lang 1而且我很难理解基本算法,尽管它来自FreeNode上#io频道的jer等人清楚地描述了我!
我正在尝试将括号插入到正确位置的令牌流中,我相信这个算法被称为自上而下的解析器,除了我在这里使用堆栈而不是而不是递归函数调用。
以下是真实内容的天真缩减片段:
from collections import OrderedDict
operators = OrderedDict([
("*", (2)), ("/", (2)),
("+", (1)), ("-", (1)),
])
def precedence(tokens):
lparen = "("
rparen = ")"
level = None
levels = []
output = []
while tokens:
if len(tokens) > 1 and tokens[1] == "=":
return tokens[:2] + precedence(tokens[2:])
else:
if len(tokens) > 1 and tokens[1] in operators:
level = operators.get(tokens[1])
if levels:
if level > levels[-1]:
levels.append(level)
output.append(lparen)
else:
levels.append(level)
output.append(tokens.pop(0))
while levels and level < levels[-1]:
level = levels.pop()
output.append(rparen)
while len(levels) > 1:
level = levels.pop()
output.append(rparen)
return output
可以在此处找到此代码段的完整源代码以及一些单元测试:http://codepad.org/2yNEp2Pr
非常感谢我帮助修复我的功能和任何边缘情况!