在C#中将布尔表达式的字符串转换为树结构

时间:2018-09-20 09:19:52

标签: c# binary-tree boolean-expression converters

我正在尝试将"a && b || c && d""(a && b) || (c && d)"之类的逻辑表达式字符串转换为二叉树结构:

      ||
    /    \
  &&      && 
 / \     /  \
a   b   c    d

然后应用深度优先搜索来遍历它们。

是否有适当的库可以做到这一点? 我当时在考虑反讽或罗斯林,但不确定。

2 个答案:

答案 0 :(得分:2)

我不知道一个库,但是可以这样实现。

您想要的基本上是给定表达式(按顺序遍历)中的表达式树

要构建树,请使用以下步骤: 遍历表达式

  1. 如果该字符不是运算符,则将其推入堆栈。

  2. 如果字符是一个运算符,则弹出两个操作数并将其作为其子级 并将当前节点推入堆栈。

  3. 最后,堆栈中只有元素是您的树。

有关算法的实现,请参考此link

答案 1 :(得分:0)

实际上,您可以使用ANTLR之类的解析器生成器库来获得结果,但是对于简单的任务而言,这太过分了。

您可以改为定义自己的小语法,如下所示(我用'+'代替'||'和'。'代替'&&'。用符号替换它们,同时也对符号进行适当的代码更改递归下降解析器代码):

S → T '+' S | T
T → F '.' T | F
F → A | '('S')'
A → 'a' | 'b' | 'c' | ... | ɛ

基于上述语法,现在您可以轻松编写如下的递归下降解析器(以下代码在语法上可能不正确,仅将其用作伪代码):

public Node S(){
        Node  T = T();

        if(inputHasMoreUnseenCharacters() && peekNextCharacterInString().equals("+")){
            eatNextCharacterInString();//eats '+'
            Node S = S();
            return new NodeOR(T, S);
        }

        return T;
    }

public Node T(){
    Node F= F();

    if(inputHasMoreUnseenCharacters() && peekNextCharacterInString().equals(".")){
        eatNextCharacterInString();//eats '.'
        Node T = T();
        return new NodeAND(F, T);
    }

    return F;
}

public Node F(){
    String nextCharacterInput = eatNextCharacterInString();
    Node node = null;
    if(nextCharacterInput.equals("(")){
        //eatNextCharacterInString(); //eats '('
        node = S();
        eatNextCharacterInString(); //eats ')'
    }else{
        node = A(nextCharacterInput);
    }
    return node;
}

public Node A(String nextCharacterInput){
    Node node = null;
    return new NodeSingleValue(nextCharacterInput);
}

NodeOR,NodeAND和NodeSingleValue类都是Node类的子类。调用方法S()后,您将获得树的根作为Node类型的对象。

对于递归下降解析的介绍,this链接可能会有用。