antlr入门实例——计算器

本文介绍了使用ANTLR4和Eclipse创建一个简单的计算器应用程序的步骤。计算器支持加减乘除和括号表达式,涉及词法规则和语法规则的设计,并通过Visitor模式遍历语法树进行计算。在ANTLR项目完成后,将生成的Java文件导入新的Java项目,实现了对表达式的计算和输出。
摘要由CSDN通过智能技术生成

在上一篇文章中,我们成功学会了如何搭建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' 
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值