获取 ParserRuleContext 的所有预期标记

Getting All Expected Tokens of ParserRuleContext

我正在尝试将代码完成功能添加到文本编辑器。我以为我可以从 Antlr 获得非语义内容辅助建议。

此时,我有几个 ParserRuleContext。我想到达任何类型的 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解析器来解析这句话。然后我发现光标在 ClassContext -> AttributeContext 通过使用 Visitor.

在 visitAttributeContext 方法中,我想获取 AttributeContext 的所有终端,如 [public、protected、private、static、final、unique]。然后我会根据光标所在的位置去掉除'static, final'以外的其他限定符

最后,我的问题是,如何从任何 ParserRuleContex 获取所有终端节点?或者还有其他方法吗?

注:语法可能有误,我为这道题发明的。请略读一下。

"ContentAssist" 的实现(更广为人知的术语是 "code completion")是一项 non-trivial 任务,您可能需要深入研究 class 的内部结构ANTLR(至少atm)。您需要做的是遍历由 ANTLR 为每个解析器和词法分析器生成的 ATN classes。博客 post 中描述了一种方法:Building autocompletion for an editor based on ANTLR。 LL1Analyzer 使用了类似的方法,它是 ANTLR 运行时中的 class。

但是,两者都只能为您提供词法分析器标记(例如,您所有的关键字 + 其他关键字,如 IDENTIFIER 或 DIGIT)。这意味着你不会得到例如变量引用等。