Tree-sitter解析代码
Tree-sitter 语法树到底是什么、长什么样、包含什么东西。一、通俗解释Tree-sitter 会把一行行代码解析成一棵结构化的「语法树」像家族树一样有层级、有分类让机器能看懂代码的结构哪个是方法、哪个是方法名、哪个是代码体而不是把代码当成纯文字。二、直观看语法树长什么样拿最简单的Java方法举例原始Java代码public void test() { System.out.println(Hi); }Tree-sitter 解析后的语法树结构┌── method_declaration (方法定义代码里判断的核心节点) │ ├── modifiers (修饰符public) │ ├── void (返回值类型) │ ├── identifier (方法名test ← 代码提取的内容) │ ├── parameters (参数列表) │ │ └── () │ └── body (方法体) │ ├── { │ ├── expression_statement (执行语句) │ └── }代码遍历「语法树」def extract_java_methods_tree_sitter(code: str, file_path: str) - List[Document]: 使用Tree-sitter解析Java文件提取所有方法定义 :param code: Java代码文本内容 :param file_path: 代码文件路径用于元数据 :return: 包含每个方法的Document列表元数据含方法名、语言等 tree java_parser.parse(bytes(code, utf8)) root tree.root_node docs [] # 递归遍历语法树提取方法节点 def visit(node): if node.type method_declaration: # 提取方法名 name_node next( (child for child in node.children if child.type identifier), None ) method_name name_node.text.decode() if name_node else unknown # 提取方法完整代码 method_text code[node.start_byte : node.end_byte] docs.append( Document( page_contentmethod_text, metadata{ source: file_path, type: code, language: java, method_name: method_name, }, ) ) else: for child in node.children: visit(child) visit(root) return docs整棵树的根是整个代码树枝是类、方法、变量树叶是方法名、关键字、符号三、语法树包含哪些核心东西对应代码里的用法Tree-sitter 的每一个节点Node都自带 5 个核心属性visit函数全靠这些属性工作属性名作用代码里的用法node.type节点类型标记这是什么语法if node.type method_declaration判断是不是方法node.children子节点列表树枝/叶子遍历子节点找方法名child for child in node.childrennode.start_byte代码起始字节位置截取完整方法code[start_byte:end_byte]node.end_byte代码结束字节位置同上node.text节点对应的原始代码文本提取方法名name_node.text.decode()四、完整的语法树节点类型Java常用Tree-sitter 给Java代码定义了标准化的节点类型解析代码全靠这些method_declaration→ 方法定义核心用的class_declaration→ 类定义identifier→ 标识符方法名、变量名modifiers→ 修饰符public/private/staticblock→ 代码块大括号里的内容import_declaration→ 导入语句field_declaration→ 成员变量五、核心代码基于语法树的结构if node.type method_declaration: # 找到「方法」节点 name_node next(child for child in node.children if child.type identifier) # 在方法的子节点里找到「方法名」节点 method_text code[node.start_byte : node.end_byte] # 用字节位置截取整个方法代码本质就是在语法树上精准找到「方法」树枝 → 摘下「方法名」叶子 → 剪下整根树枝完整代码六、总结Tree-sitter 语法树 代码的结构化家谱每个节点都有类型、位置、子节点机器靠这棵树「读懂代码」而不是瞎拆文字解析函数就是在这棵树上「找到方法子节点」这就是Tree-sitter 解析代码比普通文本分割强10倍的原因。七、不同语言的区别对比项JavaPythonJavaScriptC函数节点method_declarationfunction_definitionfunction_declarationfunction_definition代码块block无缩进blockblock函数名位置第 3 个子节点第 2 个子节点第 2 个子节点第 2 个子节点顶层根节点compilation_unitmoduleprogramtranslation_unit独有节点annotation、enumdecorator、async_defarrow_functiontemplate、class
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2479334.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!