ANTLR 4解析问题:可用于TestRig,但不适用于Java

ANTLR 4解析问题:可用于TestRig,但不适用于Java,java,antlr4,Java,Antlr4,我正在使用Antlr4.8用Java编写一个lambda演算解释器。使用TestRun工具时,解析工作与预期一样。然而,在我的Java代码中,每当我用abstractionExpr规则解析lambda表达式时,我最终得到的解析列表都是空的。我不理解TestRun和我的Java代码之间的差异 下面是一个使用TestRun的示例: $ grun LambdaExpr lexpr -tree ^x.y (lexpr ^ x . (lexpr y)) 下面是我的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());
}


toString
继承自
org.antlr.v4.runtime.RuleContext
,它的实现与您预期的不同。您需要调用
到字符串树(…)

ParseTree=parser.lexpr();
System.out.println(“解析树输出:“+tree.toStringTree(解析器));
其中打印:

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

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

快速健全性检查:您是否完成了干净的构建,以确保已重新生成由Antlr生成的所有类?不幸的是,即使删除了由Antlr生成的所有文件,我仍会遇到此问题。请调试您的lexpr()调用,看看它为什么不生成解析树。同样有趣的是,检查是否启用了解析树生成。我原以为它是默认的,但最好仔细检查/明确激活它。