使用 ANTLR 的代码编辑器

问题描述 投票:0回答:3

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

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

我发现用户经常在编辑某些内容,因此 ANTLR 解析器不是很有用,因为当前输入流无法完全解析(并且经常由于不完整的输入而导致 ANTLR 走上错误的路径)流)。

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

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

能否利用 ANTLR API 来执行诸如向前查找标记以找出用户当前正在编辑内容的整体上下文之类的操作?

抱歉,如果这有点含糊。 刚刚开始这个项目。 :-)

感谢您的帮助。

ide editor antlr
3个回答
4
投票

我发现 ANTRL 非常适合语法检查和轻松检索有效输入的详细信息。然而,对于代码完成,您有不同的情况。正如您已经发现的那样,解析器通常无法为您提供良好的答案,因为用户键入时输入无效。 Bart 链接到了一个答案,Sam 描述他使用 ANTLR 4 实现了一个很好的解决方案,但不幸的是没有描述如何实现。 但是,即使您可以让解析器为您提供一组预期的标记,您又能从中得到什么呢?例如,如果需要标识符,您想显示什么?这可以是任何东西,比如类成员、var 名称等。我不相信这就是答案,因此我开发了一个自己的解决方案,我在这里描述:

使用 ANTLR 的通用代码完成

。这是针对 ANTLR 3 的,但当然也可以与 4 一起使用。 本文还包含几个 (C++) 源代码的链接,展示了如何在我的应用程序中实现代码完成。毕竟,实现如此简单,但仍然提供非常精确的结果,真是令人惊讶。

更新

同时我也为 ANTLR4 开发了一个解决方案,称为 [antlr4-c3][2]。这是一个 Typescript 解决方案,但附带了 [Java][3] 和 [C++][4] 的翻译。


0
投票
github 页面

上找到示例。 主要思想在这里:

token: (stream, state) => { // getting tokens for the current stream.string, using antlr4 TokenStream const tokens = getTokensForText(stream.string); // getting the next token const nextToken = tokens.filter(t => t.startIndex >= stream.pos)[0]; // matching the next token in current stream if (stream.match(nextToken.text)) { let valueClass = getStyleNameByTag(tags.keyword); switch (nextToken.type) { case ...: valueClass = getStyleNameByTag(tags.string); break; ... default: valueClass = getStyleNameByTag(tags.keyword); break; } return valueClass; } else { stream.next(); return null; } }



0
投票

https://thetrevorharmon.com/blog/connecting-antlr-to-codemirror-6-building-a-language-server/

© www.soinside.com 2019 - 2024. All rights reserved.