雪湖小札@blogjava

心情与技术文档同行 http://hi.baidu.com/jingleq

BlogJava 首页 新随笔 联系 聚合 管理
  24 Posts :: 2 Stories :: 4 Comments :: 0 Trackbacks

  要定义一种语言,你只要按照antlr的语法写一个.g文件,antlr便帮你完成其它的工作,简化至极,当然我使用了antlt studio工具。
  参考了antlr的经典书籍《The Definitive ANTLR Reference》写了一个小例子(姑且称之为语言),呵呵。
  我使用了antlr studio 1.1.0里面提供的antlr库,可能是版本问题,使用《The Definitive ANTLR Reference》里面的四则运算的例子居然通过不了,具汗``
  语法示例:我们可以这样输入(红色为我们的输入,黑色为输出)

i=4
j=6+5*3
c=i+j
c
> 25
j
> 21 
i = j*(3+1)
i
> 84
#
  要实现这个语言,我们的全部工作只要写一个antlr的.g文件和一个Main测试执行类。
  Sample.g
{
import java.util.HashMap
;//会出现在paser生成类头部
}
class SampleParser extends Parser
;
options {
    k 
=2; //定义了编译程序对输入字符串的预测深度默认是一
   
}

{
    HashMap memory 
= new HashMap();//出现在paser生成类的构造函数处
}

prog: (stat) + END
;//使用这个antlr版本,+?号前必加上( ),否则编译报错,出现的字符都必须在lexer里定义,不能出现如'='这种符号
stat {
    Integer e
;//申明action里使用到的变量
}:  NEWLINE
    | (id:ID EQ e
=expr NEWLINE) 
    {memory.put(id.getText()
, new Integer(e));}
    |(id1:ID NEWLINE) {
        Integer v 
= (Integer)memory.get(id1.getText());
        System.out.println(v);
    }| (e=expr NEWLINE) {System.out.println(e);};

expr returns 
[int value=0]{
    Integer e1
,e2;
}: 
    (e1
=multExpr) {value = e1;}
    ( ADD (e2=multExpr) {value += e2;}
    | DES (e2=multExpr) {value -= e2;})*;

multExpr returns 
[int value=0]{
    Integer at1
,at2;
}: 
    (at1
=atom) {value = at1;}(CH at2=atom{value*=at2;})*;

atom returns 
[int value=0]{
    Integer e
;
}: 
    (i:INT) {
        value 
= Integer.parseInt(i.getText());
    } | (id:ID)  {
        Integer v 
= (Integer)memory.get(id.getText());
        if ( v!=null ) value = v.intValue();
        else System.err.println("undefined variable "+id.getText());
    }| (KL e=expr KR){
        value 
= e;
    } ;

class SampleLexer extends Lexer
;
ID : ('a'..'z' |'A'..'Z' )+ ;
INT : ('0'..'9') + ;
NEWLINE: ('\r') ? '\n';
WS : (' ' |'\t' |'\n' |'\r' )+  ;
ADD: '+';
DES: '-';
CH: '*';
KL: '(';
KR: ')';
EQ: '=';
END: '#';

import antlr.RecognitionException;
import antlr.TokenStreamException;


public class Main {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        SampleLexer lexer 
= new SampleLexer(System.in);
        SampleParser parser 
= new SampleParser(lexer);
        
try {
            parser.prog();
        }
 catch (RecognitionException e) {
            e.printStackTrace();
        }
 catch (TokenStreamException e) {
            e.printStackTrace();
        }

    }

}

 

posted on 2007-06-19 19:33 csnowfox 阅读(1260) 评论(1)  编辑  收藏

Feedback

# re: antlr-语言编译的简化 2007-06-19 20:58 山风小子
是antlr2的写法  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: