Подсветка синтаксиса: как Eclipse делает это так быстро? - PullRequest
9 голосов
/ 30 августа 2011

Я разработал подсветку синтаксиса в Java для Android, и она работает хорошо, но проблема в том, что она может быть медленной с большими файлами.

Поэтому мне интересно, как редакторы исходного кода, такие как Eclipse и Gedit(Ubuntu) выделите то, что вы так быстро написали.Например, если при вводе тега HTML вводится окончание больше символа, он сразу выделяет тег.

Как это быстро, даже с большими файлами?Есть ли определенный способ, которым они делают это, или они просто выполняют подсветку синтаксиса для строки, на которой вы находитесь?

Спасибо, Алекс

1 Ответ

34 голосов
/ 30 августа 2011

Я не могу говорить за Gedit, но в Eclipse мы обманываем: -)

Если вы посмотрите очень внимательно, вы можете увидеть, что раскраска синтаксиса для структурированных языков, таких как Java, является двухфазным процессом.

Сначала запускается согласователь презентаций, чтобы выполнить базовую раскраску синтаксиса.Это делается сразу же при изменениях в документе редактора и, как ожидается, будет чрезвычайно быстрым.Это на самом деле не синтаксис основанная окраска, но на самом деле лексическая основанная окраска.Поэтому основное внимание уделяется токенам, таким как строки, ключевые слова, слова, числа, комментарии и т. Д. - все токены, которые можно легко распознать на основе простых таблиц символов или аналогичных.Таким образом, нет никакой разницы между именем класса, именем переменной или именем статического метода, даже если в конце они могут быть окрашены в разные цвета.Для многих языков это единственная окраска.

Затем запускается согласователь синтаксиса для построения абстрактного синтаксического дерева (AST) для документа - или настолько близко, насколько это возможно, перед лицом синтаксических или семантических ошибок.Это запускается таймером, и для некоторых языков делается попытка просто сделать частичное обновление AST (не легко).Заполненный AST затем используется для обновления вида структуры, а затем для дополнительной раскраски синтаксиса на основе дополнительной информации - например, имени статического метода.(AST часто используется для многих других целей, таких как наведение информации, свертывание, гиперссылки и т. Д.

Как для начального согласователя представления, так и для более позднего согласователя на основе синтаксиса, довольно сложная логика определяет, насколько велика областьдокумента, который должен быть проанализирован. Для согласователя представления решение может быть основано на любой существующей раскраске, тогда как для раскраски на основе синтаксиса выполняется отдельная фаза повреждения / исправления для определения размера региона.

Некоторые крайние примеры, которые всегда усложняют ситуацию, это когда добавляются или удаляются комментарии к блоку

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

Если удаляется или добавляется первый слеш, компоновщик представления должен обрабатывать большую область, чем то, что можно наивно ожидать..

...