2011-03-14 27 views
5

我需要在Java中使用增強的Backus-Naur表達式解析器(RFC 5234)來驗證某些語言。爲了不重新發明輪子,我寧願使用現有的ABNF解析器的開源實現(如果已經存在的話)。用於Java的開源ABNF解析器實現?

我需要開放源代碼,因爲它允許我根據需要維護代碼。

有沒有人知道任何存在?

+0

如果您想驗證的語言已經有ABNF規範,這是一個好主意。如果他們不這樣做,你應該尋找一個解析器生成器系統,其中一些語言定義已經被編碼和測試。在這種特殊的形式主義中,我會驚奇地發現很多現有的語言定義。 – 2011-07-26 16:51:10

+1

@IraBaxter RFC822(電子郵件),RFC2045(MIME),RFC3501(IMAP)...實際上,我所使用的每個嚴肅的RFC都在ABNF中。 – djechlin 2013-12-03 00:39:54

+0

@djechlin:有趣。有多少實現直接使用ABNF? – 2013-12-03 01:29:39

回答

2

我所做的觀察發現Parse2(見拉爾夫回答)帶有一定的侷限性:

  • aparse不喜歡的意見,他們必須被移除以
  • 所有代碼生成之前手動聲明需要在該行
  • aparse不適用的「核心」 ABNF規則的末端用;結束定義RFC 5234,使他們有,如果你的語法是基於他們從RFC複製
  • APAR se不喜歡語法中的循環(例如S --> NT1 NT2 T1 ; NT1 --> S | T2 ; ...),並可能遇到無限循環。

這些觀察結果已經被Parse2的開發者證實。簡而言之:Parse2可以解析ABNF語法的一個子集,但如果您找到現有的ABNF語法並嘗試將其提供給軟件,它很可能會遇到問題。

如果您自己指定ABNF語法並記住這些限制,則該庫應該適合您。如果您必須使用現有的ABNF語法,則可能需要在代碼生成之前對語法進行額外的努力。

PS:Parse2庫源代碼當前不可用,即使編譯的二進制(Java字節碼)可以自由使用。

+0

進一步搜索ABNF解析器生成器,發現[Java APG] [1](生成需要運行GPL v2 +庫的代碼)和[abnf-parser-generator] [2](生成的代碼未獲得許可)。所以我能找到的最好的Java解析器生成器是[abnf-parser-generator],因爲它生成一個LR(1)[3]解析器,它非常強大。 [1] http://www.coasttocoastresearch.com/ [2] https://github.com/bqluan/abnf-parser-generator [3] http://en.wikipedia.org/wiki/ Canonical_LR_parser – Ray 2013-01-04 13:24:19