ANTLR Visitor Class 正在为 C# 中的解析树返回 null
ANTLR Visitor Class is returning null for Parse tree in C#
我正在尝试使用 C# (.Net Core 3.1) 中的 ANTLR Java 语法 (Java Grammar) 的访问者模式构建 AST。我已经为语法创建了 IJavaParserVisitor
、JavaParserbaseVisitor
、JavaLexer
和 JavaParser
文件,并为 java 源文件创建了解析树。但是当我尝试使用 JavaParserBaseVisitor.Visit() 创建 AST 时,我得到的结果是 null。
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()”表示。如果您不确定节点是什么,请尝试在调试器中查看“tree.GetText()”和“tree.GetType()”。
但是,您的访客代码看起来不正确。您需要类似“public class MyVisitor : JavaParserBaseVisitor {...}”的内容,其中 AST 是 class 或用于表示中的节点的接口抽象语法树。这就是您从每位访问者那里 return 得到的,而不是 JavaParser 或 IParseTree。在您的访问者 class 中,您将需要重写您想要的所有内容的实现,计算和 returning 对应于该解析树节点的 AST(或者只是一个特定 child).在每个访问者方法中,您需要为每个 child 调用访问者。例如,VisitForInit(...) { var r = VisitExpressionList(context.expressionList()); ...; return 新 ForAST(r); }.
请注意,有些人从 AST 中创建了许多 AST 节点 classes subclass,它们代表不同的 AST 节点类型。例如,您可能需要一个用于语句,另一个用于变量声明等。如果您打算为所有 Java 创建一个完整的 AST,您还有很多工作要做。或者,您可以创建一个通用 AST 节点 class,它具有您为解析树节点创建的 children AST 列表和一个用于区分 AST 节点类型的枚举。
如果您想查看有关其工作原理的 real-world 示例,请查看 the visitor for constructing a XPath AST expression 我刚刚移植到 C# 并扩展到 XPath 3.1 的 XPath 引擎。这为表达式构造了一个 AST(这里只是一个 object)。
我正在尝试使用 C# (.Net Core 3.1) 中的 ANTLR Java 语法 (Java Grammar) 的访问者模式构建 AST。我已经为语法创建了 IJavaParserVisitor
、JavaParserbaseVisitor
、JavaLexer
和 JavaParser
文件,并为 java 源文件创建了解析树。但是当我尝试使用 JavaParserBaseVisitor.Visit() 创建 AST 时,我得到的结果是 null。
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()”表示。如果您不确定节点是什么,请尝试在调试器中查看“tree.GetText()”和“tree.GetType()”。
但是,您的访客代码看起来不正确。您需要类似“public class MyVisitor : JavaParserBaseVisitor
请注意,有些人从 AST 中创建了许多 AST 节点 classes subclass,它们代表不同的 AST 节点类型。例如,您可能需要一个用于语句,另一个用于变量声明等。如果您打算为所有 Java 创建一个完整的 AST,您还有很多工作要做。或者,您可以创建一个通用 AST 节点 class,它具有您为解析树节点创建的 children AST 列表和一个用于区分 AST 节点类型的枚举。
如果您想查看有关其工作原理的 real-world 示例,请查看 the visitor for constructing a XPath AST expression 我刚刚移植到 C# 并扩展到 XPath 3.1 的 XPath 引擎。这为表达式构造了一个 AST(这里只是一个 object)。