2011-12-12 54 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