Лучший способ создать регулярное выражение, соответствующее первому элементу в sexp Ракета? - PullRequest
0 голосов
/ 30 января 2019

Я создаю плагин подсветки синтаксиса Racket (диалект lisp) для VSCode.Я уже получил регулярные выражения для большинства атомов (строки, числа, ключевые слова ...), а также для комментариев.Теперь я пытаюсь выделить полы: это списки, первый элемент которых является функцией, а остальные элементы - один из атомов, о которых я говорил ранее.

Пример:

(print "this" "and this" (string-append "and" " " "this"))

Теперь print и string-append должны быть выделены / выделены как вызов функции.Как мне это сделать?

Для простоты давайте предположим, что \w-_ являются единственными разрешенными символами в имени функции.Затем, если я сделаю что-то вроде:

(?x)  (?<=\() (?: \s*) ([\w-_]+)

с группой 1, являющейся именем функции, регулярное выражение будет прервано, если между первой скобкой и именем функции будет вставлен комментарий (или новая строка).

Это не будет работать

( ;#(commented out sexp) print "this")

Есть ли обходной путь, который позволил бы мне указать "первое совпадение без комментариев - это имя функции"?(и, возможно, также, как бы вы подошли к подсветке синтаксиса в целом?)

...