二、准备工作
我这里的介绍,只针对Java程序员,非java程序员,同样可以很方便的使用ANTLR,比如:C#、C++、Python。只是我这里就不多讲了。
Peter Morling's tutorial (C++ output)
这是一篇介绍给C++程序员的教程,但是里面使用VC++ 6.0做为开发IDE的,下次我有时间了,再去研究研究Dev-C++去
要开始使用ANTLR,需要下载以下内容:
antlr-2.7.5.exe:把这个exe文件放在硬盘里的某一个地方,然后设置添加一个PATH,以后就可以在任意目录下,使用这个工具了。
antlr-2.7.5.tar.gz:这是antlr最新的源代码,慢慢研究。
Eclipse SDK 3.1:这个总是要的吧。
解压缩antlr-2.7.5.tar.gz。有两个目录特别值得关注,一个是anltr,里面是antlr的源码,你可以在Eclipse里建一个Antlr项目,将这里的源码导入进去,以后慢慢研究。另外一个是examples目录,里面有四种语言的例子,我们只需要关系java的例子就可以了。
三、Hello World
ANTLR-LexerExample,这可以算是ANTLR中,最简单的一个例子了。我们试着在Eclipse里跑一遍。
在Eclipse里新建一个项目,比如就叫Simple。下载这个
simple.g文件,放在Simple的src目录下。然后在DOS窗口下,执行“ANTLR simple.g”命令。
回到Eclipse项目窗口,刷新项目,你会发现多了两个个java程序,SimpleLexer.java;SimpleLexerTokenTypes.java,还有一个文本文件:SimpleLexerTokenTypes.txt。
再新建一个测试类Main.java。
import java.io.*; public class Main { public static void main(String[] args) { SimpleLexer simpleLexer = new SimpleLexer(System.in); while(true) { try { simpleLexer.nextToken(); } catch(Exception e) {} } } } |
运行这个程序,然后在控制台随便输入一些字符、数字之类的东西,最后以“.”结尾。这个程序就会打印出一些内容来了。比如,你可以输入:
This Lexer recognises strings and numbers: hello 22 goodbye 33.
程序就会输出:
Found alpha: This
Found alpha: Lexer
Found alpha: recognises
Found alpha: strings
Found alpha: and
Found alpha: numbers
Found alpha: hello
Found numeric: 22
Found alpha: goodbye
Found numeric: 33
并且结束。如果你不输入最后的“.”,那么就还能继续使用这个程序。
这是怎么弄的呢?让我们来看看那个simple.g文件。
class SimpleLexer extends Lexer; options { k=1; filter=true; } ALPHA : ('a'..'z'|'A'..'Z')+ { System.out.println("Found alpha: "+getText()); } ; NUMERIC : ('0'..'9')+ { System.out.println("Found numeric: "+getText()); } ; EXIT : '.' { System.exit(0); } ; |
class SimpleLexer extends Lexer;
表明我们想定义一个词法分析的类,SimpleLexer。
options的内容我们先跳过,下次再说。
ALPHA、NUMERIC、EXIT是SimpleLexer声明的,它能够认识的三种词。字母、数字和结束符。当词法分析器,发现了一个以上的,连续的,大小写英文字母的时候,它就认为自己遇到了字母;如果发现了一个以上连续的数字0~9时,它就认为自己遇到了数字,EXIT也同理可知。
{}中的代码,则是告诉词法分析器,在发现了某种词之后,可以做的动作。
最终生成的SimpleLexer.java;SimpleLexerTokenTypes.java,各位可以自己去看看,研究一下。
(未完待续)