7

うーん、これは言語にとらわれず、C# または F# で行うことを好みますが、今回は「それがどのように機能するか」という質問にもっと興味があります。

私が達成したいことは次のとおりです。

a) 学びたい - 今回は私のエゴについてです。楽しいプロジェクトで、自分がこの分野で本当に得意であることを自分に示したいと思っています。

b) 私は EBNF について少し知っています (まだわかりませんが、EBNF で演算子の優先順位がどのように機能するかはわかりません - Irony.NET は正しく動作します。例を確認しましたが、これは私にとって少し不吉です)

c) 私のパーサーは、たとえば 5 * (3 + (2 - 9 * (5 / 7)) + 9) を取得して、正しい結果を得ることができるはずです。

d) 率直に言って、これは私にとってコンパイラーやインタープリターを書く上での最大の問題のようです。64ビットのアセンブラコードを生成するのに問題はありませんが(手動でアセンブラを書くことができます)、数式パーサーは...

e) 別の考え: シンプルなコンピューター (約 2kB の RAM しかない私の古い Sharp 1246S など) でさえ、それを行うことができます... それは難しいことではありませんよね? そして、非常に古いプログラミング言語でさえ、式の評価があります... BASIC は 1964 年のもので、私が例として提示した種類の式をすでに計算できました。

f)いくつかのアイデア、いくつかのインスピレーションで本当に十分です-演算子の優先順位と括弧を実行する方法がわかりません-ただし、ASTが関係していることと、多くの人がスタックを使用していることは知っています

それで、あなたはどう思いますか?

4

4 に答える 4

5

Recursive Descent パーサーについて学ぶ必要があります。

Code Golf の演習をチェックして、これを 10 通りの方法で実行してください。

Code Golf: 数式評価器 (PEMDAS を尊重)

これらの「ゴルフ」ソリューションのいくつかは、さまざまな方法でコーディングされた再帰降下パーサーです。

式の解析だけを行うことは、コンパイラーで最も簡単なことであることがわかります。言語の残りの部分を解析することはより困難ですが、コード要素がどのように相互作用し、適切なコードを生成するかを理解することははるかに困難です。

また、BNF を使用してパーサーを表現する方法と、その BNF を使用して何かを行う方法にも興味があるかもしれません。以下は、明示的な BNF と暗黙的な AST を基盤として代数をシンボリックに解析および操作する方法の例です。これは、従来のコンパイラが行うことではありませんが、これを行う機構はコンパイラ テクノロジに深く根ざしています。

于 2010-05-26T21:42:59.057 に答える
1

従来、コンピューター上のフォーミュラ プロセッサは POSTFIX 表記を使用しています。スタックを使用し、オペランドとして 2 つの項目をポップし、演算子として 3 番目の項目をポップし、結果をプッシュします。

あなたが望むのは、非常に単純な INFIX から POSTFIX 表記へのコンバーターです。後置処理に入ったら、これまでで最も簡単なことです。

于 2010-05-26T21:44:10.270 に答える
1

Djikstra の shunting yard アルゴリズムを使用して infix を postfix 表記に変換し、さまざまな数の引数を持つ関数をサポートする、PHP に実装されたスタックベースのパーサーについては、PHPExcel計算エンジンのソースを参照してください。

于 2010-05-26T21:52:46.630 に答える
0

既存のソリューションを使用する場合は、PSR-0 と互換性のあるシャント ヤード アルゴリズムの実装をお勧めします: https://github.com/andig/php-shunting-yard/tree/dev

于 2013-12-28T20:06:13.803 に答える