有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

antlr4 antlr4解析问题:适用于TestRig,但不适用于Java

我正在使用Antlr4.8用Java编写一个lambda演算解释器。使用TestRun工具时,解析工作与预期一样。然而,在我的Java代码中,每当我解析包含abstractionExpr规则的lambda表达式时,我都会得到空的解析列表。我不理解TestRun和我的Java代码之间的差异

下面是一个使用TestRun的示例:

$ grun LambdaExpr lexpr -tree
^x.y
(lexpr ^ x . (lexpr y))

下面是我的Java程序在解析同一表达式时的输出:

$ java LambdaCalculusInterpreter
Parse tree output: []

以下是我的语法:

grammar LambdaExpr;

Var         : [a-z]+ ;

WS          : [ \t\r\n]+ -> skip ;


lexpr       : Var                   # varExpr
            | '^' Var '.' lexpr     # abstractionExpr
            | '(' lexpr lexpr ')'   # applicationExpr
            ;

下面是我的Java代码:

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;

public class LambdaCalculusInterpreter {
    public static void main(String[] args) {
    CharStream inputStream = CharStreams.fromString("^x.y");
    LambdaExprLexer lexer = new LambdaExprLexer(inputStream);
    CommonTokenStream commonTokenStream = new CommonTokenStream(lexer);
    LambdaExprParser parser = new LambdaExprParser(commonTokenStream);

    ParseTree tree = parser.lexpr();
    System.out.println("Parse tree output: " + tree.toString());
}


共 (1) 个答案

  1. # 1 楼答案

    toString是从org.antlr.v4.runtime.RuleContext继承的,它的实现与您预期的不同。您将要调用toStringTree(...)

    ParseTree tree = parser.lexpr();
    System.out.println("Parse tree output: " + tree.toStringTree(parser));
    

    其中打印:

    Parse tree output: (lexpr ^ x . (lexpr y))
    

    还要确保您使用的是org.antlr.v4.runtime.tree.ParseTree,而不是类路径中碰巧存在的其他ParseTree类(可能不是这种情况)