2017-02-07 74 views
1

我試圖將代碼完成功能添加到文本編輯器。我認爲我可以從Antlr獲得非語義內容協助提案。獲取ParserRuleContext的所有預期標記

在這一點上,我有幾個ParserRuleContexts。我想要到達任何類型的ParserRuleContext的所有終端節點。

例如我有像下面的bnf;

class 
'class' name = IDENTIFIER '{' 
attribute* 
'}' 
; 

attribute 
(qualifier += 'public' 
| qualifier += 'protected' 
| qualifier += 'private')? 
(qualifier += 'static')? 
(qualifier += 'final')? 
'attribute' name = IDENTIFIER ':' type = IDENTIFIER 
('(' qualifier += 'unique' ')')? 
; 

IDENTIFIER : LETTER (LETTER|DIGIT)*; 
LETTER : [a-zA-Z]; 
DIGIT : [0-9]; 

而且我有一個是在編輯寫了一句話:

class CLAZZ { public attribute SOMETHING : String; }

當用戶將光標移動到下面的指標,並希望得到內容輔助:

public [cursor] attribute SOMETHING : String;

內容幫助應該將'final'和'static'限定符作爲提議。

我用Antlr解析器來解析這句話。然後我通過使用Visitor捕獲到遊標在ClassContext - > AttributeContext中。

在visitAttributeContext方法中,我希望獲得AttributeContext的所有終端,如[public,protected,private,static,final,unique]。然後根據光標位置消除其他限定符,不包括'static,final'。

最終,我的問題是,我如何從任何ParserRuleContex獲取所有終端節點?或者還有其他方法嗎?

注:語法可能是錯誤的,我爲這個問題而發明。請稍微瀏覽一下。

回答

0

「ContentAssist」(在「代碼完成」一詞中更爲人熟知)的實現是一項不平凡的任務,您可能需要深入研究ANTLR的內部類(至少atm)。你需要做的是走過由ANTLR爲你的每個解析器和詞法分析器類生成的ATN。博客文章中描述了一種方法:Building autocompletion for an editor based on ANTLR。 LL1Analyzer使用類似的方法,它是ANTLR運行時中的一個類。

但是,兩者只能給你詞法分析標記(例如,所有關鍵字+其他標識符,如IDENTIFIER或DIGIT)。這意味着你不會得到變量引用等。

+0

在此之前,對於遲到的回覆感到抱歉。並感謝您的回答。 我檢查了[Tomassetti's](https://tomassetti.me/autocompletion-editor-antlr/)示例,並且[yours](http://www.soft-gems.net/index.php/tools/47-通用代碼完成,使用-ANTLR)。根據我的研究,有幾種方法可以完成這項工作。但似乎唯一通用的方式是穿越ATN。 現在,我正在使用另一種方式,但接下來我將使用您提到的通用方法。 再次感謝您。最好的祝福。 –

+0

與此同時,我發佈了我的[C3(代碼完成核心)](https://www.npmjs.com/package/antlr4-c3)引擎,它可以給你更多的想法。 –