Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中布尔表达式字符串到树结构的转换#_C#_Binary Tree_Boolean Expression_Converters - Fatal编程技术网

C# C语言中布尔表达式字符串到树结构的转换#

C# C语言中布尔表达式字符串到树结构的转换#,c#,binary-tree,boolean-expression,converters,C#,Binary Tree,Boolean Expression,Converters,我正在尝试将诸如“a&&b|c&&d”或“(a&&b)|(c&&d)”之类的逻辑表达式字符串转换为二叉树结构: || / \ && && / \ / \ a b c d 然后应用深度优先搜索遍历它们 有没有合适的图书馆可以这样做? 我在考虑Irony或Roslyn,但我不确定。我不知道库,但它可以这样实现 您需要的基本上是来自给定表达式的表达式树(按顺序遍历) 要构建树,请使用以下步骤: 循环遍

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

      ||
    /    \
  &&      && 
 / \     /  \
a   b   c    d
然后应用深度优先搜索遍历它们

有没有合适的图书馆可以这样做?
我在考虑Irony或Roslyn,但我不确定。

我不知道库,但它可以这样实现

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

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

  • 如果字符不是运算符,则将其推入堆栈

  • 如果字符是运算符,则弹出两个操作数并使其成为其子操作数 并将当前节点推入堆栈

  • 最后,堆栈中唯一的元素将是您的树


  • 请参阅此文件以了解该算法的实现

    实际上,您可以使用解析器生成器库来实现您的结果,但对于一个简单的任务来说,这太过分了

    您可以如下定义自己的小语法(我使用“+”而不是“| |”和“.”来代替“&&”。用符号替换它们,同时对递归下降解析器代码进行适当的代码更改):

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

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


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

    您要找哪种(二叉)树?请您提供所需的树,例如,
    a&&b|c&&d
    (问题中的示例)?@DmitryBychenko我将树示例添加到帖子中。@DmitryBychenko只是“&&”和“| |”操作。谢谢您的解决方案。但它对后缀表达式有效。我使用了您的提示和一些更改来编写自己的代码。非常感谢。是的,我的错,它对后缀表达式有效。不管怎样,我很乐意帮忙:)你如何评估这棵树?
    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);
    }