AleksVersus
@AleksVersus
графоман

Как правильно реализовать рекурсивную подсветку синтаксиса в Sublime Text3?

Пишу подсветку синтаксиса для языка 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...
  • Вопрос задан
  • 83 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы