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 楼答案
toString
是从org.antlr.v4.runtime.RuleContext
继承的,它的实现与您预期的不同。您将要调用toStringTree(...)
:其中打印:
还要确保您使用的是
org.antlr.v4.runtime.tree.ParseTree
,而不是类路径中碰巧存在的其他ParseTree
类(可能不是这种情况)