由于我有一点java基础,所以就没下Antlr编辑器,自己在命令行编译的程序。
先按getting start 中说的,将jdk, antlr环境变量设置好。
然后在文件夹下建一个记事本文件,写入以下代码
1 grammar Expr; 2 3 @header { 4 import java.util.HashMap; 5 } 6 7 @members { 8 /** Map variable name to Integer object holding value */ 9 HashMap memory = new HashMap(); 10 } 11 12 prog: stat+ ; 13 14 stat: expr NEWLINE {System.out.println($expr.value);} 15 | ID '=' expr NEWLINE 16 {memory.put($ID.text, new Integer($expr.value));} 17 | NEWLINE 18 ; 19 20 expr returns [int value] 21 : e=multExpr {$value = $e.value;} 22 ( '+' e=multExpr {$value += $e.value;} 23 | '-' e=multExpr {$value -= $e.value;} 24 )* 25 ; 26 27 multExpr returns [int value] 28 : e=atom {$value = $e.value;} ('*' e=atom {$value *= $e.value;})* 29 ; 30 31 atom returns [int value] 32 : INT {$value = Integer.parseInt($INT.text);} 33 | ID 34 { 35 Integer v = (Integer)memory.get($ID.text); 36 if ( v!=null ) $value = v.intValue(); 37 else System.err.println("undefined variable "+$ID.text); 38 } 39 | '(' expr ')' {$value = $expr.value;} 40 ; 41 42 ID : ('a'..'z'|'A'..'Z')+ ; 43 INT : '0'..'9'+ ; 44 NEWLINE:'\r'? '\n' ; 45 WS : (' '|'\t')+ {skip();} ;
另存为Expr.g。
再新建一个记事本,写入以下代码:
1 import org.antlr.runtime.*; 2 public class Test { 3 public static void main(String[] args) throws Exception { 4 ANTLRInputStream input = new ANTLRInputStream(System.in); 5 ExprLexer lexer = new ExprLexer(input); 6 CommonTokenStream tokens = new CommonTokenStream(lexer); 7 ExprParser parser = new ExprParser(tokens); 8 parser.prog(); 9 } 10 }
另存为Test.java
打开控制台到存储以上两个文件的地方
输入:
java org.antlr.Tool Expr.g
javac Test.java ExprLexer.java ExprParser.java
第一行是编译.g文件,会成生 Expr.tokens ExprLexer.java ExprParser.java
第二行将.java文件都编译
然后输入:
java Test.java就会运行
系统等待你的输入,按Antlr给定的输入:
x=1
y=2
3*(x+y)
然后按一下Ctlr+C,就会得到结果。
有点小兴奋,在实验室调了不一会就调出来,在寝室怎么也没调出来,环境变量什么的设置都是一样的,我还在找原因。