簡體   English   中英

Scala 解析器組合器與 ANTLR/Java 生成的解析器?

[英]Scala parser combinators vs ANTLR/Java generated parser?

我正在為主要用 Scala 編寫的應用程序編寫表達式解析器。 我已經在 Scala 中構建了 AST 對象,現在需要編寫解析器。 我聽說過 Scala 的內置解析器組合器,也聽說過 ANTLR3,我想知道:哪個會提供更好的性能和更容易編寫代碼? 迄今為止:

ANTLR 優點

  1. 知名
  2. 快速地
  3. 外部DSL
  4. ANTLRWorks(用於語法分析器調試/測試的優秀IDE)

ANTLR 的缺點

  1. 基於 Java(Scala 互操作可能具有挑戰性,有經驗嗎?)
  2. 在運行時需要很大的依賴

解析器組合器的優點

  1. 斯卡拉的一部分
  2. 少一個構建步驟
  3. 不需要運行時依賴; 例如已經包含在 Scala 的運行時庫中

解析器組合器的缺點

  1. 內部 DSL(可能意味着執行速度較慢?)
  2. 沒有 ANTLRWorks(提供很好的解析器測試和可視化功能)

有什么想法嗎?

編輯:這個表達式解析器解析代數/微積分表達式。 最終確定后,它將在 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.

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