4

私は小さなルールベースの「数学」エンジンを書いているところです。これではわかりにくいと思いますので、簡単な例を示します。

整数を保持する変数 a があるとします。数値に適用できる関数もいくつかあります。

  • sqr- 数を二乗する
  • flp- 数値のビットを反転する
  • dec- 数を減らす
  • inc- 数を増やす

次に、 と言うことができますdo_formula(a, "2sqr+inc+flp")。a が 3 の場合、それを 2 乗し (81)、インクリメントし (82)、そのビットを反転します (~82 - 符号付き整数を扱う場合は -83 だと思います)。

数式を解析する最良の方法は何でしょうか? それは比較的単純で、すべてのオペコードを 3 文字にすることを考えています... Lex を使用するのはやり過ぎでしょうか? シンプルな自作のソリューションを作成するか、まったく別のものを使用する必要がありますか?

上記の例はばかげていると思います。私はそれを行う計算機を構築していませんが、それは私がやろうとしていることを十分に示しています.

4

5 に答える 5

3

文法が非常に複雑ではなく、Python で実行することを気にしない場合、pyparseはまさに医師が注文したものである可能性があります。化学方程式を解析するためにかなり似たようなものを実装しましたが、それを行うのに 1 時間ほどかかりました。ここにコードを追加しますが、特に関連性はありません。

于 2010-01-05T00:56:12.873 に答える
1

はい、この場合はやり過ぎのようです。文字列を '=" で分割し、操作を次々に適用するだけです。エンジンを 0.5 ~ 1 ページのコードで記述できる一流の市民としての辞書と機能に感謝します。

dct = {'sqr' : lambda a: a * a, ...}

ntimes, op = token[:-3], token[-3:]
ntimes = 0 if len(ntimes) == 0 else int(ntimes)

..
dct[op](a)
于 2010-01-04T19:19:46.237 に答える
0

あなたのホスト言語は何ですか? Ruby では、 treetopがとても気に入っています。始めるのは少し難しいですが、より複雑な数式の解析に成功しました。

于 2010-01-05T00:59:48.997 に答える