8

私が取り組んでいるアプリケーションの代数式を解析する必要があり、それを試してみて、おそらく間違った道に向かう前に、少しの集合的な知恵を飾りたいと思っています。

テキスト代数式 (3*x - 4(y - sin(pi))) が与えられた場合、方程式のオブジェクト表現を作成します。カスタム オブジェクトは既に存在するため、必要なオブジェクトをインスタンス化するためにウォークできるツリーを作成するパーサーが必要です。

基本的な要件は次のとおりです。

  1. 代数を文法として表現できるので、必要に応じて制御し、カスタマイズ/拡張できます。

  2. 初期構文には、整数、実数、定数、変数、算術演算子 (+、-、​​、/)、累乗 (^)、方程式 (=)、括弧、優先順位、および単純な関数 (sin(pi)) が含まれます。適切な機能 (f(x) = 3x +2) をサポートするために、アプリをかなり迅速に拡張したいと考えています。

  3. コードに統合する必要があるため、C でコンパイルする必要があります。

式を数学的に評価する必要はないので、変数を解いたり演算を実行したりするソフトウェアはノイズです。

私はGoogleの宿題をしましたが、BNF文法とソフトウェアを使用してCでコンパイラを生成するのが最善のアプローチのようです.だから私の質問:

  1. 代数式 (またはさらに良いことに、LaTex) に対応するパーサー ジェネレーターを備えた BNF 文法は既に存在しますか? 誰かがすでにこれを行っている必要があります。主にテストしたくないので、自分でロールバックすることは本当に避けたいです。図書館に妥当な金額 (50 ドル未満) を支払っても構わないと思っています。

  2. そうでない場合、ここで学習/使用するのに最も簡単な C のパーサー ジェネレーターはどれだと思いますか? レックス?YACC? Flex、Bison、Python/SymPy、その他? 私はこれらのどれにも精通していません。

4

4 に答える 4

5

ここでは、Linux の標準ツールである flex と bison がおそらく最も適しています。これらのツールで使用されているサンプル パーサーとレクサーは、IIRC の目的に近いものを実行するため、そのコードを変更するだけで必要なものを取得できる場合があります。

これらのツールは、仕様を満たしているようです。文法をカスタマイズし、C にコンパイルし、任意の演算子を使用できます。

于 2011-01-09T21:17:29.700 に答える
4

私はANTLRで非常に幸運でした。C を含む多くの異なる言語のランタイムがあり、文法を指定してツリーを構築するための非常に優れた構文があります。私は最近、同様の文法 (代数式) を 131 行で書きましたが、これは間違いなく扱いやすいものです。

于 2011-01-09T21:16:10.570 に答える
1

次のコード(ネットで見つけた)を使用しました。

Program Translation Fundamentals" by Peter Calingaert

関数を処理できるように拡張しました。これにより、"if(a, b, c)" などを実装できます (Excel の処理方法に似ています)。

于 2011-01-09T22:14:29.073 に答える
0

簡単なパーサーを自分で作成するか、人気のある " compiler-compiler " を使用できます (それらのいくつかは他の投稿でリストされていました)。パーサーが外部ツールを使用 (および学習) するのに十分複雑かどうかを判断するだけです。いずれにせよ、文法を定義する必要があります。経験がない場合、通常、これは最も脳を集中的に使用するタスクです。構文文法を定義する正式な方法は、BNFまたはEBNFです。

于 2011-01-09T21:35:51.203 に答える