Как в древовидной грамматике сопоставить строки, кроме зарезервированных ключевых слов в идентификаторах?
Это может быть связано с тем, что я не понимаю функцию извлечения ключевых слов , которая, как видно из документации, позволяет избежать проблемы, когда между ключевым словом и следующим выражением нет пробела. Но скажем, у меня есть довольно стандартное регулярное выражение идентификатора для имен переменных, имен функций и т. Д .:
/\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.