Пишу подсветку синтаксиса для языка QSP (qsp.su) и какое-то время несмотря на трудности удавалось находить решения различных моментов. Однако недавно я столкнулся с трудностями, которые проистекают от моего непонимания того, как работает рекурсивная подсветка.
У меня определены некоторые контексты: для комментариев, меток, строк и т.д. Все они прекрасно работают и всё отлично подсвечивается. В строках возможно встраивание подвыражений, например:
*pl "Текст <<subex+435>>"
В этих вложенных выражениях я решил подсвечивать код, как весь прочий, т.е. с уже имеющимися контекстами за некоторыми исключениями. Вот как я это сделал:
strings:
- match: '"'
push:
- meta_scope: string.qsp
- match: '""'
scope: string.qsp
- match: '"'
pop: true
- include: subexpression
- match: "'"
push:
- meta_scope: string.qsp
- match: "''"
scope: string.qsp
- match: "'"
pop: true
- include: subexpression
subexpression:
- match: '<<'
scope: entity.name.function entity.name avs.markup
push:
- match: '>>'
scope: entity.name.function entity.name avs.markup
pop: true
- include: subex
subex:
- include: operacion
- include: sysvar
- include: functions
- include: strings
- include: numeric
На первый взгляд всё вполне адекватно работало и подсвечивалось, пока я не начал добавлять подсветку типичных синтаксических ошибок в контекст operacion. Тут обнаружилось странное поведение. Не все правила, которые работают в основном коде, работают при попытке использовать контексты для подвыражений. Либо меняется порядок их применения, либо я совсем чего-то не понимаю.
Кто-нибудь может показать пример рекурсивной подсветки для Sublime Text 3, или дать ссылку на что-нибудь почитать по этому вопросу? Официальную документацию по ST я читал, она мне не особо помогла.
Если есть желание поковыряться прямо в файле подсветки, он лежит здесь:
https://github.com/AleksVersus/JAD_for_QSP/tree/ma...