【问题标题】:Is it feasible to use Antlr for source code completion?使用 Antlr 完成源代码是否可行?
【发布时间】:2013-11-02 02:46:05
【问题描述】:

我不知道这个问题是否有效,因为我对源代码解析不是很熟悉。我的目标是为一种现有的编程语言(语言“X”)编写一个源代码完成函数,用于学习目的。 Antlr(v4) 是否适合这样的任务,或者是否应该手动完成必要的 AST/解析树创建和解析,假设不存在现有的解决方案?

除了编译器书籍列表之外,我没有找到关于该特定主题的太多信息,除了编译器不是我所追求的。

【问题讨论】:

  • Intellij IDEA 将 ANTLR 用于其强大的解析功能提供的许多不同的东西。代码完成和结构重构只是其中的几个例子。

标签: antlr antlr4 code-completion


【解决方案1】:

GoWorks 中的代码补全完全使用 ANTLR 4 实现。以下视频展示了此代码补全引擎的完成程度。代码完成示例从 5 分钟到视频结束。

Intro to Tunnel Vision Labs' GoWorks IDE (Preview Release)

我多年来一直致力于代码完成算法,并且坚信没有更好的解决方案(自动或手动)来为一种新语言生成代码完成解决方案,以满足我称之为高度要求的要求 -响应式代码完成。如果您对该级别的性能或准确性不感兴趣,您可能更容易参与其他解决方案(我个人不与这些解决方案合作,因为我太容易对结果感到失望)。

【讨论】:

  • 作为 Go 的粉丝,这看起来非常棒。跑题了:您是否计划添加对显示文档以及代码完成的支持?
  • Sam,我注意到几年前你认为 ANTLR "is not the correct method for implementing autocompletion"。是什么改变了你的想法?能否请您详细说明。
  • @vassilvk 嗯,这确实是一本有趣的书!改变的一件大事是我深入参与了 ANTLR 4 的开发,并确保完全重写解决了使 ANTLR 3 成为用于此任务的具有挑战性的工具的一些问题。在性能方面,ANTLR 不会在 GoWorks 中解析整个文件,而是从称为 Anchors 的文件中解析。 ForestParser 和 CaretToken 涵盖了健壮性情况。
【解决方案2】:

Xtext 使用 ANTLR3 并具有良好的自动完成功能。问题是,它为自动完成处理生成了一个单独的解析器(再次使用 antlr3),该解析器源自AbstractInternalContentAssistParser。这几万行代码部分说明xtext团队发现单靠ANTLR3的错误恢复是不够的。

同时,ANTLR4 有一个函数parser.getExpectedTokensWithinCurrentRule(),它列出了给定位置的可能标记类型。它在 ParseTreeListener 中使用时有效。剩下的就是语义、作用域等超出了 ANTLR 的范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多