我正在尝试将"a && b || c && d"
或"(a && b) || (c && d)"
之类的逻辑表达式字符串转换为二叉树结构:
||
/ \
&& &&
/ \ / \
a b c d
然后应用深度优先搜索来遍历它们。
是否有适当的库可以做到这一点? 我当时在考虑反讽或罗斯林,但不确定。
答案 0 :(得分:2)
我不知道一个库,但是可以这样实现。
您想要的基本上是给定表达式(按顺序遍历)中的表达式树
要构建树,请使用以下步骤: 遍历表达式
如果该字符不是运算符,则将其推入堆栈。
如果字符是一个运算符,则弹出两个操作数并将其作为其子级 并将当前节点推入堆栈。
最后,堆栈中只有元素是您的树。
有关算法的实现,请参考此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链接可能会有用。