我正在使用ANTLR4来解析Netbeans Platform应用程序中的代码。我已经成功地使用 ANTLR4 和 Netbeans 机制实现了语法高亮。
我还为我的两个令牌实现了一个简单的代码完成。目前,我正在使用教程中的简单实现,该实现搜索空格并从那里开始完成过程。这有效,但它认为用户在开始代码完成之前为空格添加前缀。
我的问题:是否有可能甚至考虑使用ANTLR的词法分析器来确定当前从输入中读取哪些标记以确定正确的完成项?
我将感谢每一个指向正确方向的指针,以改善这种行为。
不是真正的答案,但我没有足够的声誉点来发表评论。
是否有可能甚至考虑使用ANTLR的词法分析器来确定当前从输入中读取哪些标记以确定正确的完成项?
看看这里: http://www.antlr3.org/pipermail/antlr-interest/2008-November/031576.html在这里: https://groups.google.com/forum/#!topic/antlr-discussion/DbJ-2qBmNk0
请记住,第一篇文章是在 2008 年写的,当前的 antlr v4 与当时可用的非常不同,这就是为什么 Sam 对这个话题的看法似乎已经演变的原因。
我的个人经验 - 你问的大部分内容可能都可以用antlr,但你必须非常了解antlr。更直接的选择是使用 antlr 收集有关上下文的信息,并使用您自己的启发式方法来确定在此上下文中需要显示的内容。
ANTLRv3 语法 https://sourceware.org/git/?p=frysk.git;a=blob_plain;f=frysk-core/frysk/expr/CExpr.g;hb=HEAD 实现了 C 表达式的上下文相关补全(无宏)。
例如,如果输入字符串:
a_struct->a<tab>
它只会列出以"a"开头的"a_struct"字段(从技术上讲,制表符可以是任何字符或标记)。
它使用的技术是:
- 修改 C 语法以识别 IDENT 和 IDENT_TAB 标记
- 对于IDENT_TAB捕获部分表达式 AST 和"TOKEN_TAB"并将它们扔回"main"(有一些黑客可以帮助捕获 AST)
- 然后,"main"对部分表达式执行类型评估(计算表达式的类型而不是值),并使用它来扩展TOKEN_TAB
同样的技术,虽然不是很理想,但肯定可以在ANTLRv4中使用。