Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Autocomplete 如何实现编程语言的自动补全器_Autocomplete_Context Free Grammar - Fatal编程技术网

Autocomplete 如何实现编程语言的自动补全器

Autocomplete 如何实现编程语言的自动补全器,autocomplete,context-free-grammar,Autocomplete,Context Free Grammar,这不完全是一个问题,因为在这一刻,我无法在脑海中安排一个精确的问题来提问。我想与其他成员分享的更多的是一系列响亮的想法,以解决我的疑问。 我正在尝试为JavaScript实现一个自动完成程序。不要浪费时间对我说,对于一种非静态类型的编程语言,不可能有一个完整的自动完成程序。我已经知道了。 我想要的是一个小的自动补全器,如果我这样定义: var a = { b: { first: "goofy",second: 5}, c: "minnie"}; if (a.b.second > 0)

这不完全是一个问题,因为在这一刻,我无法在脑海中安排一个精确的问题来提问。我想与其他成员分享的更多的是一系列响亮的想法,以解决我的疑问。 我正在尝试为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。 我花了上个月的时间学习如何使用斯坦福大学编译器课程提供的材料解析东西。 现在我有点糊涂了。显然,如果我必须创建一个编译器,我会使用LALR语法和flex&bison等工具。但自动补全是另一回事。它是互动的。当您键入时,您没有完整的代码,并且您在一个时刻键入的行在编程语言中不是有效的句子。如果我在打a。LALR解析器会说,它无法将句子简化为开始的结果。这意味着直到现在还不能完全解析我写的东西。但无论如何,我必须解析这个句子,以显示“a”中的成员。 如果我已经很好地理解了,LALR解析比LL更懒惰。LALR试图在应用缩减之前收集尽可能多的词素。因此,我的印象是,对于编译器来说,LALR是正确的选择,但是对于自动完成程序来说,LL更好(如果您要解析的编程语言显然有LL语法)。对吗?
很抱歉,我知道我的帖子让人困惑,但现在我的脑子里也有同样的困惑,我希望有人能帮我清理一下脑子里的混乱。我正在寻找一位在编写自动补全程序方面有一定经验的人,他可以给我一些小而有用的提示。

我想说的是,无论你是使用LALR还是LL解析器来实现这一点都无关紧要。不管生成器的选择如何,关键问题是解析器足够健壮,能够以有意义的方式处理错误

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

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