Я пишу собственный синтаксис грамматики с TextMate для использования в VSCode в качестве расширения, которое будет выделять исходный код пользовательского языка с использованием регулярных выражений Oniguruma .
Iу меня все работает, кроме блочных комментариев (многострочных комментариев).
Есть несколько примеров XML-файлов TextMate, в которых, похоже, реализованы блочные комментарии, но они очень большие, например
Я не могу использовать этипримеры для извлечения функциональности блочного комментария, так как есть много других связанных, но не относящихся ко мне частей.
Это мой package.json
:
{
"name": "mylang",
"version": "0.0.1",
"engines": {
"vscode": "*"
},
"publisher": "me",
"contributes": {
"languages": [
{
"id": "mylang",
"aliases": [
"mylang"
],
"extensions": [
".mylang"
]
}
],
"grammars": [
{
"language": "mylang",
"scopeName": "source.mylang",
"path": "./syntaxes/mylang.tmLanguage"
}
]
}
}
Это мой файл mylang.tmlanguage
(для краткости):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>scopeName</key>
<string>source.mylang</string>
<key>fileTypes</key>
<array>
<string>mylang</string>
</array>
<key>name</key>
<string>mylang file</string>
<key>patterns</key>
<array>
<!-- Numbers -->
<dict>
<key>match</key>
<string>\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\b</string>
<key>name</key>
<string>constant.numeric</string>
</dict>
<!-- Types -->
<dict>
<key>match</key>
<string>\b(date|int|string|float|varchar)\b</string>
<key>name</key>
<string>entity.name.type</string>
</dict>
<!-- single line comment -->
<dict>
<key>match</key>
<string>\/\*(\w|\s|\W|\n|\r\n)*\/</string>
<key>name</key>
<string>comment</string>
</dict>
<!-- Multiline comments -->
</array>
<key>uuid</key>
<string>FF0550E0-3A29-11E3-AA6E-0800200C9A77</string>
</dict>
</plist>
Я правильно выделю все элементы, поэтому мое расширение работает.
Если я правильно понимаю, я не могу просто предоставить регулярное выражение для несколькихкомментарий строки, как я сделал с комментарием в одну строку.Мне нужно будет использовать структуру вложенных тегов с тегами begin
и end
, но я не могу понять, какую структуру использовать.