我正在将一个普通的全重启分词器(从原始语言解析器移植而来,此处语言无关)转换为更高级的增量分词器。这意味着以下几点:
a) 它必须快,非常快;
b) 每次文本更新(插入或删除)时,它必须查找受损的标记,并相应地修复标记列表。
原始分词器版本只是使用正则表达式遍历缓冲区文本并构建标记列表;列表中的每个标记都是一个由4个元素组成的向量(['TOKENTYPE "token-lexeme" linum charnum'])。Linum/charnum是指在进行词法分析时在缓冲区中的标记位置的纯数字。很容易理解。
现在,重点来了。每当(嗯...不是每次,但经常)用户添加或删除字符(或字符串)时,新分词器都必须找到一个使用更改位置中的文本构建的标记以及可能的依赖标记以供后续删除/更新使用。
这里有两个问题:
a) 标记位置应该是动态的(即如果用户在缓冲区开头添加一些文本,则我们不应该费心修复缓冲区末尾的标记);
b) 找到受损标记(或大量标记)的方法。
现在我正在尝试使用覆盖来完成此任务,因为覆盖具有适合我的需求的良好接口:overlay-at/overlay-in函数可帮助搜索;而覆盖的起始/结束位置也可以以适当的方式移动。
对于较小的文件,我可以愉快地这样做。但事实证明(我必须承认,文档中已经警告过我),该解决方案无法扩展:即使是平均1K LOC文件也可能有CONST * LOC个覆盖,这对Emacs来说太多了。
那是我第一次尝试,它并不成功。我正在考虑替代方案,例如:
1) 使用纯数字管理手写标记搜索树;
2) 相同的树,但使用标记;
3) 一种混合方法,包括纯数字和标记。
是否有其他替代方法?或者也许有更好的处理大量覆盖的方法?
a) 它必须快,非常快;
b) 每次文本更新(插入或删除)时,它必须查找受损的标记,并相应地修复标记列表。
原始分词器版本只是使用正则表达式遍历缓冲区文本并构建标记列表;列表中的每个标记都是一个由4个元素组成的向量(['TOKENTYPE "token-lexeme" linum charnum'])。Linum/charnum是指在进行词法分析时在缓冲区中的标记位置的纯数字。很容易理解。
现在,重点来了。每当(嗯...不是每次,但经常)用户添加或删除字符(或字符串)时,新分词器都必须找到一个使用更改位置中的文本构建的标记以及可能的依赖标记以供后续删除/更新使用。
这里有两个问题:
a) 标记位置应该是动态的(即如果用户在缓冲区开头添加一些文本,则我们不应该费心修复缓冲区末尾的标记);
b) 找到受损标记(或大量标记)的方法。
现在我正在尝试使用覆盖来完成此任务,因为覆盖具有适合我的需求的良好接口:overlay-at/overlay-in函数可帮助搜索;而覆盖的起始/结束位置也可以以适当的方式移动。
对于较小的文件,我可以愉快地这样做。但事实证明(我必须承认,文档中已经警告过我),该解决方案无法扩展:即使是平均1K LOC文件也可能有CONST * LOC个覆盖,这对Emacs来说太多了。
那是我第一次尝试,它并不成功。我正在考虑替代方案,例如:
1) 使用纯数字管理手写标记搜索树;
2) 相同的树,但使用标记;
3) 一种混合方法,包括纯数字和标记。
是否有其他替代方法?或者也许有更好的处理大量覆盖的方法?
Wisent
和semantic
。可能你已经检查过了。还有一些高亮支持,例如http://www.gnu.org/software/emacs/manual/html_mono/semantic.html#Highlight-Func-Mode
。 - Tobias