[英]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.