2010-04-03 24 views
0

要具有能夠提取多種語言的內聯文檔的通用文檔系統,需要爲每種語言提供解析器。因此需要解析器生成器(實際上不必是完整的或高效的)。用於內聯文檔的解析器生成器

http://antlr.org/是一個很好的解析器生成器,它已經有了一些流行語言的語法。是否有更好的替代方案,即更簡單的替代方案,它們支持爲即開即用的更多語言生成解析器?

+0

更簡單的解析器生成器來處理*更多*語言?解析器生成器的原因很複雜,它處理許多語言似乎帶來的無數複雜問題。 – 2010-04-04 04:42:18

+0

查看SO問題的答案Source of Parsers for Programming Languages 2010-04-04 04:40:47

回答

0

如果您只是在尋找「部分解析」,那麼您可以使用ANTLR的選項來部分「分離」一個標記流並忽略其餘的標記。你可以通過使用詞法分析器來啓用filter=true。詞法分析器然後試圖匹配您在語法中定義的任何標記,並且當它與某個標記不匹配時,它會推進一個單個字符(並忽略它),然後再次嘗試在下一個字符處匹配您的標記之一:

lexer grammar Foo; 

options {filter=true;} 

StringLiteral 
    : ... 
    ; 

CharLiteral 
    : ... 
    ; 

SingleLineComment 
    : ... 
    ; 

MultiLineComment 
    : ... 
    ; 

如果部署得當,你可以從一個Java文件MultiLineComment S(/* ... */)很容易,而不必擔心的單行註釋和與字符串或字符文字搞亂的東西了。

顯然,您的源文件需要有效才能正確標記文件,否則會得到奇怪的結果!

-1

我在哪裏工作我們曾經使用過GOLD Parser。 Antlr很簡單,並且支持多種語言。之後我們轉向Antlr,但是由於我們需要做更復雜的解析,所以我們發現Antlr比GOLD更好。

+0

GOLD AFAIK是一個純粹的LALR(1)解析器生成器,例如它就像Bison和YACC一樣。這種解析器生成器的缺點是幾乎每一個真正的計算機編程語言都沒有自然的LALR(1)語法,因此需要巨大的能量來彎曲和扭曲語法以適應LALR(1)解析器生成器,包括GOLD 。 LALR(1)解析器生成器僅適用於設計爲具有LALR(1)語法的領域特定語言。 – 2010-04-04 16:47:29

0

我的編譯器使用Dypgen。這是一個用戶可擴展的GLR解析器,它具有豐富的豐富功能,因此它可以解析許多語言。引導語法是EBNF類似的(它直接在您的製作中支持* +和?)。它足夠強大,可以動態加載擴展,這是我的編譯器利用的一個事實:我的編程語言的大部分語法都是在編譯器啓動時動態加載的。

Dypgen在Ocaml中編寫並生成Ocaml代碼。

有一個名爲Elkhound的C++ GLR解析器,它功能強大,足以解析大多數C++。

但是,對於您的實際需求,您並不需要進行任何嚴肅的解析:正則表達式匹配引擎可能足夠好。 Googles re2可能是合適的(提供大多數PCRE功能,速度更快並且具有C++接口)。

雖然這不太準確,但它足夠好,因爲您可以要求內聯文檔遵循一些簡單的格式。正因爲如此,大多數現有的內聯文檔已經這樣做了。