我按照 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 值如何传递到主函数呢?