我正在尝试使用C#(.Net Core 3.1(中的ANTLR Java语法(Java Grammar(上的访问者模式构建AST。我已经为语法创建了IJavaParserVisitor
、JavaParserbaseVisitor
、JavaLexer
和JavaParser
文件,并为java源文件创建了解析树。但是当我尝试使用 JavaParserBaseVisitor.Visit(( 创建 AST 时,结果是空值。
AntlrFileStream stream = new AntlrFileStream(file);
ITokenSource lexer = new JavaLexer(stream);
ITokenStream tokens = new CommonTokenStream(lexer);
JavaParser parser = new JavaParser(tokens);
parser.BuildParseTree = true;
IParseTree tree = parser.compilationUnit();
var result = tree.ToStringTree(parser);
JavaParserBaseVisitor<JavaParser> visitor = new
JavaParserBaseVisitor<JavaParser>();
var ast= visitor.Visit(tree); -- **Its always NULL**
我不知道我在这里到底错过了什么。
"{[]}" 很好。这是解析树中节点的"ToString(("表示形式。如果您不确定节点是什么,请尝试查看"树"。GetText(("和"tree.调试器中的 GetType(("。
但是,您的访问者代码看起来不正确。你需要类似"public class MyVisitor : JavaParserBaseVisitor
请注意,有些人从 AST 创建了许多子类化的 AST 节点类,这些类表示不同的 AST 节点类型。例如,您可能需要一个用于语句,另一个用于变量 decl 等。如果您打算为所有 Java 创建一个完整的 AST,那么您还有很多工作要做。或者,可以创建一个常规 AST 节点类,该类包含为分析树节点创建的子 AST 列表,以及用于区分 AST 节点类型的枚举。
如果您想查看其工作原理的真实示例,请查看访问者,了解如何为我刚刚移植到 C# 并扩展到 XPath 3.1 的 XPath 引擎构造 XPath AST 表达式。这将为表达式构造一个 AST(这里只是一个对象(。