Как в древовидной грамматике сопоставить строки, кроме зарезервированных ключевых слов в идентификаторах?

Это может быть связано с тем, что я не понимаю функцию извлечения ключевых слов , которая, как видно из документации, позволяет избежать проблемы, когда между ключевым словом и следующим выражением нет пробела. Но скажем, у меня есть довольно стандартное регулярное выражение идентификатора для имен переменных, имен функций и т. Д .:

/\w*[A-Za-z]\w*/

Как мне предотвратить совпадение этого зарезервированного ключевого слова, например IF или же ELSEили что-то вроде того? Таким образом, это выражение приведет к ошибке:

int IF = 5;

в то время как это не будет:

int x = 5;

1 ответ

Решение

Поскольку treeitter не поддерживает отрицательный просмотр назад в своих регулярных выражениях, это должно обрабатываться на семантическом уровне. Одна вещь, которую вы можете сделать, чтобы упростить эту проверку, - это перечислить все ваши зарезервированные слова, а затем добавить их в качестве альтернативы регулярному выражению идентификатора:

      keyword: $ => choice('IF', 'THEN', 'ELSE'),

name: $ => /\w*[A-Za-z]\w*/,

identifier: $ => choice($.keyword, $.name)

Согласно правилу 4 treesitter по правилам матча , в выражении int IF = 5; то IF токен будет соответствовать, а не (identifier name)поскольку это более конкретное совпадение. Это означает, что вы можете легко запросить незаконные (identifier keyword) узлы и сообщают об ошибке пользователю на вашем языковом сервере или откуда бы вы ни использовали грамматику treeitter.

Другие вопросы по тегам