【问题标题】:Code Editor using ANTLR使用 ANTLR 的代码编辑器
【发布时间】:2016-03-29 09:50:45
【问题描述】:

我正在为自定义语言编写代码编辑器。我们将 ANTLR 用于词法分析器和解析器,将 CodeMirror 用于编辑器框架(在浏览器中运行)。

我可以做一些基本的事情,比如关键字的语法着色,以及提供基本的代码完成。

我发现用户经常在编辑某些东西,所以 ANTLR 解析器不是很有用,因为当前输入流不是完全可解析的(并且由于不完整的输入流)。

因此,我使用令牌流来确定发生了什么并尝试提供上下文相关的帮助。

我想知道是否有人可以就使用 ANTLR 作为代码编辑器的一部分提供一些指导。我是否在使用令牌流而不是解析树的正确轨道上?

是否可以利用 ANTLR API 来执行诸如提前查找令牌以了解用户当前正在编辑的内容的整体上下文之类的事情?

对不起,如果这有点含糊。刚刚开始这个项目。 :-)

感谢您的帮助。

【问题讨论】:

  • 相信ANTLR的作者很久以前就已经明确表示它不是为那个场景而设计的。您可能需要编写一个手动编译器框架来处理它,就像任何其他 IDE 一样。
  • 好的,感谢您的反馈和链接!

标签: ide editor antlr


【解决方案1】:

我发现 ANTRL 非常适合语法检查和有效输入的简单详细信息检索。但是,对于代码完成,您有不同的情况。正如您已经发现的那样,解析器通常不会给您很好的答案,因为在用户键入时输入无效。 Bart 链接到一个答案,Sam 描述了他使用 ANTLR 4 实现了一个很好的解决方案,但不幸的是没有描述如何。

但是,即使您可以让解析器为您提供一组预期的标记,您还能从中得到什么?如果需要一个标识符,你想显示什么?这可以是任何东西,比如类成员、var 名称等。我不相信这是答案,因此我开发了一个自己的解决方案,我在这里描述:Universal Code Completion using ANTLR。这适用于 ANTLR 3,但当然也可以与 4 一起使用。

本文还包含几个指向 (C++) 源代码的链接,这些链接展示了如何在我的应用程序中实现代码完成。令人惊讶的是,实现如此简单,但仍能提供非常精确的结果。

更新

同时,我也为 ANTLR4 开发了一个解决方案,称为 antlr4-c3。这是一个 Typescript 解决方案,但附带 JavaC++ 的翻译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多