2013-01-12 55 views
2

我有一個像下面解析縮進列表爲布爾樹

foo 
and foo2 
and bar 
    or something 
    and somethingElse 
     or somethingElse2 
     or somethingElse3 
and baz 
    or godknows 
    or godknows2 

這一段文字應被解釋爲:

(
      foo 
      && foo2 
    && (bar || (something && (somethingElse || somethingElse2 || somethingElse 3))) 
    && (baz || godknows || godknows2) 
) 

在我逐行讀取線的那一刻。我知道我需要測量縮進並解析下一行的表達式,以便找出當前行所屬的表達式,但我很難找出如何有用地做到這一點,而不會消耗下一行。

這似乎是一種具有遞歸解決方案的問題,但它逃避了我。

輸入格式不固定,我只是希望能夠將相對可讀的表達式轉換爲布爾值樹,所以如果您可以用更合適的格式來回答這個問題,那麼請繼續閱讀:

回答

2

使用這種縮進風格的Python通過維護一系列縮進級別來解析它。在看到一條新線後,通過查看當前深度是否增加,確定它是否從上一行縮進。如果是這樣,Python假裝有一個名爲「INDENT」的不可見符號被插入到輸入流中。然後它將新的深度推入堆棧。

如果縮進減少,Python會反覆彈出堆棧並假裝一個名爲「DEDENT」的不可見符號被插入到輸入流中,直到縮進級別與堆棧上的值匹配爲止。

通過用(和)替換「INDENT」和「DEDENT」,您很可能很容易地調整此方法。之後你需要做一些小改動,確保(令牌插入前一個變量之前,但我認爲這並不難)

有了這個改變,你應該能夠解析這個極易例如,腳本

A 
and B 
    or C 
     and D 
or E 

會變成

A and (B or (C and D))) or E 

希望這有助於!

+0

非常感謝的快速反應:) – user1671701

+0

按下在我之前的評論中輸入得太早,但額外的隱形令牌聽起來確實完美,我會給它一個去,謝謝! – user1671701