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

How to do case-insensitive query in tree-sitter

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

我如何能够编写树保姆查询来匹配令牌必须 不区分大小写 匹配特定字符串的模式?

我可以编写不按变量名过滤的查询并实现我自己的结果过滤,但我想知道是否有一种方法可以在查询本身中处理这个问题而不是实现自定义过滤代码。

例子

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

鉴于以下语法,我想查询为变量 myVar.

设置新值的所有 set_statements
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, start: (0, 4), text: "myVar"
  pattern: 0
    capture: variable, start: (1, 4), text: "MYVAR"
  pattern: 0
    capture: variable, start: (3, 4), text: "MyVaR"

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

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

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

现在运行tree-sitter query find_variable.query set_testing.txtreturns:

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

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