如何在Tree-sitter中获取类/属性/方法的AST树形结构数据
Tree-sitter 获取指定层级的AST树形结构问题
你目前用来匹配类名称的代码如下:
const Parser = require("tree-sitter") const JavaScript = require("tree-sitter-javascript") const { Query } = Parser const parser = new Parser() parser.setLanguage(JavaScript) const query = new Query( JavaScript, ` (class_declaration name: (identifier) @class-name) ` ); const tree = parser.parse(` class Person {} const TestPerson = class {} class Person2 {} const TestPerson2 = class {} `); const matches = query.matches(tree.rootNode); matches.forEach(item => { console.log(item.captures[0]) })
你需要解决两个问题:
- 如何匹配完整的AST树形结构数据?
- 如何控制匹配得到的树形数据的层级深度(如截图中的3层深度)?
问题1:获取完整AST树形结构数据
Tree-sitter 解析后得到的 tree.rootNode 就是完整的AST根节点,不需要通过Query匹配,直接遍历节点结构即可。可以写一个递归函数,提取每个节点的类型、文本、子节点等核心信息:
// 递归遍历节点,生成完整AST结构对象 function traverseNode(node, depth = 0) { const nodeData = { type: node.type, text: node.text, depth: depth, children: [] }; // 遍历所有子节点并递归处理 for (let i = 0; i < node.childCount; i++) { const child = node.child(i); nodeData.children.push(traverseNode(child, depth + 1)); } return nodeData; } // 生成并打印完整AST const fullAST = traverseNode(tree.rootNode); console.log(JSON.stringify(fullAST, null, 2));
问题2:控制AST树形数据的层级深度
在递归遍历函数中加入最大深度参数,当当前节点深度达到阈值时,停止递归遍历子节点,只保留当前节点的基础信息:
// 带深度限制的节点遍历函数 function traverseNodeWithDepth(node, maxDepth, currentDepth = 0) { const nodeData = { type: node.type, text: node.text, depth: currentDepth, children: [] }; // 仅当当前深度小于最大深度时,才继续遍历子节点 if (currentDepth < maxDepth) { for (let i = 0; i < node.childCount; i++) { const child = node.child(i); nodeData.children.push(traverseNodeWithDepth(child, maxDepth, currentDepth + 1)); } } return nodeData; } // 获取3层深度的AST(根节点为第0层,子节点第1层,以此类推) const depthLimitedAST = traverseNodeWithDepth(tree.rootNode, 3); console.log(JSON.stringify(depthLimitedAST, null, 2));
如果截图中的3层是将根节点算第1层,只需调整参数为 maxDepth=2,即可得到根节点+两层子节点的结构。
内容的提问来源于stack exchange,提问作者qg_java_17137
相关产品推荐
相关产品推荐

