「if-then-else」ステートメントを解析するために Prolog DCG を使用することは可能ですか? もしそうなら、特定の「if」「then」「else」文字列に一致しなければならないとすると、そのようなステートメントをどのように解析するのでしょうか。これが不可能な場合、私の代替手段は何ですか?
1 に答える
0
DCGがぴったりです。しかし、最小限の Prolog であるため、パワーを利用して実用的なものを実装するには、いくつかの選択を行う必要があります。たとえば、可能であれば、事前のトークナイザーを使用せずに、DCG をテキスト ソースに直接適用します。これが適切かどうかは、実際のタスクによって異なります。ここは大丈夫だとしましょう。次に、利用可能なヘルパー ライブラリを使用して、DCG を SWI-Prolog に実装できます。
:- [library(http/dcg_basics)].
conditional(if_then_else(Cond, Then, Else)) -->
blanks, "if",
blanks, bool_expression(Cond),
blanks, "then",
blanks, statement(Then),
blanks, "else",
blanks, statement(Else).
とても簡単ですね。
この他の回答は、優先順位を考慮して式を解析 (および評価) する方法を示しています。ブール演算子を使用して簡単に拡張できます。適切な優先順位を与えるだけです。ステートメントは通常、代入を許可し、条件付きで再帰します。
ブランク//0の使用に注意する必要があります。おそらく「空一致」のプロダクションは、同じプロパティを持つ他のプロダクションと「並べて」表示される場合、非効率をもたらす可能性があります。
bool_expression//1 と statement//1 が定義されている場合、パーサーを呼び出すことができます。
...,
phrase(conditional(C), " if 1 < 2 then a = 1 else a = 0 "),
...
Cには構文ツリーが含まれます...
于 2012-01-17T07:12:03.433 に答える