我熟悉解析器生成器以及从头到尾一次处理流的解析器的基础知识。
我的问题是语法高亮文本编辑器等情况。当用户将每个单个字符更改为一个非常大的文件时,必须执行大量计算以重新解析并重新突出显示整个文件。
我能想到的简单优化:
但是,是否通常有适用的技术来重新处理“本地”文本而不从文件的开头开始?
思想:
但我认为这已经解决了,或者有人知道它无法正常工作,并且解析整个文件对于一般语法来说总是必要的。
谢谢!
答案 0 :(得分:3)
语法高亮不一定非精确。实际上,有时精确的语法突出显示很烦人(因为在整个屏幕变灰时,因为语法错误是在文件开头的某处引入的)。你通常可以逃脱:
只需着色令牌类即可完成大部分工作。
为了匹配大括号,括号和圆括号(BBP),您只需要向后扫描到屏幕上可见BBP的最早匹配BBP。您可以在后台执行此操作,因为在用户查找匹配项之前通常不会产生任何后果。
有时令牌难以识别倒退(阻止评论,正则表达式)。在这种情况下,返回一些固定距离并向前扫描。几百行不应该增加太多的开销。或者(这也适用于#2),将词汇状态缓存在关键点,例如以低嵌套级别的BBP结束的行。
这些只是一些建议。在Vim和Emacs存储库中有很多成功的荧光笔的例子,您可以查看特定语言的实用想法。