在上一篇文章中,我们成功学会了如何搭建Antlr4+eclipse的开发环境,这篇博文中主要介绍一个简单的antlr应用——简单计算器的实现,帮助大家快速上手antlr。
为了使其保持简单,我们只涉及简单的加减乘除括号表达式,以及整数和变量。(此例子引用自Antlr官方参考手册,是一门必备手册)
我们先来设计词法规则和语法规则。
词法规则:
ID : [a-zA-Z]+ ; // matchidentifiers
INT : [0-9]+ ; // match integers
NEWLINE:'\r'? '\n' ;//return newlinesto parser(end-statement signal)
WS : [ \t]+ -> skip ;// skip space and tab
和官方的Demo比起来我们就多写了一条词法规则,即我们定义了一个NEWLINE。即一个或多个空行。用于匹配我们的后续的语法规则(因为要计算多条算数表达式要换行)。
为了后续的计算的方便性,我们再定义一下加减乘除。
MUL : '*' ;
DIV : '/' ;
ADD : '+' ;
SUB : '-' ;
再来看语法规则。
首先我们要定义表达式expr.
表达式可以是数字(INT),也可以是标识符(ID),也可以是加减乘除表达式,也可以是括号表达式。所以我们的expr的定义如下:
expr:expr op=('*'|'/') expr
| expr op=('+'|'-') expr
| INT
| ID
| '(' expr ')'
;
接着我们要定义语句stat
语句可以是表达式+换行符,可以是声明变量的语句,也可以是空行
定义如下:
stat: expr NEWLINE
|ID '=' expr NEWLINE
|NEWLINE
;
最后定义我们的program.即多个语句
prog: stat+;
好了至此我们的语法和语义规则就定义完成了。
接下来为了以后的运算的方便性,我们还需要给每一步规则打上标签,标签以”#”开头,出现在每一条规则的右边。打上标签后,antlr会为每一个规则都生成一个事件。(这里看不懂的暂时先记下,看到后面的代码就明白了这步的作用了)。于是我们的整个g4文件定义如下。
grammar LabeledExpr;
/** The start rule; beginparsing here. */
prog:stat+;
stat: expr NEWLINE # printExpr
| ID '=' expr NEWLINE # assign
| NEWLINE # blank
;
expr:expr op=('*'|'/') expr # MulDiv
| expr op=('+'|'-') expr # AddSub
| INT # int
| ID # id
| '(' expr ')' # parens
;
ID : [a-zA-Z]+ ; // matchidentifiers
INT : [0-9]+ ; // match integers
NEWLINE:'\r'? '\n'