Проблемы со спичками, содержащими пространство для gtksourceview?
Я работаю над улучшением подсветки синтаксиса для Ada в gtksourceview (в настоящее время она очень устарела и очень неполна). Проблема, с которой я столкнулся, заключается в том, что Ада очень позиционная, поэтому для сопоставления многих конструкций требуется совпадение этих позиций. Я смог сделать это в нано довольно легко.
Итак, давайте рассмотрим объявление типа, например:
type Trit is range 0..2;
Ключевые слова, такие как "тип", "есть" и "диапазон", распознаются (и были изначально). Однако имена типов рассматривались как ключевые слова (плохое дизайнерское решение, поскольку Ada регулярно определяет новые типы даже для простых типов, таких как целые числа). Что получает использование, так это то, что типы в Стандарте окрашены, а все остальные типы выглядят как обычный текст, что не соответствует цели выделения. В некоторых языках это может быть заметной проблемой. Однако большинство имен типов происходит после двух шаблонов регулярных выражений:
type\s+(\w|\.|_)+
:\s+(\w|\.|_)+
Это может быть просто вопросом реализации (кажется, что nano и gtksourceview используют разные реализации регулярных выражений). Я думал, что проблема заключалась в распознавании пробелов. Как оказалось, размещение контекста типа над контекстом ключевого слова приводит к выделению типов, но ключевое слово "тип" или оператор ":" не выделяются должным образом (они выделяются как "тип"). Мне удалось переопределить это в nano, что привело к правильному выделению, но не могу понять, как это делает gtksourceview.
Здесь вы можете увидеть старое определение gtksourceview в действии, которое не работает для файла с множеством пользовательских типов. Мое нано определение в действии sidebyside для сравнения; сопоставление по позиции определенно возможно и работает.
Вот что происходит, когда я помещаю контекст типа ниже ключевого слова context.
Вот что происходит, когда я помещаю контекст типа выше ключевого слова context.
В обоих случаях контекст один и тот же, просто простой шаблон для начала.
<context id="type" style-ref="type">
<match>(type)\s+\w+</match>
</context>
1 ответ
Вы можете захотеть создать парсер из формального описания синтаксиса Ada в приложении P к Справочному руководству по языку.
К сожалению, это не отвечает на ваш вопрос о том, как сформулировать синтаксис для GtkSourceView.