実行時にJavaプログラムで生成される複雑なブール式を評価するにはどうすればよいですか?論理式を評価する方法のx、y、zのブール変数と実行時にJavaでブール式を生成する
(xとyまたはz)とs
...
おかげ
実行時にJavaプログラムで生成される複雑なブール式を評価するにはどうすればよいですか?論理式を評価する方法のx、y、zのブール変数と実行時にJavaでブール式を生成する
(xとyまたはz)とs
...
おかげ
最小作業にはhttp://docs.codehaus.org/display/JANINO/Homeを使用してください。私は単純な表現よりもはるかに多くを行うことができます。
ここで例を見つけることができますか? – sdfrevfse
私が指摘したページ、http://docs.codehaus.org/display/JANINO/Basic。最初の例では、型をブール値に変更するだけで十分です。 – maaartinus
ありがとう、これは私が興味を持ったものを満足させる簡単で即時の解決策です。 – sdfrevfse
:
例?それらのような論理式は構文木として評価することができます。この関連する質問には良い情報があると思います。Logic expression parser
論理的な表現をデータとして扱いたいということですJython、JRuby、Groovy、Scala(JVMに限定していると仮定)のようなスクリプト言語に適しているようです。基本的な表現や論理的な表現を扱うパーサーを書くのは非常に難しいとは思うが、
式ツリーを生成し、各リーフをブール値にバインドする必要があります。この式を解析し、ASTを生成するには、DijkstraのShunting Yardアルゴリズムを見てください。すべてがそこに説明され、実装するのはかなり簡単です。
非常に簡単に言えば、ブール式の「中間表現」が必要です。これは、Node
オブジェクトで構成されたツリーです。 Node
のサブクラスはAndNode
,OrNode
,NotNode
、VariableNode
です。 AndNode
には2つの子Node
があり、OrNode
には2つの子Node
があり、NotNode
には1つの子Node
があります。
VariableNode
には、可変名文字列、たとえば "x"があります。 HashMap<String, Boolean>
があり、各変数名のキーには関連するブール値があります。
各Nodeクラスにはeval()
メソッドがあり、式を評価してboolean
を返します。 VariableNode.eval()
メソッドは、HashMap
の変数の値を検索して返します。 NotNode.eval()
は!child.eval()
を返します。 AndNode.evaluate()
はchild1.eval() && child2.eval()
を返し、OrNode.evaluate()
はchild1.eval() || child2.eval()
を返します。ブール式ツリー全体を評価するには、ルートノードのeval()
メソッドを呼び出します。
あなたは、文字列から自分の式ツリーを構築したい場合は、文字列からツリーを生成パーサを書く必要がありますなど
、Javaのコンストラクタを使用して、プログラムでこれらのブール式ツリーを構築することができます。 Terence ParrのLanguage Implementation Patternsは、これを非常に簡単かつ明確に紹介しています。
このアプローチは私にとって素晴らしい仕事でした。また、Tomahawkツリービューコントロールを使用してノードを表示するJSF Webアプリケーションでビジュアル表現エディタUIを実装しました。 –
質問が不明です。 'if((x && y || z)&& s)'の何が問題なのですか? –
式の表現方法を示すコード例がありますか? – sinelaw
式はxmlファイルからロードされますが、ブール変数はプログラムの現在の状態に応じて異なる値をとります。上記のようにifを使うことはできません。なぜなら、常に同じ表現ではないからです。 – sdfrevfse