如何解决如何在 tree-sitter 中进行不区分大小写的查询
我正在尝试在我正在实施的语言服务器中创建和使用 tree-sitter 语法,以支持查找变量的所有引用等功能。鉴于语法,我将能够编写一个查询来查找对具有特定名称(例如 myVar
)的变量的所有引用。但是,我正在编写语言服务器以使用不区分大小写的变量的语言(例如,myVar
可以引用为 MYVAR
、MyVaR
、myvar
等)。
我如何能够编写一个 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 举报,一经查实,本站将立刻删除。