antlr之起步篇

现在从网上google到的信息来看antlr比较成熟的版本就是antlr-2.7.5使用起来配置也不是特别的麻烦,这里先提供一个傻瓜式的起步说明:
1、下载antlr-2.7.5
2、如果要使用其来处理相关于Java的事务,需要把它加入到classpath中
3、写一个以.g结束的乱七八糟的说明(我对编译原理等一壳不通,不知道通过antlr我能提高多少)
4、使用它的tool来生成我们期待的java源文件
5、书写测试类来验证生成的东西是否按照了我们的预期来执行

这里首先描述一下我们的预期是一种什么样的情况:
   完成两个字符串的合并
要求:
   1、程序接收数字(0,1,2...9)或者('a','b'..'z')或者('A','B'..'Z'),而对于除此之外的一些字符被认为是不合适的。
   2、合并的操作符号为'+'
  
根据上面的描述我们的预期应该是:
   if input aa+bb output aabb

   if input a1+b output a1b
   if input %+#  alert error
这里首先描述下使用.g怎么限制输入为合适的字符:
    STRING   : ('0'..'9'|'A'..'Z'|'a'..'z')+ ;
这里STRING,: () |应该有其自身需要代表的意思,暂且不理会他们,STRING是自己随便其的一个别名,只要你愿意叫什么都可以。

接下来定义我们需要的操作符号'+'
    ADD  : '+' ;
同样这里的ADD是随便其的。经过这两步的处理之后,我们基本搞定了“要求”中1、2的限制。

接下来就是如何处理"字符串"合并这一动作了:
   首先简单描述一下合并的方法,因为在Java中'+'作用于字符串的时候就是合并,这就是出发点:
   定义一个方法,返回类型为String,默认情况下返回null(这里的语意就是Java的那套)
实现后的最终结果就是:
expr returns [String value=null]
      :  a : STRING ADD b : STRING {
          String aValue = a.getText();
          String bValue = b.getText();
          value = aValue + bValue;
      };
这里我们注意到expr类似与处理'+'的方法名(是否只能叫这个我还不敢确定)
   returns [String value=null]表示expr的返回类型为java的String默认值为null
   : a : STRING ADD b :STRING表示了我们要在a和b两种满足STRING定义的东西上进行满足ADD的操作,而操作的实现有java的'+'完成

如果没有别的要求的话,这基本上完成了对.g文件的构思,象一切活动都需要规则一样antlr的.g也不例外,我们需要把限制条件和动作分配给不同的模块来完成我们预期的任务。而这一切主要由Lexer和Parser完成。Lexer主要涉及到“限制”,而Parser主要涉及到action。
经过规则限制后的.g文件如下:
class StrAddParser extends Parser;
expr returns [String value=0]
      :  a : INT PLUS b : INT {
          String aValue = a.getText();
          String bValue = b.getText();
          value = aValue + bValue;
      };

class StrAddLexer extends Lexer;
ADD  : '+' ;
STRING   : STRING   : ('0'..'9'|'A'..'Z'|'a'..'z')+ ;

当然,如果你想把这些生成的文件放置到名字为package com.snow.antlr;的包中,或者需要import一些类的话,可以在其前面加载header{
package com.snow.antlr;
import java.lang.String;
}来完成。为此最终的.g文件看上去就是

header {
package com.snow.antlr.stradd;
import java.lang.String;
}

class StrAddParser extends Parser;
expr returns [String value=null]
      :  a : STRING ADD b : STRING {
          String aValue = a.getText();
          String bValue = b.getText();
          value = aValue + bValue;
      };

class StrAddLexer extends Lexer;
ADD  : '+' ;
STRING   : ('0'..'9'|'A'..'Z'|'a'..'z')+ ;


最后保存它为stradd.g运行:
java antlr.Tool -o src\com\snow\antlr\stradd stradd.g
如果一切顺利,在src\com\snow\antlr\stradd下会输出几个.java文件,我们可以直接写测试类:
package com.snow.antlr.stradd;

/**
 *anwx<a href="mailto:[email protected]">An Weixiao</a>
 */
public class Test {
	 public static void main(String[] args) throws Exception {
	        StrAddLexer lexer = new StrAddLexer(System.in);
	        StrAddParser parser = new StrAddParser(lexer);
	        try {
	            System.out.println(parser.expr());
	        } catch (Exception e) {
	            System.err.println(e);
	        }
	    }
}

OK,今天的感性认识就是这样的…………

你可能感兴趣的:(Google,活动)