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

如何在 tree-sitter 中进行不区分大小写的查询

如何解决如何在 tree-sitter 中进行不区分大小写的查询

我正在尝试在我正在实施的语言服务器中创建和使用 tree-sitter 语法,以支持查找变量的所有引用等功能。鉴于语法,我将能够编写一个查询来查找对具有特定名称(例如 myVar)的变量的所有引用。但是,我正在编写语言服务器以使用不区分大小写的变量的语言(例如,myVar 可以引用为 MYVARMyVaRmyvar 等)。

我如何能够编写一个 tree-sitter 查询来匹配令牌必须不区分大小写匹配特定字符串的模式?

我可以编写不按变量名称过滤的查询并实现我自己的结果过滤,但我想知道是否有办法在查询本身内处理此问题,而不是实现自定义过滤代码

示例

这是一个简化的示例案例来说明我的意思。

鉴于以下语法,我想查询所有为变量 set_statements 设置新值的 myVar

module.exports = grammar({
  name: 'mylang',rules: {
    source_file: $ => repeat($._statement),_statement: $ => choice(
      $.set_statement,),set_statement: $ => seq(
      'set',field("variable",$.identifier),field("value",$._expression),_expression: $ => choice(
      $.integer_literal
    ),identifier: $ => /[a-zA-Z0-9]+/,integer_literal: $ => /[0-9]+/,}
});

通常我可以使用如下查询来执行此操作。

(
    (set_statement
        variable: (identifier) @variable)
    (#eq? @variable "myVar")
)

但是,正如我们在以下运行查询的示例中看到的那样,这仅选取与查询使用相同大小写的对 myVar 的引用。

$ cat set_testing.txt 
set myVar 0
set MYVAR 23
set myVar2 72
set MyVaR 14
$ tree-sitter query find_variable.query set_testing.txt
set_testing.txt
  pattern: 0
    capture: variable,start: (0,4),text: "myVar"

我想创建一个查询来代替:

tree-sitter query find_variable.query set_testing.txt
set_testing.txt
  pattern: 0
    capture: variable,text: "myVar"
  pattern: 0
    capture: variable,start: (1,text: "MYVAR"
  pattern: 0
    capture: variable,start: (3,text: "MyVaR"

解决方法

更改您的查询以匹配与标识符的所有可能的大/小组合匹配的正则表达式,在本例中为 myvar

如果您将 find_variable.query 更改为对所有大小写组合使用正则表达式匹配:

(
    (set_statement
        variable: (identifier) @variable)
    (#match? @variable "^[mM][yY][vV][aA][rR]$")
)

现在运行 tree-sitter query find_variable.query set_testing.txt 返回:

set_testing.txt
  pattern: 0
    capture: variable,start: (0,4),text: "myVar"
  pattern: 0
    capture: variable,start: (1,text: "MYVAR"
  pattern: 0
    capture: variable,start: (3,text: "MyVaR"

Tree-sitter 不支持不区分大小写的正则表达式搜索Issue #261,所以正则表达式要长一些。

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