Я создаю плагин подсветки синтаксиса Racket (диалект lisp) для VSCode.Я уже получил регулярные выражения для большинства атомов (строки, числа, ключевые слова ...), а также для комментариев.Теперь я пытаюсь выделить полы: это списки, первый элемент которых является функцией, а остальные элементы - один из атомов, о которых я говорил ранее.
Пример:
(print "this" "and this" (string-append "and" " " "this"))
Теперь print
и string-append
должны быть выделены / выделены как вызов функции.Как мне это сделать?
Для простоты давайте предположим, что \w-_
являются единственными разрешенными символами в имени функции.Затем, если я сделаю что-то вроде:
(?x) (?<=\() (?: \s*) ([\w-_]+)
с группой 1, являющейся именем функции, регулярное выражение будет прервано, если между первой скобкой и именем функции будет вставлен комментарий (или новая строка).
Это не будет работать
( ;#(commented out sexp) print "this")
Есть ли обходной путь, который позволил бы мне указать "первое совпадение без комментариев - это имя функции"?(и, возможно, также, как бы вы подошли к подсветке синтаксиса в целом?)