ANTLR 访客类在 C# 中为解析树返回空值



我正在尝试使用C#(.Net Core 3.1(中的ANTLR Java语法(Java Grammar(上的访问者模式构建AST。我已经为语法创建了IJavaParserVisitorJavaParserbaseVisitorJavaLexerJavaParser文件,并为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 是用于表示抽象语法树中的节点的类或接口。这就是你从每个访问者那里返回的内容,而不是JavaParser或IParseTree。在您的访问者类中,您将需要覆盖您想要的所有内容的实现,计算并返回与该解析树节点(或仅一个特定子节点的 AST(相对应的 AST。在每个访客方法中,您需要为每个孩子呼叫访客。例如,VisitForInit(...({ var r = VisitExpressionList(context.expressionList(((; ... ; return new ForAST(r(; }.

请注意,有些人从 AST 创建了许多子类化的 AST 节点类,这些类表示不同的 AST 节点类型。例如,您可能需要一个用于语句,另一个用于变量 decl 等。如果您打算为所有 Java 创建一个完整的 AST,那么您还有很多工作要做。或者,可以创建一个常规 AST 节点类,该类包含为分析树节点创建的子 AST 列表,以及用于区分 AST 节点类型的枚举。

如果您想查看其工作原理的真实示例,请查看访问者,了解如何为我刚刚移植到 C# 并扩展到 XPath 3.1 的 XPath 引擎构造 XPath AST 表达式。这将为表达式构造一个 AST(这里只是一个对象(。

相关内容

  • 没有找到相关文章

最新更新