如何在tree-sitter查询语法中使用or逻辑?查询类成员遇阻
Tree-sitter 查询类属性与方法的OR逻辑修正
你的查询失效核心是括号嵌套和语法树层级不匹配,Tree-sitter的|运算符要求备选节点处于同一匹配层级,同时需要贴合目标语言的语法树结构。
修正后的查询语句(以C#语法树为例)
如果目标语言的类体元素被class_body_element包裹(比如C#的Tree-sitter语法定义),正确写法如下:
(class_declaration name: (type_identifier) @class-name body: (class_body (class_body_element ((public_field_definition name: (property_identifier) @property-name) | (method_definition name: (property_identifier) @method-name)))))
更通用的简化写法
如果public_field_definition和method_definition是class_body的直接子节点,可简化为:
(class_declaration name: (type_identifier) @class-name body: (class_body (public_field_definition name: (property_identifier) @property-name) | (method_definition name: (property_identifier) @method-name)))
关键说明
- Tree-sitter的OR逻辑通过
|分隔同一层级的节点模式实现,多余的嵌套括号会破坏匹配层级。 - 必须贴合目标语言的语法树结构:先通过
tree-sitter parse命令查看语法树结构,确认class_body的子节点类型,再调整查询的层级匹配。
内容的提问来源于stack exchange,提问作者qg_java_17137
相关产品推荐
相关产品推荐

