Parsing 大文件的实时语法突出显示解析器

Parsing 大文件的实时语法突出显示解析器,parsing,optimization,syntax-highlighting,Parsing,Optimization,Syntax Highlighting,我熟悉解析器生成器以及从头到尾一次性处理流的解析器的基础知识 我的问题是针对语法突出显示文本编辑器之类的情况。当用户将每个字符更改为一个非常大的文件时,需要执行大量计算才能重新解析和突出显示整个文件 我能想到的简单优化: 延迟该操作,直到击键空闲几秒钟 重新分析整个文件,但格式只能应用于可见的视口文本 但是,是否存在只重新处理“本地”文本而不从文件开头开始的普遍适用的技术 想法: 更改的上游影响似乎不如下游更改的影响大,因此,根据算法允许的前瞻令牌数量,我们可能可以从这么多令牌重新处理回文

我熟悉解析器生成器以及从头到尾一次性处理流的解析器的基础知识

我的问题是针对语法突出显示文本编辑器之类的情况。当用户将每个字符更改为一个非常大的文件时,需要执行大量计算才能重新解析和突出显示整个文件

我能想到的简单优化:

  • 延迟该操作,直到击键空闲几秒钟
  • 重新分析整个文件,但格式只能应用于可见的视口文本
但是,是否存在只重新处理“本地”文本而不从文件开头开始的普遍适用的技术

想法:

  • 更改的上游影响似乎不如下游更改的影响大,因此,根据算法允许的前瞻令牌数量,我们可能可以从这么多令牌重新处理回文件末尾
  • 我们知道在大多数重新处理请求时光标在哪里,因此我们可以捕获该点的一些状态快照,然后从那里继续(如果这有帮助的话)
但是我假设这个问题已经解决了,或者有人知道它无法工作,并且解析整个文件对于一般语法来说总是必要的


谢谢

语法突出显示不一定要精确。事实上,有时精确的语法高亮显示很烦人(例如,当整个屏幕变灰时,因为在文件开头的某个地方引入了语法错误)。您通常可以通过以下方式逃脱:

  • 大部分工作都是通过给令牌类着色来完成的

  • 为了匹配大括号、方括号和圆括号(BBP),只需向后扫描屏幕上最早匹配的BBP即可。您可以在后台执行此操作,因为在用户查找匹配项之前,通常不会产生任何结果

  • 有时标记很难向后识别(块注释、正则表达式)。在这种情况下,返回固定距离并向前扫描。几百行不应该增加太多开销。或者(这也适用于#2),在策略点缓存词汇状态,例如以低嵌套级别的BBP结尾的行


  • 这些只是一些建议。Vim和Emacs存储库中有许多成功的高亮显示程序的示例,您可以查看这些示例以了解特定语言的实用思想。

    NB通常语法高亮显示可以从标记中完成,您不需要解析任何内容。