Написание подсветки синтаксиса - PullRequest
21 голосов
/ 01 мая 2009

Я надеялся написать свою собственную подсветку синтаксиса для летнего проекта, над которым я думаю работать, но я не уверен, как написать свою собственную подсветку синтаксиса.

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

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

Любое понимание будет с благодарностью.

Спасибо.

PS: я планировал написать его в ActionScript

Ответы [ 7 ]

20 голосов
/ 01 мая 2009

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

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

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

4 голосов
/ 09 мая 2017

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

Очень простой подсвечник, написанный на JavaScript, будет выглядеть так:

var keywords = [ "public", "class", "private", "static", "return", "void" ];
for (var i = 0; i < keywords.length; i++)
{
        var regex = new RegExp("([^A-z0-9])(" + keywords[i] + ")([^A-z0-9])(?![^<]*>|[^<>]*</)", "g");
        code = code.replace(regex, "$1<span class='rm-code-keyword'>$2</span>$3");
}
4 голосов
/ 01 мая 2009

In StackOverflow подкаст № 50 Стив Йегге немного рассказывает о своем проекте по созданию какого-то общего механизма подсветки. Не готовый продукт и, возможно, более сложный, чем вы ищете, но может быть что-то интересное.

3 голосов
/ 01 мая 2009

Может помочь, если вы объясните, для чего предназначен этот подсветчик синтаксиса. Если вы пишете это в ActionScript, ваша идея - иметь текстовое поле во флэш-фильме и выделить синтаксис после нажатия кнопки отправки? Или вы хотите прочитать текст из какого-либо веб-сервиса и затем отобразить выделенный синтаксис? ... мне трудно помочь, потому что мне трудно представить, что ты делаешь

Однако подсветчик синтаксиса читает текст, а затем сравнивает строки кода с некоторыми регулярными выражениями, которые помогают подсветчику синтаксиса понять, что означают слова. Например, он может прочитать слово «function» или «int» как зарезервированные слова и заменить их HTML-текстом:

<span class="reserved">function</span>, <span class="reserved"></span>

при условии, что у вас есть css и вы хотите зарезервированные слова красным,

.reserved{
  color: #ff0000;
}

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

2 голосов
/ 15 июня 2012

Хорошим началом этого подхода является курс Udacity CS262 . Заголовок строит веб-браузер, но на самом деле класс фокусируется именно на проблемах, которые вы ищете, - на том, как анализировать и анализировать набор текста. В вашем случае вы бы использовали эту информацию для выделения. Я только взял это, и это было очень хорошо. Курс «закончен», но видео и практические задания / домашние задания все еще доступны и доступны для просмотра.

2 голосов
/ 01 мая 2009

К сожалению, я никогда не использовал Actionscript, поэтому я не могу помочь с этой частью.

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

Лично я нашел Начало регулярных выражений , чтобы быть хорошим. Овладение регулярными выражениями также подойдет для более продвинутых предметов. Справочник карманных выражений регулярных выражений , с другой стороны, удобен для определения различий в вышеупомянутых вариантах, поскольку в него также включена глава о регулярных выражениях vim.

1 голос
/ 17 июня 2009

Я недавно опубликовал в своем блоге инструмент для раскраски кода SQL: http://gruchalski.com/2009/04/26/flex-textrange-performance-issue-on-linux/

Вы можете найти ссылку на sqlcodecoloring.zip с источником. Это реализовано с использованием токенизатора и класса TextRange.

Другая ссылка, раскраска кода sql как часть приложения-прототипа: http://github.com/radekg/mysqlinterface/tree/master

...