Подтвердить что ты не робот

Написание синтаксического ярлыка

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

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

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

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

Спасибо.

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

Построение синтаксического маркера - это поиск определенных ключевых слов в коде и предоставление им определенного стиля (шрифт, стиль шрифта, цвет и т.д.). Чтобы достичь этого, вам нужно будет определить список ключевых слов, специфичных для языка программирования, на котором написан код, а затем проанализировать текст (например, с помощью регулярных выражений), найти конкретные маркеры и заменить их на правильно оформленные 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

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

Однако синтаксический ярлык читает в тексте, затем сравнивает строки кодов с некоторым регулярным выражением, которые помогают синтаксическому ярлыку определить, что означают слова. Например, он может читать слово "функция" или "int" в качестве зарезервированных слов и заменять их текстом html:

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

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

.reserved{
  color: #ff0000;
}

Это основная концепция, и вы можете захотеть принять идеи из geshi, поскольку вы можете просмотреть исходный код.

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

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

Еще одна ссылка, цвет кода sql как часть прототипа: http://github.com/radekg/mysqlinterface/tree/master