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);
}