我試圖將代碼完成功能添加到文本編輯器。我認爲我可以從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獲取所有終端節點?或者還有其他方法嗎?
注:語法可能是錯誤的,我爲這個問題而發明。請稍微瀏覽一下。
在此之前,對於遲到的回覆感到抱歉。並感謝您的回答。 我檢查了[Tomassetti's](https://tomassetti.me/autocompletion-editor-antlr/)示例,並且[yours](http://www.soft-gems.net/index.php/tools/47-通用代碼完成,使用-ANTLR)。根據我的研究,有幾種方法可以完成這項工作。但似乎唯一通用的方式是穿越ATN。 現在,我正在使用另一種方式,但接下來我將使用您提到的通用方法。 再次感謝您。最好的祝福。 –
與此同時,我發佈了我的[C3(代碼完成核心)](https://www.npmjs.com/package/antlr4-c3)引擎,它可以給你更多的想法。 –