通过插入Parens进行算子优先解析

时间:2013-11-02 23:59:01

标签: python parsing operator-precedence

我一直在努力为我的小玩具实验性编程语言添加运算符优先级,我一直在写这个语言叫[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

非常感谢我帮助修复我的功能和任何边缘情况!

0 个答案:

没有答案