繁体   English   中英

如何将令牌更改为树(Python)

[英]How to change tokens into trees (Python)

我正在研究一个 python 项目,当你写一行方程(包括运算符)时,它会为你计算方程。 首先,如果我们写入一个字符串,它会将字符串转换为单独的标记。

"12+2*3" -> [ "12", "+", "2", "*", "3" ]

然后,我们将每个令牌更改为一棵树。

[ "12", "+", "2", "*", "3" ]

-> [[“12”],“+”,[[“2”],“*”,[“3”]]]

[ "(", "2", "+", "3", ")", "*", "7" ]

-> [[[["2"], "+", ["3"]], "(", []], "*", ["7"]]

记号必须按操作顺序按列表分组,如果有括号,必须是[[括号内的数字]、“(”、[]]

我在第二部分遇到问题,将令牌转换为树。 建议我使用递归的 function,但是如何?

这是您可以使用的实现:

  • 使用递归
  • 使用字典来定义运算符的优先级
  • 当表达式无效时有一些基本的错误处理(不平衡的括号,未知的运算符,...)
def make_tree(lst):
    def report(op):
        op = f"'{op}'" if op else "end-of-input"
        raise ValueError(f"Unexpected {op}")
    
    def read_operand():
        token = next(it, "")
        if token == "(":
            expr, op = read_expression(0)
            if op != ")":
                report(op)
            return [expr, "(", []]
        elif token in precedence:
            report(token)
        return [token]
            
    def read_expression(level):
        left = read_operand()
        op = next(it, "")
        while precedence[op] > level:
            *left, op = [left, op, *read_expression(precedence[op])]
        return left, op

    precedence = {"(": 0, ")": 0, "": 1, "+": 2, "-": 2, "*": 3, "/": 3}
    it = iter(lst)
    expr, op = read_expression(1)
    if op != "":
        report(op)
    return expr
    
print(make_tree(["12","+","2","*","3"]))  # [['12'],'+',[['2'],'*',['3']]]
print(make_tree(["(","2","+","3",")","*","7"]))  # [[[['2'],'+',['3']],'(',[]],'*',['7']]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM