Parsing 文本编辑器中的语法分析

Parsing 文本编辑器中的语法分析,parsing,vim,editor,textmate,Parsing,Vim,Editor,Textmate,文本编辑器如何执行语法突出显示?我知道vim使用带有特殊扩展的简单正则表达式使它们在区分语法元素方面更强大,但我也知道其他一些文本编辑器(如TextMate)允许您定义完整的解析器。TextMate在大文件上的性能并不好,但Sublime Text在大文件上的性能应该比vim更好,并且支持传统的TextMate语法解析器。它是否采用了一些有趣的技巧来避免对文件执行从上到下的解析,还是仅仅采用了一种非常有效的解析算法?我曾经编写过一个文本编辑器。我认为我可以做得比别人好。然后我学习了Vim,意识到

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

我曾经编写过一个文本编辑器。我认为我可以做得比别人好。然后我学习了Vim,意识到我错了:我的引擎的P部分

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

为了获得良好的性能,编辑器极不可能突出显示整个文件。相反,只需突出显示文件的可见区域,这样就可以最小化所做的工作。当然,你必须考虑当用户开始在可见区域中间进行编辑时会发生什么。我的方法是始终在内存中保留lexer状态的快照(即所有标记和词法状态的放置),然后从光标开始,向后移动一个或两个标记,在该点使用lexer状态(即将标记和状态堆栈保持在左侧,并丢弃右侧的标记)然后从该点重新启动荧光灯,直到可见范围结束。因为所有(我认为)源语言都是从左到右读取的,所以在编辑区域的左边突出显示标记的方式永远不会改变


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

为什么不查看源代码或直接询问作者?