2014-02-09 55 views
2

這個問題是從書(〜143頁)參考利寶興業代碼:getType在antlr4中做什麼?

int t = ctx.type().start.getType(); // in DefPhase.enterFunctionDecl() 
Symbol.Type type = CheckSymbols.getType(t); 

什麼每個組件的返回: 「ctx.type()」, 「開始」, 「的getType()」 ?這本書不包含關於這些名字的任何解釋。

我可以「種」明白「ctx.type()」指的是「型」的規則,和「的getType()」返回與之相關的數字。但「起步」究竟做了什麼?

此外,概括了這個問題:獲得由規則的返回值/結構的機制是什麼 - 尤其是在使用中的監聽範圍內?

我可以看到,對於一個ID,它是:

String name = ctx.ID().getText(); 

而如上述,對於關鍵字的枚舉它是通過「start.getType()」。我應該知道的任何其他特殊類型的訪問?

回答

0

讓我們一步一步地分解問題。顯然,ctxCymbolParser.FunctionDeclContext的實例。在第98-99頁你可以看到語法和ParseTree是如何實現的(至少是這種感覺 - 真正的實現請參見.g4文件)。

看一下第99頁的AST圖 - 你可以看到節點FunctionDeclContext有幾個孩子,一個標記爲type。直觀地看,它以某種方式與函數返回類型相對應。這是調用CymbolParser.FunctionDeclContext::type時檢索到的節點。返回類型可能像TypeContext

注意,如果沒有「得到」開頭的方法通常是兒童干將 - 例如您可以致電CymbolParser.FunctionDeclContext::block訪問該塊。

所以,你有你有傳遞的方法類型的上下文。您可以在任何情況下撥打beginend以獲取定義上下文的最後一個Token。只需start讓你「第一個字」。在這種情況下,第一個Token當然是函數返回類型itsef,例如, int

而最後的呼喚 - Token::getType收益Token積分表示。

您可以在API參考網頁找到更多的信息 - ContextToken。但理解行爲的最好方法是讀取生成的ANTLR類,如<GrammarName>Parser等。爲了完整,我附上a link to the book