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

时间:2012-10-24 14:13:43

标签: parsing optimization syntax-highlighting

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

我的问题是语法高亮文本编辑器等情况。当用户将每个单个字符更改为一个非常大的文件时,必须执行大量计算以重新解析并重新突出显示整个文件。

我能想到的简单优化:

  • 延迟操作直到键击空闲几秒钟
  • 重新分析整个文件,但格式化只能应用于可见的视口文本

但是,是否通常有适用的技术来重新处理“本地”文本而不从文件的开头开始?

思想:

  • 变化的上游影响似乎比下游变更影响小,因此根据算法允许的前瞻令牌数量,我们可以从那么多令牌重新处理回到文件末尾吗?
  • 我们知道光标在大多数重新处理请求时的位置,因此我们可以捕获该点的某些状态快照以从那里恢复(如果这会有所帮助)。

但我认为这已经解决了,或者有人知道它无法正常工作,并且解析整个文件对于一般语法来说总是必要的。

谢谢!

1 个答案:

答案 0 :(得分:3)

语法高亮不一定非精确。实际上,有时精确的语法突出显示很烦人(因为在整个屏幕变灰时,因为语法错误是在文件开头的某处引入的)。你通常可以逃脱:

  1. 只需着色令牌类即可完成大部分工作。

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

  3. 有时令牌难以识别倒退(阻止评论,正则表达式)。在这种情况下,返回一些固定距离并向前扫描。几百行不应该增加太多的开销。或者(这也适用于#2),将词汇状态缓存​​在关键点,例如以低嵌套级别的BBP结束的行。

  4. 这些只是一些建议。在Vim和Emacs存储库中有很多成功的荧光笔的例子,您可以查看特定语言的实用想法。