如何在我的 ANTLR4 Java 扩展侦听器类中实现减法表达式?



我有一个任务是将我的ANTLR4 Java项目(使用visitor(重新制作为使用监听器的同一项目。 我在理解听众如何工作方面遇到困难。

我的访客减法如下所示:

// expression '-' expression                #subtractExpression
@Override
public QuickMathsValue visitSubtractExpression(SubtractExpressionContext ctx) {
QuickMathsValue lhs = this.visit(ctx.expression(0));
QuickMathsValue rhs = this.visit(ctx.expression(1));
if (lhs.isNumber() && rhs.isNumber()) {
return new QuickMathsValue(lhs.asDouble() - rhs.asDouble());
}
throw new EvalException(ctx);
}

如何制作同样的东西,但使用监听器?如果有人有任何例子,那将是一个巨大的帮助。

在侦听器中,您可以添加一个堆栈,您可以在其上推送值。退出规则时,您可以从堆栈中弹出所需的值,然后再次将它们推回(添加或乘法或其他(。

快速演示:

表达式.g4

grammar Expression;
expression
: expression op=( MUL | DIV ) expression #expressionMul
| expression op=( ADD | MIN ) expression #expressionAdd
| '(' expression ')'                     #expressionNested
| NUMBER                                 #expressionNumber
;
MUL    : '*';
DIV    : '/';
ADD    : '+';
MIN    : '-';
NUMBER : [0-9]+ ( '.' [0-9]+ )?;
SPACE  : [ trn] -> skip;

主.java

public class Main {
public static void main(String[] args) {
String expression = "(1 + 2) * 14";
ExpressionLexer lexer = new ExpressionLexer(CharStreams.fromString(expression));
ExpressionParser parser = new ExpressionParser(new CommonTokenStream(lexer));
EvalListener evaluator = new EvalListener();
ParseTreeWalker.DEFAULT.walk(evaluator, parser.expression());
System.out.printf("%s = %sn", expression, evaluator.stack.pop());
}
static class EvalListener extends ExpressionBaseListener {
final Stack<Double> stack = new Stack<>();
@Override
public void exitExpressionAdd(ExpressionParser.ExpressionAddContext ctx) {
Double rhs = stack.pop();
Double lhs = stack.pop();
this.stack.push(ctx.op.getType() == ExpressionLexer.ADD ? (lhs + rhs) : (lhs - rhs));
}
@Override
public void exitExpressionMul(ExpressionParser.ExpressionMulContext ctx) {
Double rhs = stack.pop();
Double lhs = stack.pop();
this.stack.push(ctx.op.getType() == ExpressionLexer.MUL ? (lhs * rhs) : (lhs / rhs));
}
@Override
public void enterExpressionNumber(ExpressionParser.ExpressionNumberContext ctx) {
this.stack.push(Double.valueOf(ctx.getText()));
}
}
}

运行Main类将产生以下输出:

(1 + 2) * 14 = 42.0

最新更新