簡體   English   中英

在C#中將布爾表達式的字符串轉換為樹結構

[英]Convert string of boolean expression to tree structure in C#

我正在嘗試將邏輯表達式的字符串(例如"a && b || c && d""(a && b) || (c && d)"轉換為二叉樹結構:

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

然后應用深度優先搜索進行遍歷。

有沒有合適的庫可以做到這一點? 我當時在考慮反諷或羅斯林,但不確定。

我不知道一個庫,但是可以這樣實現。

您想要的基本上是給定表達式(其有序遍歷)中的表達式樹

要構造樹,請使用以下步驟:遍歷表達式

  1. 如果該字符不是運算符,則將其推入堆棧。

  2. 如果該字符是一個運算符,則彈出兩個操作數並使其成為其子級,然后將當前節點壓入堆棧。

  3. 最后,堆棧中只有元素是您的樹。

請參考此鏈接以實現算法。

實際上,您可以使用諸如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM