在python中解析表达式树

2024-04-23 18:46:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基因程序,可以将表达式树打印到一个文件中(它可以很容易地在pre/post/in fix之间切换)

似乎pre-fix是最容易解析的,所以我现在正在使用它。在

如何使用Python2.7解析这个字符串?例如,我如何解析字符串+(*(2,1),*(4,3))~~~它是2*1+4*3

f = open('expression_tree.txt', 'r')
input = f.read()
root_node_operator = input[0]

就我所能做到的。我对语法分析不太熟悉。谢谢!在

我有一个python程序,它打印表达式树的数据结构,我想在下一个python程序中解析并计算它。在

或者有没有一种方法可以将表达式树对象传递给下一个python程序,这样就不需要解析了?就像我把我的树叫做测试树一样普通股. 我能从我的另一份文件里找到吗我的bot.py?在


Tags: 文件字符串in程序txttreereadinput
2条回答

首先,前缀表示法不需要任何括号——您可以完全通过字符串中元素的顺序来控制操作的优先级。例如,如果您想要2*(1+4)*3,那么前缀表达式将变成"* * 2 + 1 4 3"。在

2*1+4*3将变成{}。使用split(),这将为您提供运算符和操作数的列表['+', '*', '2', '1', '*', '4', '3']。这将处理空白跳转。然后,递归地遍历列表:如果找到运算符,则从当前位置开始从列表中获取下两个操作数;如果找到常量,则返回它。每次你从列表中提取一些东西时,向前推进当前位置。在

opns = {
    '+' : lambda a,b: a+b,
    '-' : lambda a,b: a-b,
    '*' : lambda a,b: a*b,
    '/' : lambda a,b: a/b,
    }

def prefix_eval(expr, posn=0):
    # save current element from expression
    current = expr[posn]

    # advance parsing position
    posn += 1

    if current in ['+','-','*','/']:
        # binary operator, get next two operands
        op1,posn = prefix_eval(expr, posn)
        op2,posn = prefix_eval(expr, posn)

        # evaluate operation from current, on operands
        return opns[current](op1,op2), posn
    else:
        # not an operator, must be a numeric value
        return float(current),posn

print prefix_eval("+ * 2 1 * 4 3".split())[0]
print prefix_eval("* * 2 + 1 4 3".split())[0]

印刷品

^{2}$

+(*(2,1),*(4,3))替换为(+ (* 2 1) (* 4 3)),然后管道到scheme

$ echo '+(*(2,1),*(4,3))' | sed 's/\(.\)(/(\1 /g; s/,/ /g' | scheme | sed -n '/;Value: /s///p'

如果您想使用python,请尝试pyparsing。在

相关问题 更多 >