最近,項目中需要用到做一個小的編譯系統。
熟悉編譯原理的人一定知道lex和yacc。他們就是俗稱的編譯器的編譯器。
如果需要做詞法分析和語法分析,可以使用這兩個工具。
但是lex和yacc都是基於c語言的,而且自動生成的語言有很多宏定義十分難懂。
(lex的開源實現有flex,yacc的開源實現有bison).
我使用flex和bison自動生成了一下,生成的代碼在vc中使用有很多問題,需要修正。
(網上有些兄弟介紹了修正的方法)。
後來發現了ANTLR這個工具。ANTLR是開源的工具。
ANTLR具有面向對象的特點,自動生成的代碼易於讀懂,而且能生成c# ,java,c++等很多代碼。我個人認爲是一個比較好的,可以取代lex和yacc的工具。
下面介紹ANTLR的安裝步驟,然後用一個小的例子來結束:
1。ANTLR需要java的支持,首先安裝jdk。
安裝完畢JDK後需要設置好系統的環境變量,(熟悉java的哥們可以估計很熟悉下面)
如下:
(1)新建一個環境變量 JAVA_HOME=D:\Java\jdk1.6.0_03
(2)爲Path環境變量添加 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
(3)新建環境變量 CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;
2。開始安裝ANTLR,我使用時的最新版本爲3.0.1
ANTLR也提供了工具 ANTLRWorks 可以編輯語法文件。
安裝完畢後就需要設置環境變量
爲 CLASSPATH 添加:D:antlr-3.0.1\lib\antlr-3.0.1.jar;D:antlr-3.0.1\lib\antlr-runtime-3.0.1.jar;D:\antlr-3.0.1\lib\stringtemplate-3.1b1.jar;D:\antlr-3.0.1\lib\antlr-2.7.7.jar;
其中 D:antlr-3.0.1爲我安裝ANTLR的目錄。你要修改爲你的安裝目錄。
因爲 ANTLR v3是使用v2和stringtemplate寫的,所以這兩個jar都得加入CLASSPATH。
3。可以開始編輯語法文件了。編輯語法文件的過程在後面介紹。
這裏介紹生成的命令:
java org.antlr.Tool SimpleC.g
其中 SimpleC.g爲你的語法文件的名稱。
ANTLR v3的語法與v2有所不同。我也研究了好久。
你也可以直接下載ANTLR v3的例子,自己研究,
如果你有V2的語法文件,ANTLR的網站上也有v2到v3的轉換程序可以使用。
有一點需要注意的是,當你使用ANTLRWorks時,將x.g文件放在中文目錄下,
如果x.g中定義了一個grammar,他會自動生成一個詞法x__.g的文件。中間會有
文件註釋,ANTLRWorks會報錯。
下面介紹一個簡單的加法計算的語法文件:(V3)
grammar Caculator;
options
{
language = CSharp;
output=AST;
ASTLabelType=CommonTree;
}
{
language = CSharp;
output=AST;
ASTLabelType=CommonTree;
}
@header
{
}
{
}
expr : INT PLUS INT;
PLUS : '+'
;
INT : ('0'..'9')+
;
;
INT : ('0'..'9')+
;
切記文件名稱也要爲 Caculator.g
自動會生成兩個文件,分別是兩個類 CaculatorLexer和CaculatorParser
更復雜的應用,我正在研究。
最後推薦一個資料: