antlr4 - 整型计算器的实现

说明

基于maven的java代码实现antlr4整型计数器

maven依赖

    <dependency>
        <groupId>org.antlr</groupId>
        <artifactId>antlr4-runtime</artifactId>
        <version>4.13.1</version>
    </dependency>

g4文件

grammar Caculator;

options {
    caseInsensitive = true;
}

run: expr EOF;

expr
    : BRACKET expr BRACKET
    | expr MUL expr
    | expr DIV expr
    | expr ADD expr
    | expr SUB expr
    | INT
    ;

INT: [0-9]+;
MUL: '*';
DIV: '/';
ADD: '+';
SUB: '-';
BRACKET: '(' | ')';

NW: [\r\n\t ] -> skip;

visitor解析

package com.chenjie.caculator;

import org.antlr.v4.runtime.tree.ParseTree;

import java.util.Objects;

public class MyCaculatorVisitor extends CaculatorBaseVisitor<Integer>{
    private Integer data = null;

    @Override
    public Integer visit(ParseTree tree) {
        return super.visit(tree);
    }

    @Override
    public Integer visitRun(CaculatorParser.RunContext ctx) {
        if (Objects.nonNull(ctx.expr())){
            data = visitExpr(ctx.expr());
        }
        return data;
    }

    @Override
    public Integer visitExpr(CaculatorParser.ExprContext ctx) {
        Integer value = null;
        if (Objects.nonNull(ctx.MUL())){
            for (CaculatorParser.ExprContext exprContext : ctx.expr()){
                int temp = visitExpr(exprContext);
                value = Objects.isNull(value) ? temp : value * temp;
            }
            return value;
        }
        if (Objects.nonNull(ctx.DIV())){
            for (CaculatorParser.ExprContext exprContext : ctx.expr()){
                int temp = visitExpr(exprContext);
                value = Objects.isNull(value) ? temp : value / temp;
            }
            return value;
        }
        if (Objects.nonNull(ctx.ADD())){
            for (CaculatorParser.ExprContext exprContext : ctx.expr()){
                int temp =visitExpr(exprContext);
                value = Objects.isNull(value) ? temp : value + temp;
            }
            return value;
        }
        if (Objects.nonNull(ctx.SUB())){
            for (CaculatorParser.ExprContext exprContext : ctx.expr()){
                int temp = visitExpr(exprContext);
                value = Objects.isNull(value) ? temp : value - temp;
            }
            return value;
        }
        if (!ctx.BRACKET().isEmpty()){
            return visitExpr(ctx.expr(0));
        }
        if (Objects.nonNull(ctx.INT())){
            return Integer.valueOf(ctx.getText());
        }
        return value;
    }
}

测试

package com.chenjie.caculator;

import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;

public class Main {
    public static void main(String[] args) {
        String expr = "1 + 3 * 4 / (4 - 2)";
        CaculatorLexer lexer = new CaculatorLexer(CharStreams.fromString(expr));
        CommonTokenStream token = new CommonTokenStream(lexer);
        CaculatorParser parser = new CaculatorParser(token);
        CaculatorParser.RunContext ctx = parser.run();
        MyCaculatorVisitor visitor = new MyCaculatorVisitor();
        Integer vallue = visitor.visit(ctx);
        System.out.println(vallue);
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值