getType 在 antlr4 中做什么?

R71*_*R71 5 antlr4

这个问题是参考书中的 Cymbol 代码(~第 143 页):

int t = ctx.type().start.getType(); // in DefPhase.enterFunctionDecl()
Symbol.Type type = CheckSymbols.getType(t);
Run Code Online (Sandbox Code Playgroud)

每个组件返回什么: "ctx.type()", "start", "getType()" ?本书不包含对这些名称的任何解释。

我可以“有点”理解“ctx.type()”指的是“type”规则,而“getType()”返回与之关联的数字。但是“开始”究竟是做什么的呢?

此外,概括这个问题:获取规则返回的值/结构的机制是什么 - 特别是在侦听器的使用上下文中?

我可以看到,对于一个 ID,它是:

String name = ctx.ID().getText();
Run Code Online (Sandbox Code Playgroud)

和上面一样,对于关键字的枚举,它是通过“start.getType()”。我应该注意的任何其他特殊类型的访问?

pet*_*bel 1

让我们一步步拆解问题。显然,ctx是 的实例CymbolParser.FunctionDeclContext。在第 98-99 页上,您可以看到语法和 ParseTree 是如何实现的(至少是感觉 - 真正的实现请参阅文件.g4)。

看一下第 99 页的 AST 图 - 你可以看到该节点FunctionDeclContext有几个子节点,其中一个标记为type。直观上你会发现它在某种程度上与函数返回类型相对应。这是您调用时检索的节点CymbolParser.FunctionDeclContext::type。返回类型可能是这样的TypeContext

请注意,开头没有“get”的方法通常是子获取器 - 例如,您可以通过调用 来访问该块CymbolParser.FunctionDeclContext::block

这样您就获得了所传递方法的类型上下文。您可以在任何上下文上调用begin或来获取定义上下文的end第一个或最后一个。Token简单地start让你得到“第一个词”。在这种情况下,第一个Token当然是函数返回类型 itef,例如int

最后一次调用 -Token::getType返回 的积分表示Token

您可以在 API 参考网页 - ContextToken中找到更多信息。但理解该行为的最佳方法是阅读生成的 ANTLR 类,例如<GrammarName>Parser等。为了完整起见,我附上了本书的链接