最近打算重做以前的一個留下遺憾的工作,當中的一項小任務就是要求編寫一個簡易SQL語言的文法分析器。
本科的《編譯原理》課程依稀在我腦中留下些許映象。當初的課程大作業是寫一個叫Dicuf(貌似是這麼發音)的編譯器,在萬惡的助教的鞭策下,我們使用了Lex和Yacc成功逃離了恐怖之獄。現在又要拾起編譯來,還是有些挑戰性的。
善其事,利其器。在網路上一番東遊西逛,我對於時興的一些文法分析器自動產生工具有了點瞭解。現總結如下,以資參考。
它生於Unix,是最經典的詞法/文法分析器,是經典教材中的樣本禦用工具。現在它也支援在Windows上產生(安裝環境),然而其所產生文法分析器的語言僅有C語言。
與前者類似,Bison與Yacc有很高的相容性。產生語言為C、C++和Java。
較早的一個文法分析器產生工具。其產生文法分析器的語言極其之多,包括C#、 Java、 C++、F#、VB.Net、Oberon等等。
作為翻譯程式的一部分,你可以使用簡單的操作符和動作來參數化你的文法,使之告訴ANTLR怎樣去建立抽象文法樹(AST)和怎樣產生輸出。ANTLR知道怎樣去產生識別程式,產生文法分析器的語言套件括Java,C++,C#. 文法有點麻煩。
它是一個較為複雜的分析器,支援語言貌似最多。產生語言套件括(官網說的):Assembly - Intel x86 、ANSI C、C#、D、Delphi、Java、Pascal、Python、Visual Basic、Visual Basic .NET、Visual C++、所有.NET語言、所有ActiveX語言。難以想象這居然是個免費的軟體。
這是一個C#和Java的文法剖析器產生器(Parser Generator或叫作編譯器的編譯器:Compiler Complier) 。它相對於其它一些類似的工具如yacc和ANTLR有了更好的改進。這是因為Grammatica:
1.建立了更好的注釋和易讀的原始碼.
2.擁有錯誤自動回復並能夠詳述錯誤資訊.
3.支援文法/詞法測試與調試.
它是用JAVA開發的最受歡迎的文法分析產生器之一。它還提供JJTree等工具來協助我們建立文法樹。它還有一個用於輔助JavaCC應用程式開發的Eclipse外掛程式.產生文法分析器語言為java。
還有很多文法分析器產生工具,比如JFlex、SableC、Beaver、JTopas、Runcc、CUP、SJPT、Chaperon。但我實在是沒精力一一介紹了,之前實在沒想到這工具如此繁多。
最後我選擇了Grammatica,因為我需要C#語言的文法分析器,而且要求足夠簡單:)
我利用Grammatica的一個樣本產生了一個C#的文法分析器,並移植到Silverlight項目上(由於另一個項目需要),目前運行良好。由於.Net與Silverlight.Net非常相像,這個移植工作比想象中要容易。不過,我不太贊成將文法分析器放到Web上,這樣會使用戶端明顯增大,一種可以考慮的做法就是將用於驗證功能的文法分析器封裝成Web服務放到伺服器端。