Подсветка синтаксиса: как Eclipse делает это так быстро?

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

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

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

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


person AlexPriceAP    schedule 30.08.2011    source источник
comment
Я полагаю, что он хранит и выделяет только то, что вы видите в окне просмотра, а не невидимый остаток кода.   -  person BalusC    schedule 30.08.2011


Ответы (1)


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

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

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

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

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

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

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

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

person Tonny Madsen    schedule 30.08.2011