2012-01-29 23 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; } }" 

実際に私がやっているのは、bytestreamを解析しています。このスクリプトでは、バイトを[byte]、ビットを[byte] [bit]と呼んでいます。誰かが良いフレームワーク/スクリプトのla​​unguageが私にこれのような何かをさせるだろうと提案することができますか?

答えて

1

本格的なスクリプト言語は厳密には必要ないように見えますが、これが勝利の最も簡単なルートとなるには近づいています。 LuaとPythonの両方は、Pythonよりもやや簡単なC(++)プログラムからの組み込みと呼び出しが非常に簡単です。

+0

非常にC++を持ってAngelScript(http://www.angelcode.com/angelscript/)、である - 構文のように。 –

+0

私は弾を噛んで、これらの選択肢の1つに行くと思います。ありがとうすべて – Prismatic

2

ブーストはスピリットを提供しますが、あなたの場合は複雑で過酷です。良いmuParser(最後のversioneは '演算子'を '演算子'として扱います)を使うことができます。ループ構文を正規表現パーサでつかむだけで簡単に書くことができます。 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