这个问题是参考书中的Cymbol代码(〜第143页):
int t = ctx.type().start.getType(); // in DefPhase.enterFunctionDecl()
Symbol.Type type = CheckSymbols.getType(t);
每个组件返回什么:“ctx.type()”,“start”,“getType()”?这本书中没有关于这些名字的任何解释。
我可以“理解”“ctx.type()”指的是“type”规则,“getType()”返回与之关联的数字。但是“开始”到底是做什么的呢?
另外,概括一下这个问题:获取规则返回的值/结构的机制是什么 - 特别是在侦听器中使用的上下文中?
我可以看到,对于ID,它是:
String name = ctx.ID().getText();
如上所述,对于关键字的枚举,它是通过“start.getType()”。我应该注意的任何其他特殊访问?
答案 0 :(得分:0)
让我们一步一步地解决问题。显然,ctx
是CymbolParser.FunctionDeclContext
的实例。在第98-99页,您可以看到语法和ParseTree是如何实现的(至少感觉 - 对于实际实现,请参阅.g4
文件)。
请参阅第99页的AST图 - 您可以看到节点FunctionDeclContext
有几个孩子,一个标有type
。直观地,你看到它以某种方式与函数返回类型相对应。这是您在调用CymbolParser.FunctionDeclContext::type
时检索的节点。返回类型可能类似于TypeContext
。
请注意,没有' get'在开始时通常是儿童 - 吸气者 - 例如您可以致电CymbolParser.FunctionDeclContext::block
。
所以你得到了传递方法的类型上下文。您可以在任何上下文中调用begin
或end
来获取定义上下文的最后一个Token
。只需start
就可以获得第一个单词"。在这种情况下,第一个Token
当然是函数return-type itsef,例如int
。
最后一次通话 - Token::getType
会返回Token
的完整代表。
您可以在API参考网页上找到更多信息 - Context,Token。但理解行为的最佳方式是阅读生成的ANTLR类,例如<GrammarName>Parser
等。为了完整,我附上a link to the book。