2013-10-11 43 views
-1

什麼是一個好的算法或者至少是某段代碼來解析和計算一些自定義的數學表達式?解析自定義數學表達式的MATLAB風格

例如:

abs(add(subtract(5,10),abs(add(2,4)))) 

又如:

abs(add(add(2,6),subtract(7,multiply(-1,multiply(-1,5))))) 

因此,這將評估爲5-10 = -5,然後2 + 4 = 6的6絕對值只是6.然後下一個操作是-5 + 6 = 1,絕對值是1.

所以試圖找到一個解決方案來解析這樣的東西,而不使用eval()。

這是我到目前爲止所嘗試的。

$expr = "abs(add(subtract(5,10),abs(add(2,4))))"; 

$expr_array = preg_split("/(subtract\()/", $expr, NULL, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 

    foreach($expr_array as $key => $value) { 
      $value = preg_replace("/(\)|\()/", "", $value); 
      echo $value."\n"; 
    } 

這個只呈現

absadd 減 5,10 absadd2,4

但還是需要一個很好的方法,通過它來分析和區分()中的每個操作數。如果它是相同的格式,它會更容易。

予想到使用使preg_split解析串,也創建單獨的陣列一個操作數,另一個用於數字,但一些數量的是一個實際的操作數中包含ABS在它的數字(添加(2,4)的。 想法?

+0

沒有真正的好辦法呢,因此爲什麼我問的問題。 –

+0

尚無迴應,看起來這是一個非常那麼難以算法 –

回答

0

你可以嘗試使用正則表達式和遞歸函數來處理它。

$pattern = '/^\s*(.+?)\s*\(\s*(.+?)\s*\)\s*$/'; 
+0

的表達可以完全不同將會發布另一個示例在另一個表達式中,正則表達式意味着格式是相同的,但不是。 –