我有一個應用程序,其中包含一個3運算符(& |!)布爾表達式求值程序,包含變量和常量。一般來說,表達式不會太長(最多可能是50個詞,但通常會少很多)。可以有很多表達方式 - 我預計上限約爲一百萬。目前我有一個用一個非常簡單的評估器編寫的解析器,只需遞歸遍歷解析樹。一個限制是它必須從C++中調用。表達式之間沒有共享。我想調查這個速度。快速布爾表達式求值器
我看到了兩條研究途徑。
- 添加共享並存儲指示表達式節點是否已被評估的狀態。
- 提取常見子表達式。
另外我希望代碼生成方法比解析樹或類似結構上的解釋方法更快。生成一些C++代碼可能相當簡單,但考慮到函數的長度,我不知道像GCC這樣的編譯器是否能夠優化CSE。
我已經看到有幾個庫可用於表達式評估,但在我的工作環境中添加第三方庫並不簡單,再加上它們都與我的需求相比看起來非常複雜。
最後,我最近一直在看Antlr4,所以這可能適合我。在過去,我從事C代碼生成工作,但是我沒有使用LLVM之類的東西來進行優化和代碼生成。
任何建議走哪條路?
解析和lex的運行時間不應該是一個問題。這是一個獨立於評估的階段,可能會有幾天的運行時間。所以即使幾個小時的解析lex階段也不成問題。評估速度是關鍵。 –
啊我明白了。然後誤解你的問題。 ANTLR中的評估可能非常有效。有一種稱爲Mu的語法,我用它作爲運行時表達式解釋器的基礎。 [鏈接](https://github.com/bkiers/Mu/tree/master/src/main/antlr4/mu)。 – TomServo