antlr-(一)语言编译的简化

antlr-(一)语言编译的简化

  要定义一种语言,你只要按照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();
        }

    }

}

 

你可能感兴趣的:(antlr-(一)语言编译的简化)