Каков наилучший способ определения грамматики для текстового редактора?
Я мазохистски пишу текстовый редактор с открытым исходным кодом для Mac и, наконец, достиг той точки, когда я хочу добавить подсветку синтаксиса. В течение последних нескольких дней я изучал различные решения и наконец решил открыть этот вопрос для более широкой аудитории.
Вот варианты, которые я вижу:
- Определите языки в основном с помощью серии сопоставления с регулярным выражением (аналогично тому, как TextMate определяет свои языки)
- Определите языки с формальной грамматикой, такой как BNF или PEG
Использование сопоставления с регулярным выражением кажется менее чем идеальным, поскольку оно не может формально представлять язык почти так же хорошо, как формальная грамматика; однако некоторым менее формальным языкам будет трудно вписаться в BNF (например, Markdown - хотя я знаю, что есть отличная реализация PEG).
Каковы компромиссы производительности для подсветки синтаксиса? Как насчет гибкости для широкого спектра языков?
Если я пойду по маршруту BNF, то Тодд Дитчендорф создал потрясающую платформу ParseKit, которая прекрасно работала бы из коробки. Кто-нибудь знает что-нибудь подобное для PEG?
3 ответа
Если вы не хотите вступить в битву за получение полной контекстно-свободной (или, что еще хуже, полностью контекстно-зависимой) грамматики, полностью правильной для каждого языка, который вы хотите обработать (или, что еще хуже, для каждого диалекта языка, который вы хотите обработать). сколько существует C++?), для подсветки синтаксиса вам, вероятно, лучше отказаться от полной корректности и признать, что иногда вы ошибаетесь. В этом случае регулярные выражения кажутся очень хорошим ответом. Они также могут быть очень быстрыми, поэтому они не будут мешать человеку, занимающемуся редактированием.
Если вы настаиваете на полной проверке / завершении синтаксиса (я так не думаю), то вам понадобится эта полная грамматика. Вы также будете очень долго готовить редакторы для реальных языков.
Иногда лучше не быть слишком серьезным. 98% решение, которое вы можете получить, лучше, чем 100% решение, которое никогда не материализуется.
Это может быть не совсем то, что вам нужно, так как вы сами пишете редактор, но есть замечательная среда под названием Xtext, которая на самом деле генерирует полный редактор с окраской синтаксиса, настраиваемым контурным представлением и автозаполнением и т. Д., Основанный на грамматике для ваш язык: http://eclipse.org/Xtext
В дополнение к проблемам с получением грамматики для работы с языком, существует дополнительная сложность попытки заставить его работать для кода, который находится в процессе редактирования.