[英]Convert string of boolean expression to tree structure in C#
我正在嘗試將邏輯表達式的字符串(例如"a && b || c && d"
或"(a && b) || (c && d)"
轉換為二叉樹結構:
||
/ \
&& &&
/ \ / \
a b c d
然后應用深度優先搜索進行遍歷。
有沒有合適的庫可以做到這一點? 我當時在考慮反諷或羅斯林,但不確定。
我不知道一個庫,但是可以這樣實現。
您想要的基本上是給定表達式(其有序遍歷)中的表達式樹
要構造樹,請使用以下步驟:遍歷表達式
如果該字符不是運算符,則將其推入堆棧。
如果該字符是一個運算符,則彈出兩個操作數並使其成為其子級,然后將當前節點壓入堆棧。
最后,堆棧中只有元素是您的樹。
請參考此鏈接以實現算法。
實際上,您可以使用諸如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類型的對象。
對於遞歸下降解析的介紹, 此鏈接可能很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.