Antlr首页计算机器实验成功

由于我有一点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,就会得到结果。

有点小兴奋,在实验室调了不一会就调出来,在寝室怎么也没调出来,环境变量什么的设置都是一样的,我还在找原因。

原文地址:https://www.cnblogs.com/zhengrui0452/p/2791340.html