ANTLR 4解析问题:可用于TestRig,但不适用于Java
我正在使用Antlr4.8用Java编写一个lambda演算解释器。使用TestRun工具时,解析工作与预期一样。然而,在我的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程序在解析同一表达式时的输出:
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()调用,看看它为什么不生成解析树。同样有趣的是,检查是否启用了解析树生成。我原以为它是默认的,但最好仔细检查/明确激活它。