微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 tree-sitter 语法中,除了标识符中的保留关键字之外,我如何匹配字符串?

如何解决在 tree-sitter 语法中,除了标识符中的保留关键字之外,我如何匹配字符串?

这可能与我不了解 Keyword Extraction 功能有关,从文档看来,这似乎是为了避免关键字和以下表达式之间不存在空格的问题。但是假设我有一个相当标准的标识符正则表达式,用于变量名、函数名等:

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

如何防止它与 IFELSE 之类的保留关键字匹配?所以这个表达式会产生一个错误

int IF = 5;

虽然这不会:

int x = 5;

解决方法

a pull request pending since 2019 to add an EXCLUDE feature,但在撰写本文时目前尚未实现(2021 年 4 月 - 如果过了一段时间并且您正在阅读本文,请重新检查!)。并且由于 treeitter 在其正则表达式中也不支持否定后视,因此必须在语义级别进行处理。为了使此检查更容易,您可以做的一件事是枚举所有保留字,然后将它们添加为标识符正则表达式的替代:

keyword: $ => choice('IF','THEN','ELSE'),name: $ => /\w*[A-Za-z]\w*/,identifier: $ => choice($.keyword,$.name)

根据 treeitter 的 match rules 规则 4,在表达式 int IF = 5; 中,IF 标记将匹配 (identifier keyword) 而不是 (identifier name),因为它是一个更具体的匹配。这意味着您可以对非法的 (identifier keyword) 节点进行简单的查询,并在您的语言服务器中或从您使用 treeitter 语法的任何地方向用户显示错误。

请注意,这种方法确实存在在 (identifier keyword) 匹配项与使用这些关键字的实际语言结构之间产生许多冲突的风险。如果是这样,您将不得不在语义级别处理整个事情:扫描所有标识符以检查它们是否是保留字。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。