文本编辑器如何执行语法突出显示?我知道vim使用带有特殊扩展的简单正则表达式来使它们更加强大,以区分语法元素,但我也知道像TextMate这样的其他文本编辑器允许您定义完整的解析器。不知道TextMate在大文件上表现良好,但Sublime Text据说在大文件上比vim表现更好,但支持传统的TextMate语法解析器。是否有一些有趣的黑客用来避免执行文件的从上到下的解析,或者只是采用了非常有效的解析算法?
答案 0 :(得分:11)
我写了一次文本编辑器。我以为我能比别人做得更好。然后我学会了Vim并意识到我错了:P突出引擎的一部分still exist on GitHub。
有几种方法可行。您可以编写真正的词法分析(或浅层解析)例程,但如果您有效地使用它们并且您不是源解析理论方面的专家,那么正则表达式实际上可能会更快。我使用了两者的混合。
为了获得良好的性能,编辑极不可能突出显示整个文件。相反,只需突出显示文件的可见区域,这样就可以最大限度地减少完成的工作。当然,那么你必须考虑当用户开始编辑那个可见区域的中间某处时会发生什么。我的方法是始终在内存中保留词法分析器状态(即所有令牌和词法状态的放置)的快照,然后从光标向后走一个或两个令牌,在该点使用词法分析器状态(即保持令牌和状态堆栈在左侧,并丢弃右侧的那些)并从该点重新启动突出显示器直到可见范围的结束。因为所有(我认为)源语言都是从左到右读取的,所以在编辑区域左侧进一步突出显示的标记永远不会改变。
编辑|只是重新阅读我的源代码,我还有一些其他优化方法。长的关键字列表(例如内置函数名称)检查起来很昂贵。我将它们构建成一个基数树,它具有巨大的性能提升。