前言
在前一篇博客已经介绍了如何在eclipse中安装antlr插件,这篇博客中就来用它做一个计算器小程序。
为了使程序简单一点,这里只涉及基本的加减乘除以及括号运算。
定义词法
ID : [a-zA-Z]+ ; // 变量可以为大写小写字母的任意组合
INT : [0-9]+ ; // 运算数为整数的任意组合
NEWLINE:'\r'? '\n' ;//匹配换行
WS : [ \t]+ -> skip ;//跳过空格和 \t
定义运算符
MUL : '*' ; //乘法
DIV : '/' ; //除法
ADD : '+' ; //加法
SUB : '-' ; //减法
定义语法
首先我们定义表达式 :expr
表达式可以是数字(INT),变量(ID),可以是加减乘除运算表达式,也可以是括号表达式。
所以 expr 的定义如下:
expr:expr op=('*'|'/') expr # MulDiv
| expr op=('+'|'-') expr # AddSub
| INT # int
| ID # id
| '(' expr ')' # parens
;
然后定义语句: stat
语句可以使 表达式 + 换行,可以是 变量声明,也可以是 空行
stat: expr NEWLINE # printExpr
| ID '=' expr NEWLINE # assign
| NEWLINE # blank
;
最后定义我们的 prog
我们的 prog 可以有多个的语句,即:
prog:stat+;
到这里我们的所有的语法以及词法规则就已经定义好了!
然后我们要注意一下几点:
- 语法规则是小写字母开头,词法规则是大写字母开头。
- 每一个规则后面都要需要有一个标签 ,以 # 开头,后面接标签内容。在 antlr 为每一个规则生成事件的时候会用到(后面会讲到)。
这时候我们生成的所有的文件内容如下:
grammar CalExpr;
stat :expr NEWLINE #printExpr
|ID '=' expr NEWLINE #assign
|NEWLINE #blank
;
expr : expr op=('+'|'-') expr # AddSub
| expr op=('*'|'/') expr # MulDiv
| ID # id
| INT # int
| '(' expr ')' # parens
;
ID : [a-zA-Z]+ ;
INT : [0-9]+ ;
NEWLINE : '\r' ? '\n';
WS : [ \t]+ -> skip;
ADD : '+' ;
SUB : '-' ;
MUL : '*' ;
DIV : '/' ;
运行程序
上面的规则定义好了,我们来运行一下吧!
如上图:右击点击run as -> External tools configurations
将 Arguments里面内容改为:
-no-listener -visitor -encoding UTF