用 antlr 做一个计算器

前言在前一篇博客已经介绍了如何在eclipse中安装antlr插件,这篇博客中就来用它做一个计算器小程序。为了使程序简单一点,这里只涉及基本的加减乘除以及括号运算。定义词法ID : [a-zA-Z]+ ; // 变量可以为大写小写字母的任意组合INT : [0-9]+ ; // 运算数为整数的任意组合NEWLINE:'\r'? '\n' ;//匹配换行WS : [ \t]+ -> skip ;
摘要由CSDN通过智能技术生成
前言

在前一篇博客已经介绍了如何在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
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值