Хороший пример, на который стоит обратить внимание, - реализация подсветки синтаксиса в Vim.Он использует шаблоны, основанные на регулярных выражениях.Однако шаблоны используются для распознавания иерархических структур содержания в документе, а не просто для токенизации входных данных.
Вы можете объявить области, которые начинаются и заканчиваются при сопоставлении с шаблоном регулярных выражений (плюс другой шаблон, который помогает пропускатьсредний материал).Эти регионы могут объявить, что они содержат другие регионы или простые шаблоны.Сдерживание может быть рекурсивным.Vim все это работает.Таким образом, это по существу форма синтаксического анализа без контекста.
Этот подход может работать с языками, которые имеют различные уровни встраивания, с различными лексическими свойствами.
Например, у меня есть язык, на которомПо сути, существует два набора ключевых слов (из-за происходящего встраивания языка домена).Написанные мной правила подсветки синтаксиса Vim правильно распознают контекст и по-разному раскрашивают ключевые слова.Обратите внимание, что существует несколько совпадений между этими наборами ключевых слов: одно и то же слово, другое значение в другом контексте.
Пример этого см. В http://www.kylheku.com/cgit/txr/tree/genman.txr. Если вы ищете синтаксис (do
вы обнаружите, что один экземпляр окрашен в фиолетовый цвет, а другой - в зеленый.Они разные: один на языке извлечения текста, а другой на встроенном диалекте Лиспа.Подсветка синтаксиса Vim достаточно мощна, чтобы обрабатывать смесь языков с разными наборами ключевых слов.(Да, хотя это происходит через Интернет, на самом деле это процесс Vim, выполняющий подсветку синтаксиса.)
Или рассмотрите что-то вроде оболочки, где вы можете иметь синтаксис строкового литерала типа, например "foo bar"
,но внутри вы можете использовать подстановку команд, внутри которой вы должны рекурсивно распознать и раскрасить синтаксис оболочки: "foo $(for x in *; do ...; done) bar"
.
Так что нет, вы не можете делать полезную и точную подсветку синтаксиса только с помощью токенизации регулярных выражений, но регулярные выражения с иерархическим разбором могут хорошо работать.