这不是一个问题,因为在这一刻我无法在脑海中安排一个准确的问题。为了解决我的疑虑,我想与其他成员分享这是一个响亮的声音想法的集合。 我正在尝试为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。 我花了上个月学习如何使用斯坦福大学http://www.stanford.edu/class/cs143/编译器课程提供的材料来解析事物。 现在我有点困惑。显然,如果我必须创建一个编译器,我会使用LALR语法和flex& bison等工具。但自动完成它是一个不同的东西。这是互动的。当您输入时,您没有完整的代码,并且您在单个momente中输入的行不是编程语言中的有效语句。如果我正在打字。 LALR解析器会说无法将句子减少到开始生产。这意味着到目前为止还无法完全解析我所写的内容。但无论如何我必须解析句子以显示成员在“a”中的内容。 如果我很好理解LALR解析比LL更懒。 LALR试图在应用减少之前尽可能多地收集lexemes。所以我的印象是LALR是编译器的正确选择,但LL更适合自动完成(如果您要解析的编程语言显然具有LL语法)。这是对的吗? 对不起,我知道我的帖子令人困惑但是在这一刻我心中也有同样的困惑,我希望有人可以帮助我清理我脑中的混乱局面。我正在寻找具有某种编写自动完成功能经验的人,这可能会给我一些小而实用的提示。
答案 0 :(得分:3)
我想说如果你使用LALR或LL解析器来实现这一点并不重要。无论选择何种生成器,关键问题都在于解析器足够强大,能够以有意义的方式处理错误。
由于您将不断地为解析器提供不完整的输入,因此必须能够以稳定的方式从错误中恢复而不放弃。通常,一个简单的解决方案是,当您发现错误时,您会忽略令牌,直到您再次达到可理解的状态。在JS中,我想最好的办法就是在获得;
或}
之前吃掉令牌。从中再次继续解析,就好像错误从未发生过一样。 Bison实际上很好地处理了这种情况,看看错误处理文档。
自动完成器本身基本上是从任何给定点开始的符号表。正确识别标识符时,不可能完成自动完成,因为语言不是静态类型,但您至少可以知道在给定点静态声明的内容。