2

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

ここでは、パフォーマンスが問題になる場合があります。しかし、コーディングのしやすさとコードの維持にも気を配っています。

4

2 に答える 2

1

最も保守しやすいコードが必要な場合は、解析しながら式を評価します。ツリーを作成しないでください。

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

式が一般的にあなたの例と同じくらい単純である場合、オンザフライで評価する再帰降下ハンドコーディングパーサーはおそらく非常に高速で、100,000回の反復でもかなりうまく機能します。このようなパーサーは、Lemon よりもはるかに短い時間で実行できる可能性があります。

于 2012-05-12T08:51:56.960 に答える
0

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

于 2012-05-08T01:15:17.553 に答える