2011-12-12 58 views
0

我有遗传程序,打印表达式树到一个文件(它可以轻松切换前/后/在修复)解析到表达式树中蟒

好像预固定将是最简单的解析,所以我目前正在使用它。

我将如何去解析这个字符串使用Python 2.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程序,因此不需要解析?就像我在GP.py中有一个名为test_tree的树。我可以以某种方式从我的其他文件MyBot.py获取该文件吗?

+0

输出是否包含除数字和基本操作之外的其他内容?如果是,那么遗传程序的名称是什么? (你的意思是任何机会都有遗传编程吗?) – Matt

+0

你的“表达式树数据结构”是什么样的?你想从头开始分析器,还是使用更强大的库?你为什么想要将解析和评估分成两个文件? – poke

回答

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

+0

管道是什么意思? – SwimBikeRun

+0

@ user1018733:符号'|'是在命令行中使用的Unix'pipe'符号。单独的Unix命令是强大的,但是当你将它们结合在一起时,你可以轻松完成复杂的任务。 Windows'cmd'也具有'pipe',但人们总是在Windows中使用GUI工具。 – kev

3

首先,前缀表示法不需要任何括号 - 您纯粹通过字符串中元素的排序来控制操作的优先级。例如,如果您想要2*(1+4)*3,您的前缀表达式将变为"* * 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] 

打印

14.0 
30.0