Проблема выделения синтаксиса VSCode: положительный вид сзади не работает с пробелами - PullRequest
0 голосов
/ 12 мая 2019

Я работаю над расширением подсветки синтаксиса собственного языка для VSCode. Я сталкиваюсь с проблемой, когда lookbehinds ведут себя странно, когда используются рядом с пробелами.

Пример кода, который я хочу выделить:

variableName :=thisValueShouldHighlight;
variableName := thisValueShouldHighlight;
variableName := thisValueShouldAlsoHighlight,

Пример кода, который я пытаюсь использовать (в tpl.tmLanguage.json):

"end_variable_assignment": {
    "comment": "Covers ending assignment of a value to a variable. IN PROGRESS",
    "match": "(?<=:=)\\s*(\\w+)(;|,)$",
    "name": "punctuation.accessor.tpl",
    "captures": {
        "1": {
            "name": "entity.name.type.tpl"
        },
        "2": {
            "name": "punctuation.accessor.tpl"
        }
    }
}

Этот шаблон включен в (в другом шаблоне, который присутствует во всем файле):

{
    "include": "#end_variable_assignment"
}

Точка соприкосновения является частью \\s* регулярного выражения. Вы должны быть в состоянии сделать var:=value или var := value или любое количество пробелов между := и value, неважно, сколько. Однако , я получаю это , когда я пытаюсь использовать его:

variableName :=thisHighlightsProperly;
variableName := thisFails;

Я также пробовал только \\s и \\s+, и ни одна из них не работает. Я попробовал глупые примеры, чтобы убедиться, что моя логика работает с использованием некоторого заполнителя, такого как (?<=:=)#(\\w+)..., а затем протестировал его с var:=#value, который работает ... но он никогда не работает с пробелами.

Я не понимаю, почему это проблема, потому что я использовал \\s* в другом месте без каких-либо проблем (просто другие обстоятельства). Я не верю, что это проблема со свойством, потому что она работает со всеми , кроме пробелов.

Дополнительная информация: Я проверил это на RegexCoach и Regex101.com, и оно работает там.

Для целей тестирования я также включил пример тестирования кода, который следует выделить здесь: https://drive.google.com/open?id=1yoDXVxW3LFYjejW1wps8ENWUQ4iCal9w

Это самый минимальный пример кода, который я могу предоставить:

tpl 1.15 module Pattern_Module_Name;
pattern Pattern_name 1.0
    triggers
        on si := SoftwareInstace created, confirmed where name matches "(?i)SomeRegex";
    end triggers;
    body
        // RE: STACKOVERFLOW PROBLEM
        // As you can see, these aren't highlighting properly

        var_name :=thisShouldHighlight;
        var_name := thisShouldHighlightButDoesnt;
        var_name := thisShouldHighlightButDoesnt,
    end body;
end pattern;

Весь мой пользовательский код языка можно найти на моем GitHub: https://github.com/cdpautsch/vscode-tpl

1 Ответ

0 голосов
/ 13 мая 2019

Так что благодаря @ Gama11 я смог выяснить, в чем проблема.Другой шаблон вмешивался в первый, но не таким образом, который был сразу очевиден для меня.

Рассматриваемый шаблон должен быть конечной частью присвоения переменной (фактически присваивания значения), поэтомуне применяется при использовании функций или строк (как и предполагалось).Это должно применяться только для присвоения чисел и значения других переменных рассматриваемой переменной.Начальная часть назначения переменной (взятие имени переменной и присвоение ей чего-либо) выполняется отдельным блоком.

При первом взгляде я не думал, что это проблема, потому что уже есть другой шаблонвключены (var_assign), что соответствует :=.Проблема с шаблоном begin_variable_assignment состоит в том, что он соответствует \\:\\=\\s*.Трейлинг \\s* является проблемой.Устранение, которое вызывает проблему снова.

Короче говоря, следующие совпадения в отдельных шаблонах могут мирно сосуществовать:

":="

"^\\s*(\\w+)\\s*(\\:\\=)"

"(?<=:=)\\s*(\\w+)(;|,)$"

Но это будет НЕ совместимым:

"^\\s*(\\w+)\\s*(\\:\\=)\\s*"

Все это чисто путем наблюдения / тестирования.Очевидно, что проблема связана с перекрытиями, возможно, с соответствиями переменной длины.

...