autocomplete - 如何为编程语言实现自动完成器

标签 autocomplete context-free-grammar

这不完全是一个问题,因为此刻我无法在脑海中安排一个精确的问题来问。它更多的是我想与其他成员分享的大声想法的集合,以解决我的疑虑。 我正在尝试为 JavaScript 实现一个自动完成器。不要浪费时间对我说不可能为非静态类型的编程语言提供完整的自动完成器。我已经知道了。 我想要的是一个小型自动完成器,如果我定义类似的东西:

var a = {
b: { first: "goofy",second: 5},
c: "minnie"};

if (a.b.second > 0)
   a.s = 0;
else
   a.t = "honey";

当我数字a时。自动完成器应该显示 b、c、s、t。 我花了上个月的时间学习如何使用斯坦福大学编译器类(class)提供的 Material 来解析事物http://www.stanford.edu/class/cs143/ 。 现在我有点困惑。显然,如果我必须创建一个编译器,我会使用 LALR 语法和像 flex&bison 这样的工具。但自动完成器却是另一回事。它是互动的。当您键入时,您没有完整的代码,并且您在一个瞬间键入的行不是编程语言中的有效句子。如果我输入 a. LALR 解析器会说无法将句子简化为起始产生式。这意味着到目前为止还不能完全解析我写的内容。但无论如何,我必须解析该句子才能显示“a”内的成员。 如果我很好理解的话,LALR 解析比 LL 更懒。 LALR 尝试在应用缩减之前收集尽可能多的词位。所以我的印象是 LALR 对于编译器来说是正确的选择,但 LL 对于自动完成器来说更好(如果你要解析的编程语言显然有 LL 语法)。这是对的吗? 抱歉,我知道我的帖子令人困惑,但此刻我的脑海中也有同样的困惑,我希望有人能帮助我清理大脑中的困惑。我正在寻找在编写自动完成器方面具有某种经验的人,他可以给我一些小而有用的提示。

最佳答案

我想说,如果您使用 LALR 或 LL 解析器来实现这一点并不重要。无论选择哪种生成器,关键问题是解析器是否足够强大,能够以有意义的方式处理错误。

由于您将连续向解析器提供不完整的输入,因此它必须能够以稳定的方式从错误中恢复而不会放弃。通常,一个简单的解决方案是,当您发现错误时,您将忽略 token ,直到再次达到可理解的状态。在 JS 中,我想最好的方法是吃掉 token ,直到得到 ;}。从中您可以再次继续解析,就好像错误从未发生过一样。 Bison 实际上很好地处理了这种情况,请查看错误处理文档。

自动完成器本身基本上是从任何给定点开始遍历符号表。当您正确识别时,不可能执行完整的自动完成程序,因为该语言不是静态类型的,但您至少可以知道在给定点静态声明了什么。

关于autocomplete - 如何为编程语言实现自动完成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9209975/

相关文章:

context-free-grammar - 构建上下文无关语法

compiler-construction - 将属性从 flex 返回给 bison

javascript - extjs组合框中的自动完成

javascript - 尝试让 tag-it 与 AJAX 调用一起使用

java - 如何使用 jquery 自动完成?

fluent-interface - 流畅的接口(interface)是由上下文无关语法还是常规语法描述的?

parsing - 使用 Parsec 解析正则表达式

Javascript,打字时自动加载文本框

启动时 Emacs 自动完成模式

context-free-grammar - Σ* 是上下文无关语言吗