这个问题是参考书中的 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()”。我应该注意的任何其他特殊类型的访问?
让我们一步步拆解问题。显然,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 参考网页 - Context、Token中找到更多信息。但理解该行为的最佳方法是阅读生成的 ANTLR 类,例如<GrammarName>Parser等。为了完整起见,我附上了本书的链接。
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |