最近,项目中需要用到做一个小的编译系统。
 
熟悉编译原理的人一定知道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 3.0.1 source distribution
      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;
}
@header
{
}
expr :  INT PLUS INT;
PLUS : '+'
 ;
INT : ('0'..'9')+
 ;

切记文件名称也要为 Caculator.g
自动会生成两个文件,分别是两个类 CaculatorLexer和CaculatorParser
 
更复杂的应用,我正在研究。
最后推荐一个资料: