parsing - 自动完成与解析器集成

标签 parsing events autocomplete event-handling tree

解析器通常如何处理自动完成?

如果我们举一个例子,我将以下内容传递给解析器:

"int i=2"

那么自动完成选项可能包括:

"int i=2,"
"int i=2;"

自动完成应该成为解析器的一部分吗?

如果不是,那么在基于事件的解析器的情况下,我猜测解析器将发出一个事件,其中包含解析器状态机中可能的那些分支的 id。然后,自动完成模块将知道为每个这样的状态打印什么。

对于基于树的解析器,解析器必须返回一个树结构,其中以某种方式包含可用的分支。

这是怎么做到的?当需要自动完成时,哪种类型的解析器最适合处理命令字符串?

最佳答案

您可以从 LR(k) 语法中读取先行集(即后面可接受的标记类型),但此类语法往往很大。压缩语法的各种形式(其中 LALR(1) 可能仍然是最常见的)使前瞻集不太精确(它将始终包含有效的标记类型,但也可能包含无效的标记类型)。表压缩和故意包含错误产生式(包含在内是为了改进错误消息)也可能会引入先行集中的无效标记类型。

从递归下降解析器读取前瞻集可能会比较棘手,部分原因是此类解析器通常是开放编码的,而不是依赖于转换表。然而,至少在理论上,LL(k) 语法也有可能计算先行集,尽管它也可能不精确。

不过,最有趣的自动完成功能不是标点符号而是符号。语法不足以告诉您哪些名称在给定点的范围内,尽管它可能能够告诉您哪些类型的名称是可行的。您需要连接到符号表才能获得准确的自动完成信息。在可以在声明之前使用标识符的语言中,这可能会更加棘手,尽管解析器可能确实在某处保留了未解析名称的列表。

使用解析器生成自动完成信息的另一个困难是解析器往往针对语法正确的程序进行优化,并且在检测到语法错误后可能根本无法工作。对于 IDE 用户来说,这确实令人恼火。较小的标点错误会禁用自动完成功能,直到找到并修复该错误。 (就我个人而言,我发现这样的系统太分散了编码的注意力;我宁愿专注于我现在正在编写的内容,也不愿关注代码其他部分中缺少的括号。)

IM(H)O,最好使用类似于 Packrat 解析的东西来在插入点挑选出足够的上下文,以便对接下来可能发生的内容有一个合理的概念。如果您有权访问完整的正确数据类型声明,请使用它们,但总是存在将文本中看起来像符号的任何内容放入前瞻集中的后备方案(尽管这也可能会让人恼火)。

无论如何,祝你好运。

关于parsing - 自动完成与解析器集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12512653/

相关文章:

c# - 如何将月份名称(字符串)解析为整数以便在 C# 中进行比较?

javascript - html javascript 自动完成不适用于动态添加的文本框

php - jQueryUI 自动完成 - PHP 从多个表中选择值

javascript - 如何将选项卡补全添加到 Nodejs CLI 应用程序

android - JSOUP 解析谷歌图片

java - 由于移动到 java 1.7 Xml 文档元素不缩进

html - 如何从这种类型的 html 源中提取文本?

wpf - 如何从 FrameworkElement 引发 Onload/OnUnload 事件以进行单元测试?

mysql - 如何检查事件调度程序状态mysql

events - 在运行时获取文本框 dojo 小部件内的值