Как реализовать подсветку синтаксиса?

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

Может ли кто-нибудь дать мне идеи о том, как это сделать?

Мне кажется, что когда файл открывается:

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

  • Способ узнать, какие ключевые слова/команды применяются к тому, на каком языке

  • Способ определения цвета каждого ключевого слова/команды

Я хочу сделать это на OS X, используя С++ или Objective-C.

Может ли кто-нибудь указать указатели на то, как я мог бы начать с этого?

Ответ 1

Предполагая, что вы используете фреймворки Cocoa, вы можете использовать UTI для определения типа файла.

Обзор api:

http://developer.apple.com/mac/library/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_intro/understand_utis_intro.html#//apple_ref/doc/uid/TP40001319-CH201-SW1

Список известных UTI:

http://developer.apple.com/mac/library/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259-SW1

Два ключа, которые вы, вероятно, больше всего интересуетесь, будут kUTTypeObjectiveC PlusPlusSource и kUTTypeCPlusPlusHeader.

Для подсветки вы можете найти полезную информацию на этой странице, поскольку она обсуждает подсветку синтаксиса с помощью NSView и временных атрибутов:

http://www.cocoadev.com/index.pl?ImplementSyntaxHighlightingUsingTemporaryAttributes

Ответ 2

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

Возможно, вы захотите рассмотреть вопрос о тренировке с помощью Flex (генератор лексического анализатора https://github.com/westes/flex) в качестве учебного упражнения. В Flex должно быть довольно просто реализовать базовый синтаксический ярлык, который выводит выделенный HTML-код или что-то в этом роде.

Короче говоря, вы бы предоставили Flex набор регулярных выражений и что делать с соответствующим текстом, и генератор будет жадно соответствовать вашим выражениям. Вы можете сделать свой лексерский переход между эксклюзивными состояниями (например, внутри и вне строковых литералов, комментариев и т.д.), Как показано в часто задаваемые вопросы flex. Здесь приведен канонический пример лексера для C, написанного в Flex: http://www.lysator.liu.se/c/ANSI-C-grammar-l.html.

Создание расширяемого синтаксического маркера будет следующей частью вашего путешествия. Хотя я никоим образом не поклонник XML, посмотрите, как определяются файлы подсветки синтаксиса Kate, такие как этот для С++. Ваша задача состояла бы в том, чтобы выяснить, как вы хотите определить синтаксические выделения, а затем создать программу, которая использует эти определения для генерации HTML или что угодно.

Ответ 3

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

Здесь вы можете получить список ключевых слов С++: http://www.cppreference.com/wiki/keywords/start

Цвета зависят от вас (или, если хотите, вы можете настроить их и оставить выбор для пользователя)

Ответ 4

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