ANTLR学习心得——准备工作与第一个例子

二、准备工作
 
  我这里的介绍,只针对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,各位可以自己去看看,研究一下。

 

(未完待续)

你可能感兴趣的:(java,eclipse,工作,python,vc++)