2009-04-02 3 views
5

Я ищу несколько хороших обзоров лучших практик и общих шаблонов для включения подсветки синтаксиса в текстовом поле. Это похоже на очень распространенное упражнение. Почти все языки имеют элемент управления пользовательского интерфейса, который позволяет выделять синтаксис на разных языках. Мне просто интересно узнать, существует ли общая схема реализации.Шаблон с подсветкой синтаксиса

Все ли используют регулярные выражения? Существует ли репозиторий регулярных выражений, которые обычно используются в сценариях подсветки синтаксиса?

Есть ли альтернативные/лучшие подходы к подсветке синтаксиса?

Update

Ссылки на соответствующие ресурсы о выполнении синтаксиса данного языка или понятий, связанных с подсветкой синтаксиса было бы здорово. Лексинг (лексический анализ) был поднят в ответ, но без ссылки, чтобы узнать больше. Все, что поможет лучше понять эту часто решаемую проблему, было бы здорово.

Lexical Analysis on Wikipedia

+0

+1 Мне любопытно узнать об этом тоже .... Я подозреваю, что регулярные выражения будут слишком медленными для больших файлов, или, по крайней мере, они не будут работать для сложных вещей, например выделение только переменных, которые были определены. – mpen

ответ

2

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

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

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

+0

Итак, я бы предположил, что большинство веб-мастеров (javascript) выделяют регулярные выражения, а фактические IDE - лексирование? –

+0

Наверное - хотя даже с JS хорошие редакторы, скорее всего, будут lex. Режиссер, ну, они время от времени путаются. Я знаю, что видел, как это происходит в некоторых редакторах, где они думают, что кавычка, которая экранирована, на самом деле является ограничителем строк. – levik