说明
基于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);
}
}