2

実行時にJavaプログラムで生成される複雑なブール式を評価するにはどうすればよいですか?論理式を評価する方法のx、y、zのブール変数と実行時にJavaでブール式を生成する

(xとyまたはz)とs

...

おかげ

+2

質問が不明です。 'if((x && y || z)&& s)'の何が問題なのですか? –

+1

式の表現方法を示すコード例がありますか? – sinelaw

+0

式はxmlファイルからロードされますが、ブール変数はプログラムの現在の状態に応じて異なる値をとります。上記のようにifを使うことはできません。なぜなら、常に同じ表現ではないからです。 – sdfrevfse

答えて

1

最小作業にはhttp://docs.codehaus.org/display/JANINO/Homeを使用してください。私は単純な表現よりもはるかに多くを行うことができます。

+0

ここで例を見つけることができますか? – sdfrevfse

+0

私が指摘したページ、http://docs.codehaus.org/display/JANINO/Basic。最初の例では、型をブール値に変更するだけで十分です。 – maaartinus

+0

ありがとう、これは私が興味を持ったものを満足させる簡単で即時の解決策です。 – sdfrevfse

0

例?それらのような論理式は構文木として評価することができます。この関連する質問には良い情報があると思います。Logic expression parser

論理的な表現をデータとして扱いたいということですJython、JRuby、Groovy、Scala(JVMに限定していると仮定)のようなスクリプト言語に適しているようです。基本的な表現や論理的な表現を扱うパーサーを書くのは非常に難しいとは思うが、

0

式ツリーを生成し、各リーフをブール値にバインドする必要があります。この式を解析し、ASTを生成するには、DijkstraのShunting Yardアルゴリズムを見てください。すべてがそこに説明され、実装するのはかなり簡単です。

1

非常に簡単に言えば、ブール式の「中間表現」が必要です。これは、Nodeオブジェクトで構成されたツリーです。 NodeのサブクラスはAndNode,OrNode,NotNodeVariableNodeです。 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は、これを非常に簡単かつ明確に紹介しています。

+0

このアプローチは私にとって素晴らしい仕事でした。また、Tomahawkツリービューコントロールを使用してノードを表示するJSF Webアプリケーションでビジュアル表現エディタUIを実装しました。 –

関連する問題