[英]Scala parser combinators vs ANTLR/Java generated parser?
我正在為主要用 Scala 編寫的應用程序編寫表達式解析器。 我已經在 Scala 中構建了 AST 對象,現在需要編寫解析器。 我聽說過 Scala 的內置解析器組合器,也聽說過 ANTLR3,我想知道:哪個會提供更好的性能和更容易編寫代碼? 迄今為止:
ANTLR 優點
ANTLR 的缺點
解析器組合器的優點
解析器組合器的缺點
有什么想法嗎?
編輯:這個表達式解析器解析代數/微積分表達式。 最終確定后,它將在 Android 版 Magnificalc 應用程序中使用。
Scala 的解析器組合器效率不高。 它們不是被設計的。 它們適合用相對較小的輸入來完成小任務。
所以這真的取決於你的要求。 ANTLR 不應該有任何互操作問題。 從 Java 調用 Scala 可能會很麻煩,但從 Scala 調用 Java 幾乎總是有效。
除非您打算解析幾頁長的代數表達式,否則我不會擔心解析器組合器的性能限制。 Programming Scala 一書確實提到解析器組合器的更有效實現是可行的。 也許有人會抽出時間和精力寫一篇。
我認為對於 ANTLR,您正在談論兩個額外的構建步驟:ANTLR 編譯為 Java,並且您需要將 Scala 和 Java 編譯為字節碼,而不僅僅是 Scala。
我已經使用 ANTLRv4 和 Scalas 解析器組合器創建了外部 DSL,我顯然更喜歡解析器組合器,因為在設計語言時您可以獲得出色的編輯器支持,並且很容易將解析結果轉換為任何 AST 案例類數據結構。 開發 ANTLR 語法需要更多時間,因為即使有 ANTLRWorks 編輯器支持,開發語法也很容易出錯。 與解析器組合器的工作流程相比,整個 ANTLR 工作流程讓我感覺非常臃腫。
我傾向於嘗試使用解析器組合器生成外部DSL。 它不需要是內部 DSL。 但我不知道這樣會更好。
解決這個問題的最佳方法是采用語法的簡化版本,嘗試兩種方式並評估差異。
剛剛為自制 8 位 CPU 匯編器編寫解析器。
在覺得必須有更好的方法之前,我已經使用 Antlr4 走了這么遠。 我決定嘗試一下 Scala 解析器組合器,不得不說它的效率更高,恕我直言。 但是,我確實知道 Scala。
如果您仍然對整數表達式解析器感興趣,請在此處查看我的示例解釋器: https : //github.com/scala-szeged/hrank-while-language 。 這是使用官方解析器組合器的 20000 行 Scala 代碼。 它有表達式解析。 它還處理嵌套 if、嵌套 while、變量和布爾表達式。 我還在這個 github 存儲庫中實現了數組處理。 如果您需要字符串處理,我也可以幫助您。
另一個更簡單的表達式解析器也存在於我的其他公共存儲庫https://github.com/scala-szeged/top-calc-dsl
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.