用于理解表达式IF的逻辑算法

时间:2016-09-16 01:18:56

标签: algorithm

我需要找一个算法来解决这类问题: 解决句子中的逻辑,如

IF @1 and @2 or @3 or @4 and @5 THEN *STUFF

请求是:

0)忘了“那个* STUFF”

1)AND,OR组合可以是任何数字,组合,任何类型的连接

2)也可以像IF @ 1 THEN STUFF那样简单。

3)OR具有优先权,这意味着像@ 1和@ 2或3 @总是变成IF @ 1和(@ 2或@ 3),任何组合。

4)我需要将这种语言转换为另一种语言,现在我的功能就像convertSingle(@n),转换OrGroup(List single),转换AndGroup(List orGroup);

5)我完全控制代码的这一面,所以只要我能转换单个元素并与OR和AND的其余部分“连接”,我就可以编写所有内容。

到现在为止,我使用这个解决方案,相信我的工作,但我觉得不太好。它不优雅,我觉得这是强迫的,我希望这个递归,但我自己,现在找不到解决方案。 这是我的算法:

从一般句子开始,例如:IF @ 1或@ 2或@ 3和@ 4或@ 5

  • 它崩溃了,以正则表达式方式寻找OR,它变成了IF#1和#2

  • 保存意味着#1,#2(它只是来自prev的OR组崩溃)所以

1#= @ 1 OR @ 2 OR @ 3

2#= @ 4 OR @ 5

  • 然后寻找 AND ,在最后一次崩溃后,这将成为IF%1然后..

%1 =由prev OR组成的AND。

  • 我需要一个简单的“特殊情况解决方案”,如果@ 1那么,不能适应内部解决方案..

最后,我有一个工作(现在的测试)解决方案。但我不喜欢这样。我真的不知道为什么,但是这个“逐渐崩溃”的算法,嗯,我觉得这不是很好。 但在我看来,这是我能想到的最好的。

我想知道其他人是否比我聪明,可以建议我寻求更好的解决方案。

谢谢。

1 个答案:

答案 0 :(得分:0)

我想出了如何实现这一目标。我想为我的特定解决方案发布一个解决方案,但也许其他人会像开始点那样获得模式。

private ApplyElementDTO recursiveConvertXacmlLogicPart(
        String collapsedlogicapart) throws Exception {

    /*
     * 
     * if string=@n return converted apply
     */
    collapsedlogicapart = collapsedlogicapart.trim();
    if (collapsedlogicapart.startsWith("@")
            && (collapsedlogicapart.length() < 5)) {
        return getApplyTerm(collapsedlogicapart); // this is just a term to
                                                    // convert
    }

    if (isThisJustanOR(collapsedlogicapart)) {
        return constructOr(collapsedlogicapart);

    }


    //
    String exp = "((?<=^)|(?<=and\\s)).+?(?:(?=\\sand\\s|$))";
    Pattern pattern = Pattern.compile(exp);

    Matcher matcher = pattern.matcher(collapsedlogicapart);

    int count = 0;
    ApplyElementDTO ApplyAND = new ApplyElementDTO();

    ApplyAND.setFunctionId(XACMLData.FUNCTION_AND);

    while (matcher.find()) {

        String thisAndoperand = matcher.group().trim();

        ApplyAND.getApplyElements().add(
                recursiveConvertXacmlLogicPart(thisAndoperand));

        count++;
    }

    if (count < 2) {
        throw new Exception(
                "Looklike this was the entire complex rule in recursion,"
                        + " but i can't find any suitable operand for AND. "
                        + collapsedlogicapart);
    }
    return ApplyAND;
}

offcourse construct或者再次调用这个递归来转换单个术语。

再见