ポーランド記法に変換した後に式を評価する方法を知っています。ただし、次のようなものを評価する方法を知りたいです。
If a < b Then a + b Else a - b
a + bconditiona < bが True の場合に発生し、そうでない場合は Falsea - bが計算された場合に発生します。
ここでは文法は問題ではありません。この問題を解決するためのアルゴリズムだけが必要なので。ブール式と代数式を評価できます。しかし、どうすれば上記の問題を解決できますか?
ポーランド記法に変換した後に式を評価する方法を知っています。ただし、次のようなものを評価する方法を知りたいです。
If a < b Then a + b Else a - b
a + bconditiona < bが True の場合に発生し、そうでない場合は Falsea - bが計算された場合に発生します。
ここでは文法は問題ではありません。この問題を解決するためのアルゴリズムだけが必要なので。ブール式と代数式を評価できます。しかし、どうすれば上記の問題を解決できますか?
S-express については LISP 言語を参照してください。
(if (> a b) ; if-part
(+ a b) ; then-part
(- a b)) ; else-part
実際には、この単純な if ステートメントだけを評価したい場合は、トークナイズして評価しますが、ネストされた if then else、if with experssions、複数の else、変数の割り当て、型など、より複雑なものを評価したい場合は、... LR パーサーなどのパーサーを使用する必要があります。たとえば、 Lex&Yaccを使用して、独自の言語用の優れたパーサーを作成できます。彼らはどういうわけか複雑な文法をサポートしています。しかし、LR パーサー (など) がどのように機能するかを知りたい場合は、それらを読み取り、テーブルを使用してトークンを読み取って解析する方法を確認する必要があります。たとえば、wiki ページを見て、LR パーサー テーブルがどのように機能するかを確認してください (単純なスタック以上のものであり、ここで説明するのは簡単ではありません)。
問題が実際ifにステートメントを解析するだけの場合は、パーサー手法からごまかすことができます。 a < b の後に空のものを追加できます。これはアクションを意味し、 の後に空のものを追加できますelse。これもアクションを意味します。条件を解析すると、正誤に応じていずれかのアクションが実行されます。ちなみに if 文の中で式を解析したい場合は、条件付きスタックが必要ですSLR tableのようなものを意味します。