2

ブール代数を表すソリューションを探しています。ユーザーに表示する文字列オブジェクトがたくさんあるとしましょう。彼はそれらを複数選択 (それらの&& AND間の接続を作成) したり、接続を作成したりできるようになりまし|| ORた。最終的な式もユーザーに表示する必要があります。

たとえば、彼がString1, String2, String3I want to presentを選択した場合String1 && String2 && String3。そしておそらく後で、ユーザーは のような式を作成できるはず(String1 || String 2) && String 3です。

私の質問は、文字列オブジェクト間のこれらのブール選択の参照をどのように追跡できますか? もちろん、String 式を作成することもできます。彼が選択したものを常に追加します。しかし、彼がオブジェクトの選択を解除したらどうなるでしょうか? 次に、文字列全体を解析して再評価する必要があります。

オブジェクト間の参照を保持するものを探してAND/ORおり、これらに基づいて String 最終式を構築するメソッドを持っています。

どんなアイデアでも大歓迎です!

4

2 に答える 2

2

ツリー構造が必要なだけのようです。すべての内部ノードは演算子 ( &&||など) を表し、すべてのリーフ ノードは用語を表します。


参照:抽象構文木

于 2013-01-16T10:32:41.463 に答える
2

Lexical Analysisでそれを行うことができます。Java には、 JavaCC 、 JLex などの多くの字句ジェネレーターがあります。

または、括弧のバランスを取り、階層を維持するために、事前/事後修正計算機またはスタック計算機のようなものを使用できます。もともとは、「ツリー」を通過し、その計算機で「1」から「9」の数字の代わりにトラバースすることによって行われます。 (文字列として提供されます) 「true」または「false」に一致する必要があり、「+」、「-」二項演算子の代わりに、「and」および「or」に一致して操作する必要があります!

以前のコメントでコミットしたように、ブール代数パーサーを作成しました。うまくいくと思います。フォークして貢献することもできます: https://github.com/sadaf2605/Java-Boolean-Algebra-Parser

コード:

public class BooleanAlgebra {

    static final String CONST_and="And";
    static final String CONST_or="Or";
    static final String CONST_true="True";
    static final String CONST_false="False";


    public static void main(String[] args) {

        System.out.println(booleanAlgebra("False")==false);
        System.out.println(booleanAlgebra("True")==true);

        System.out.println(booleanAlgebra("False And False")==false);
        System.out.println(booleanAlgebra("True And False")==false);
        System.out.println(booleanAlgebra("True And True")==true);
        System.out.println(booleanAlgebra("False And True")==false);

        System.out.println(booleanAlgebra("(False And True)")==false);
        System.out.println(booleanAlgebra("True Or (False And True)")==true);
        System.out.println(booleanAlgebra("(True And False) And (False And True) Or True")==true);

        System.out.println(booleanAlgebra("( (True And False) Or True )")==true);

        System.out.println(booleanAlgebra("( False Or (True And (False Or True)) Or True )")==true);




    }




    static boolean booleanAlgebra(String str){
        return TrueFalse(str, false, "Or");
    }


     static boolean TrueFalse(String s,boolean b, String op){
        boolean btemp=false;
        s=s.replaceAll(" ", "");

        while(!s.isEmpty()){

            if(s.startsWith(CONST_true)){
                btemp=true;
                s=s.substring(4);
            }else if(s.startsWith(CONST_false)){
                btemp=false;
                s=s.substring(5);
            }else if(s.startsWith(CONST_and)){
                op=CONST_and;
                s=s.substring(3);
            }else if(s.startsWith(CONST_or)){
                op=CONST_or;
                s=s.substring(2);
            }else if(s.startsWith("(")){
                int end=s.indexOf(")");
                if(end>0){
                b=TrueFalse(s.substring(1, end>-1?end:1),b,op);
                s=s.substring(end);
                }
            }else{
                s=s.substring(1);
            }
            if (op.equals(CONST_and)){
                b=b&&btemp;

            }else if(op.equals(CONST_or)){
                b=b||btemp;
            }   
        }
        return b;   
    }
}
于 2013-01-16T10:50:39.263 に答える