2012-01-29 69 views
0

我有一個應用程序需要閱讀並評估源文件中的表達式。我一直在使用muParser來做到這一點。但是現在我遇到了一個需要簡單循環支持的情況。我並不需要調用函數從腳本語言的能力,或任何其他先進的功能,真的只是:從C++中評估腳本化表達式

  • 數學表達式(+, - ,/,*,&,|,〜,等)
  • 邏輯表達式(!,||,& &等)
  • 條件句(如果,否則..)
  • 循環(對於)

隨着muParser我解析表達式AFTE R讀取它們,根據需要分配變量,然後求解:

expr="[0] + [1]*256 - 40" 

在上述例子中,我會替換[0]和[1]與它們相應的變量,並且可以然後解決。現在,我需要這樣的事情:

expr="for(i=0; i < 10; i+=2) { if(i<=6) { [0] + [i]*256 -40; } }" 

我在做的事情實際上是解析一個字節流。在腳本中,我將字節稱爲[byte],將位稱爲[byte] [bit]。有人可能會建議一個好的框架/腳本語言會讓我做這樣的事嗎?

回答

1

儘管您似乎並不嚴格需要一種完整的腳本語言,但您已經越來越接近它,這可能是獲得勝利的最簡單途徑。 Lua和Python都可以很容易地從C(++)程序中嵌入和調用,Lua比Python更容易。

+0

也好(儘管不太廣泛使用)是AngelScript(http://www.angelcode.com/angelscript/),它有一個非常類似C++的語法。 – 2012-01-29 23:58:34

+0

我想我會咬緊牙關,並選擇其中的一種。感謝所有 – Prismatic 2012-01-30 01:49:12

2

boost提供精神,但它是複雜的和你的情況矯枉過正。你可以利用良好的muParser(最後版本處理三元'if'操作符),用正則表達式解析器獲取循環語法:非常容易編寫。讓muParser處理每個表達式,然後解釋變量綁定。你的解析器可能是這樣的:

class parse { 
parse(const char *expr) { 
    if (match("for", "(", expr_init, ";" expr_test, ";", expr_after, ")", "{", body, "}")) 
    for (eval(expr_init); eval(expr_test); eval(expr_after)) { bind_variables and run...} 
    else 
    go_old_style... 
} 
} 
+0

感謝您的建議 - 但我覺得我可能會遇到問題後面的這條路線。寫這篇文章會讓我寫自己的解釋器,我可能會搞砸:) – Prismatic 2012-01-30 01:50:38