При написании грамматики для Github для программ подсветки синтаксиса, написанных на языке Racket, я наткнулся на проблему.Соответствующие вложенные конструкции в текстовых грамматиках TextMate/Sublime Text/Atom
В Racket #|
начинается многострочный комментарий, и |#
заканчивает его.
Проблема заключается в том, что многострочные комментарии могут быть вложенными:
#| a comment #| still a comment |# even
more comment |#
Вот моя нерабочим попытка:
repository:
multilinecomment:
begin: \#\|
end: \|\#
name: comment
contentName: comment
patterns:
- include: "#multilinecomment"
name: comment
- match: ([^\|]|\|(?=[^#]))*
name: comment
Намерение моделей матчей:
"#multilinecomment"
Многострочный комментарий может содержать еще один многострочный комментарий.([^\|]|\|(?=[^#]))*
Смысл подвыражений:[^\|] any characters not an `|` \|(?=[^#]) an `|` followed by a non-`#`
Все выражение, таким образом, соответствует строке не с указанным | #
Обновление:
Получил ответ от Allan Odgaard на список рассылки TextMate:
http://textmate.1073791.n5.nabble.com/TextMate-grammars-and-nested-multiline-comments-td28743.html
Спасибо за расследование. Я бы с удовольствием заменил грамматику TextMate на правильный синтаксический анализатор - увы, потому что я смотрю на грамматику TextMate, в первую очередь, потому что Github отказался от поддержки Pyigs (включая правильный парсер для Racket). То есть я застрял, используя грамматику TextMate. Теперь не конец света, что многострочные комментарии не работают, однако если невозможно сопоставить вложенные # | | # правильно, тогда будет очень сложно получить #; комментарии правильно. A #; раскомментирует следующее s-выражение - что-то очень распространенное в Racket/Scheme/Lisp. – soegaard
Я буду держать вопрос открытым на пару дней, и если никто не придумает решение, я приму ваш ответ. – soegaard