我正在尝试将代码完成功能添加到文本编辑器中。我认为我可以从Antlr获得非语义内容辅助提案。
此时,我有几个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;
”
内容辅助应该将“最终”和“静态”限定符作为提案。
我使用Antlr解析器来解析这句话。然后我发现光标在ClassContext中 - >使用Visitor。
的AttributeContext在visitAttributeContext方法中,我希望获得AttributeContext的所有终端,如[public,protected,private,static,final,unique]。然后我将根据光标位置消除除静态,最终'之外的其他限定符。
最后,我的问题是,如何从任何ParserRuleContex获取所有终端节点?或者还有其他方法吗?
注意:语法可能有误,我是为这个问题发明的。请稍等一下。
答案 0 :(得分:0)
" ContentAssist"的实施(在术语#34;代码完成"中更为人所知)是一项非常重要的任务,您可能需要深入研究ANTLR的内部类(至少atm)。你要做的就是为每个解析器和词法分析器类步行由ANTLR生成的ATN。博客文章中描述了一种方法:Building autocompletion for an editor based on ANTLR。 LL1Analyzer使用类似的方法,它是ANTLR运行时中的一个类。
但是,两者都只能为您提供词法分析器代码(例如您的所有关键字+其他类似IDENTIFIER或DIGIT)。这意味着你不会得到例如变量引用等。