语法突出显示:Eclipse如何快速完成?

Ale*_*eAP 9 eclipse syntax-highlighting gedit

我已经在Java for Android中开发了一种语法高亮显示器并且它运行良好,但问题是它对于大文件来说可能很慢.

所以我想知道像Eclipse和Gedit(Ubuntu)这样的源代码编辑器如何快速突出你刚刚编写的内容.例如,如果在编写HTML标记时输入大于符号的结尾,则会立即突出显示标记.

它是如此快速,即使是大文件?是否有特定的方式来执行此操作,或者只是为您所在的行执行语法突出显示?

谢谢,亚历克斯

Ton*_*sen 34

我无法谈论Gedit,但在Eclipse中,我们作弊:-)

如果你仔细观察,你实际上可以看到像Java这样的结构化语言的语法着色是一个两阶段的过程.

首先,运行演示协调程序以执行非常基本的语法着色.这是在编辑器文档中的更改时立即触发的,并且预计会非常快.它实际上不是基于语法的着色,而是实际上基于词汇的着色.所以重点是标记,如字符串,关键字,单词,数字,注释等 - 所有令牌都可以根据简单的字符表或类似方法轻松识别.因此,类名,变量名或静态方法名之间没有区别,即使它们最终可能有不同的颜色.对于许多语言来说,这是唯一的着色.

接下来,运行语法协调程序来为文档构建抽象语法树(AST) - 或者尽可能接近语法错误或语义错误.这是由计时器触发的,对于某些语言,尝试仅对 AST进行部分更新(不容易).然后使用完成的AST更新大纲视图,然后根据附加信息(例如静态方法名称)执行其他语法着色.(AST经常用于许多其他事情,如悬停信息,折叠,超链接等.

对于初始表示协调器和后面基于句法的协调器,一些相当精细的逻辑确定了必须解析的文档区域有多大.对于演示协调器,决策可以基于任何现有着色,而对于基于语法的着色,运行中的单独损坏/修复阶段以确定区域的大小.

一些总是使问题复杂化的极端例子是添加或删除块注释

a = b /* c + 1 /* remember the offset! */;
Run Code Online (Sandbox Code Playgroud)

如果删除或添加第一个斜杠,则表示协调程序必须处理比天真预期更大的区域...