1

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

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

我能想到的简单优化:

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

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

想法:

  • 更改的上游影响似乎不如下游更改的影响,因此取决于算法允许多少前瞻令牌,也许我们可以从那么多令牌重新处理回文件末尾?
  • 我们知道在大多数重新处理请求时光标在哪里,因此我们可以捕获该点的状态快照以从那里恢复(如果有帮助的话)。

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

谢谢!

4

1 回答 1

3

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

  1. 只需为标记类着色即可完成大部分工作。

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

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

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

于 2012-10-24T17:15:05.023 回答