Подсветка синтаксиса для многострочных строковых литералов

У меня есть собственный язык, для которого я хочу обеспечить подсветку синтаксиса в коде Visual Studio.

В этом языке строковые литералы начинаются и заканчиваются двойной или одинарной кавычкой. Строковый литерал, начинающийся с двойной кавычки, может содержать одинарные кавычки и наоборот. Никакого другого экранирования кавычек не происходит. Но независимо от типа начальной кавычки литералы могут занимать несколько строк.

В моем файле tmLanguage.json я попробовал эти регулярные выражения:

{
    "match": "'[^']*'",
    "name": "string.quoted.single.rss"
},
{
    "match": "\"[^\"]*\"",
    "name": "string.quoted.double.rss"
}

К сожалению, это работает только для однострочных литералов. затем я попытался

{
    "match": "(?s)'[^']*'",
    "name": "string.quoted.single.rss"
},
{
    "match": "(?s)\"[^\"]*\"",
    "name": "string.quoted.double.rss"
}

Но с модификатором (?s) подсветка синтаксиса вообще не работает.

Есть ли способ сопоставить многострочные строки?


person Bill Tür    schedule 27.07.2018    source источник
comment
Встроенные модификаторы не поддерживаются в VSC. Кроме того, s влияет только на ., а у вас его нет.   -  person revo    schedule 27.07.2018


Ответы (1)


Попробуйте использовать шаблон begin/end вместо простого match. В языке Haxe также есть многострочные строковые литералы, и он соответствует строкам следующим образом:

strings:
  patterns:
  - begin: '"'
    beginCaptures:
      '0': {name: punctuation.definition.string.begin.hx}
    end: '"'
    endCaptures:
      '0': {name: punctuation.definition.string.end.hx}
    name: string.quoted.double.hx
    patterns:
    - include: '#string-escape-sequences'

Грамматика использует YAML вместо JSON, чтобы избежать необходимости избегать регулярных выражений, но перевод должен быть довольно простым. Источник фрагмента находится здесь.

person Gama11    schedule 27.07.2018