2010-06-22 85 views
9

我目前正在尋找一個從BNF文法(具有優先級和關聯性的ocamlyacc文件)生成Scala代碼的詞法分析器/解析器。我很困惑,因爲我幾乎沒有發現如何去做。Lexer /解析器從BNF文法生成Scala代碼

對於解析,我發現scala-bison(我有很多麻煩工作)。所有其他工具只是導入Scala的Java解析器(如ANTLR)。

對於lexing,我什麼也沒找到。

我還發現了著名解析器組合斯卡拉的,但(糾正我,如果我錯了),即使他們是相當有吸引力的,他們消耗了大量的時間和內存,這主要是由於回溯

所以,我有兩個主要問題:

  • 爲什麼人們似乎只專注於_parser組合子?
  • 什麼是您最好的詞法分析器/解析器生成器建議與Scala一起使用?

回答

7

作爲ScalaBison論文的作者之一,我遇到過幾次這個問題。 :-)我通常會在Scala中掃描的是使用JFlex。它與ScalaBison的工作非常出色,我們所有的基準測試都是使用該組合完成的。不幸的缺點是它確實生成了Java源代碼,因此編譯需要一些體操。我相信John Boyland(本文的主要作者)已經爲JFlex開發了Scala輸出模式,但我認爲它並沒有公開發布。

對於我自己的發展,我一直在用無掃描語法分析技術做了很多工作。 Scala 2.8的packrat解析器組合器相當不錯,儘管還沒有推廣。我已經構建了an experimental library,它在解析器組合框架中實現了通用解析。它的漸近界比傳統的解析器組合器好得多,但實際上恆定的時間開銷更高(我仍在研究它)。

+0

感謝您的答案和你的gll combinators,我會嘗試瞭解它是如何工作:) 但我想我會嘗試與JFlex和Scala一起玩。 – Vinz 2010-06-23 09:47:48

+1

感謝所有的教程(包括codecommit你的一些)我最終設法做一個簡單的詞法分析器/分析器與分析器combinators,沒有太多的遞歸..再次感謝! – Vinz 2010-06-23 20:06:35

3

Scala 2.8有一個packrat解析器。我從這裏API文檔引用:

Packrat解析是 實現回溯, 遞歸下降解析器,與 優點是,它保證了無限 先行和線性分析時的技術。 使用這種技術,也可以接受左遞歸 語法。

3

我知道這個問題很老,但對於那些仍然在尋找一個輸出Scala代碼的詞法生成器的人來說,我寫了a fork of JFlex that emits Scala而不是Java,包括相應的Maven和sbt插件。所有現在都可以在Maven Central上找到。

我們目前正在使用它(包括Maven/sbt插件)將英文文本標記爲FACTORIE中的自然語言處理管線的一部分 - 示例.flex文件包含Scala here

+0

太好了。我已經發布了JFlex 1.5 +規模https://github.com/moy/JFlex/releases,但它似乎是更新的,也更容易找到。 – 2016-02-09 19:11:05

+0

@JohnTangBoyland我希望在寫我的作品之前,我已經找到了你的版本! – 2016-02-09 22:49:55