2012-05-08 3 views
2

私はレモンパーサー駆動のアプリで数学的な変数を許可したい。たとえば、ユーザーがx^2 + yと入力した場合、xとyの値の100000の異なるペアについてこれを評価することができます。うまくいけば、毎回再解析する必要はありません。私が考えることができる唯一の方法は、パーサにオブジェクトのツリーを生成させ、入力が与えられたときに式を評価することです。より良い/よりシンプルな/より速い方法がありますか?レモンパーサーで変数を使用していますか?

パフォーマンスが問題になることがあります。しかし、私はまた、コーディングの容易さとコードの維持について心配しています。

答えて

0

実際の(実際のまたは仮想の)コードを生成しない限り、これは実際にどのように行うのかです。 xとyはあなたの場合の変数に過ぎませんので、実際の値を入力してからEvaluate関数を呼び出して式を評価してください。ツリーノードには変数xとyへのポインタなどが格納されます。テスト値の各ペアについて解析する必要はありません。

1

最も管理しやすいコードが必要な場合は、解析しながら式を評価します。木を造らないでください。

式をたくさん再実行し、式が複雑な場合は、再構築を避ける必要があります(最もメンテナンス性が低いものから順に):ツリーの構築と評価、スレッドコードの生成と評価、ネイティブコードを生成して評価します。

式が一般的にあなたの例と同じくらい単純な場合、その場で評価される再帰的な降下手続きコーディングパーサーは、非常に高速であり、10万回の反復であっても非常に効果的です。そのようなパーサーは、レモンよりも実行時間が大幅に短縮されます。

関連する問題