getType在antlr4中做了什么?

时间:2014-02-09 15:31:14

标签: antlr4

这个问题是参考书中的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()”。我应该注意的任何其他特殊访问?

1 个答案:

答案 0 :(得分:0)

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

请参阅第99页的AST图 - 您可以看到节点FunctionDeclContext有几个孩子,一个标有type。直观地,你看到它以某种方式与函数返回类型相对应。这是您在调用CymbolParser.FunctionDeclContext::type时检索的节点。返回类型可能类似于TypeContext

请注意,没有' get'在开始时通常是儿童 - 吸气者 - 例如您可以致电CymbolParser.FunctionDeclContext::block

来访问该区块

所以你得到了传递方法的类型上下文。您可以在任何上下文中调用beginend来获取定义上下文的最后一个Token。只需start就可以获得第一个单词"。在这种情况下,第一个Token当然是函数return-type itsef,例如int

最后一次通话 - Token::getType会返回Token的完整代表。

您可以在API参考网页上找到更多信息 - ContextToken。但理解行为的最佳方式是阅读生成的ANTLR类,例如<GrammarName>Parser等。为了完整,我附上a link to the book