Mou*_*gip 2 java parsing antlr antlr4
我正在尝试使用 ANTLR4 将数学公式解析为 LaTeX 的子集。例如它应该解析(a+4)/(b*10)为\frac{a+4}{b\cdot 10}.
我的简单语法创建了一个这样的树:

现在我正在尝试实现解析树侦听器,以在遍历树时以某种方式构造 LaTeX 字符串。在这里,我失败了,因为构造一个像\frac{}{}它必须递归构建的字符串。然而,解析树遍历器一个接一个地访问树节点(据我所知,以广度优先的方式)。
我已经阅读了可能是我需要的解析树访问者。但是我无法找到一些如何应用这些访问者的示例。
您能否举例说明在这种特殊情况下如何使用解析树侦听器/访问器?您认为我首先将 ANTLR 用于解析器的方法有意义吗?
您可以通过实现该ParseTreeVisitor接口来创建解析树walker 。为便于使用,您可以在编译语法时指定 Antlr 以生成基本访问者(在 Antlrworks 中,Run->Generate Recognizer->Next->Generate Visitor->Next->Finish)。基本访问者将被称为MyGrammarBaseVisitor。请注意,访问者有一个泛型类型 T,每个访问方法都应返回该类型。我建议Void用于手动操作或String在代码生成过程中易于使用。
在扩展基本访问者之后(我假设我们在这里处理String),您需要覆盖访问方法。这些方法以您拥有的语法规则命名。这些方法中的每一个都将接收一个ParserContext ctx参数,您可以使用它来访问子规则和/或获取终端值。例如,你可以这样做:
class MyVisitor extends MyGrammarBaseVisitor<String> {
@Override
public String visitMultiplicative(MyGrammarParser.MultiplicativeContext ctx) {
if (ctx.opMult().getText().equals("/")) return "\\frac{" + visit(ctx.expr(0)) + "}{" + visit(ctx.expr(1)) + "}";
else return visit(ctx.expr(0)) + "\\cdot " + visit(ctx.expr(1));
}
// visit methods for other rules...
}
Run Code Online (Sandbox Code Playgroud)
我假设您的multiplicative规则看起来像multiplicative: expr opMult expr; opMult: '*' | '/';您可以在The Definitive Antlr 4 Reference 中找到更多信息。您还可以在Antlr 文档中找到更多信息和示例。