weixin_42133456 2019-03-27 18:09 采纳率: 14.3%
浏览 480
已结题

Antlr如何将visit的return值传递到主函数呢?

我按照 antlr 教程编写了一个 antlr 的 .g4 文件,是实现简单的计算器算式匹配功能,然后编写了java程序进行测试,测试计算结果

编写的 .g4 文件如下

grammar LabeledExpr;
prog: stat+; 
//语句
stat: expr NEWLINE    #printExpr //语句可以是表达式+换行符
| expr                #printExpr2 //可以是表达式
| 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]+ ; //match identifiers 匹配标识符
INT : [0-9]+ ; //match integers 匹配数字
NEWLINE:'\r'? '\n'; //return newline(end-statement signal)
WS : [ \t]+ -> skip ; //跳过空格与tab
MUL : '*' ;
DIV : '/' ;
ADD : '+' ;
SUB : '-' ;

然后用java进行计算测试的主函数如下:

public class MainClass {
    public static void main(String[] args) throws Exception {
        CharStream input = CharStreams.fromString("(2+3) *5\n");

        LabeledExprLexer lexer = new LabeledExprLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        LabeledExprParser parser = new LabeledExprParser(tokens);
        ParseTree tree = parser.prog(); 

        EvalVisitor eval = new EvalVisitor();
        eval.visit(tree);
                int value = ; //打算将visit中的计算结果传递到这里
    }
}

编写的 visit 的一部分大致如下:

public Integer visitPrintExpr(LabeledExprParser.PrintExprContext ctx) {
        //遇到表达式+换行,计算通过expr()计算表达式的值,然后打印出来
        Integer value = visit(ctx.expr());
        System.out.println(value); //打印计算结果
        return value; //打算将此value传递给主函数
}

就是想请问一下 visit 中的 return 值如何传递到主函数呢?

  • 写回答

1条回答 默认 最新

  • devmiao 2019-03-27 23:41
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R
  • ¥15 在线请求openmv与pixhawk 实现实时目标跟踪的具体通讯方法
  • ¥15 八路抢答器设计出现故障
  • ¥15 opencv 无法读取视频
  • ¥15 按键修改电子时钟,C51单片机