Как вы реализуете подсветку синтаксиса? - PullRequest
10 голосов
/ 17 апреля 2010

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

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

Мне кажется, что при открытии файла:

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

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

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

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

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

Ответы [ 4 ]

13 голосов
/ 17 апреля 2010

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

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

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

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

1 голос
/ 17 апреля 2010

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

1 голос
/ 17 апреля 2010

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

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

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

0 голосов
/ 17 апреля 2010

Предполагая, что вы используете платформы Какао, вы можете использовать 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

Для списка известных ИМП:

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

...