我用 Java 为 Android 开发了一个语法荧光笔,它运行良好,但问题是处理大文件时速度可能会很慢。
所以我想知道像 Eclipse 和 Gedit (Ubuntu) 这样的源代码编辑器如何快速突出显示您刚刚编写的内容。例如,如果您在编写 HTML 标签时输入结尾的大于符号,它会立即突出显示该标签。
即使是大文件,它怎么这么快?他们是否有特定的方法来执行此操作,或者他们只是对您所在的行执行语法突出显示?
谢谢,
亚历克斯
我不能谈论 Gedit,但在 Eclipse 中,我们作弊:-)
如果你仔细观察,你实际上会发现像 Java 这样的结构化语言的语法着色是一个两阶段的过程。
首先,运行演示协调器来执行非常基本的语法着色。这是在编辑器文档发生更改时立即触发的,预计速度非常快。确实不是syntax基于着色,但实际上从词汇上来说基于着色。因此,重点是字符串、关键字、单词、数字、注释等标记,所有标记都可以根据简单的字符表或类似表轻松识别。因此,类名、变量名或静态方法名之间没有区别,尽管它们最终的颜色可能不同。
对于许多语言来说,这是唯一完成的着色。
接下来,运行语法协调器来为文档构建抽象语法树 (AST),或者尽可能接近语法错误或语义错误。这是由计时器触发的,对于某些语言,会尝试just对 AST 进行部分更新(并不容易)。然后,完成的 AST 用于更新大纲视图,然后根据附加信息进行附加语法着色 - 例如静态方法名称。 (AST 经常用于许多其他用途,例如悬停信息、折叠、超链接等。
对于初始表示协调器和后来的基于语法的协调器,一些相当复杂的逻辑决定了必须解析的文档区域有多大。对于表示协调器,决策可以基于任何现有的着色,而对于基于语法的着色,运行中的单独损坏/修复阶段以确定区域的大小。
一些总是使事情复杂化的极端例子是添加或删除块注释
a = b /* c + 1 /* remember the offset! */;
如果删除或添加第一个斜杠,演示文稿协调器必须处理比天真的预期更大的区域......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)