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

时间:2011-08-30 12:50:58

标签: eclipse syntax-highlighting gedit

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

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

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

谢谢, 亚历

1 个答案:

答案 0 :(得分:33)

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

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

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

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

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

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

a = b /* c + 1 /* remember the offset! */;

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