4

文本编辑器如何执行语法高亮?我知道 vim 使用带有特殊扩展名的简单正则表达式来使它们更强大地区分语法元素,但我也知道其他一些文本编辑器(如 TextMate)允许您定义完整的解析器。TextMate 在大文件上的表现并不好,但 Sublime Text 在大文件上的表现应该比 vim 好,而且还支持传统的 TextMate 语法解析器。它是否使用了一些有趣的技巧来避免对文件执行从上到下的解析,或者它只是使用了一种非常有效的解析算法?

4

1 回答 1

11

我曾经写过一个文本编辑器。我以为我可以比别人做得更好。然后我学习了 Vim 并意识到我错了:P 我的高亮引擎的一部分仍然存在于 GitHub 上

几种方法是可能的。您可以编写真正的词法分析(或浅解析)例程,但如果您有效地使用正则表达式并且您不是源解析理论方面的专家,那么它们实际上可能会更快。我使用了两者的混合。

为了获得良好的性能,编辑器极不可能突出显示整个文件。相反,只需突出显示文件的可见区域,这样您就可以最大限度地减少完成的工作。当然,然后您必须考虑当用户在中间某处开始编辑时会发生什么那个可见区域。我的方法是始终在内存中保留词法分析器状态的快照(即所有标记和词法状态的位置),然后从光标开始,向后走一两个标记,使用该点的词法分析器状态(即保持左侧的令牌和状态堆栈,并丢弃右侧的令牌)并从该点重新启动荧光笔,直到可见范围结束。因为所有(我认为)源语言都是从左到右读取的,所以在编辑区域左侧更远的标记的突出显示永远不会改变。

编辑 | 只是重新阅读我的源代码,我在此过程中还做了一些其他的优化。很长的关键字列表(例如内置函数名称)检查起来很昂贵。我将它们构建为具有巨大性能提升的基数树。

于 2012-10-29T11:17:25.187 回答