利用tree-sitter提取代码文件中的函数和注释

利用tree-sitter提取代码文件中的函数和注释

    • 1. 需求
    • 2. 工具
    • 3. 实现

1. 需求

提取.c或.cpp文件中的带有注释的函数,作为训练数据喂给大语言模型。要求是能够批量处理,提取函数前带有注释的函数和注释,并将函数中的注释同样提取出来作为辅助训练数据,结果保存在JSON文件中。

2. 工具

tree-sitter
如何配置使用环境见https://blog.csdn.net/sluck_0430/article/details/134194493
pycharm
如何将conda的虚拟python环境添加到pycharm中见https://blog.csdn.net/weixin_62783109/article/details/129962054?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171402346916800178588080%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=171402346916800178588080&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-4-129962054-null-null.142%5Ev100%5Econtrol&utm_term=conda%E5%90%8E%E7%9A%84%E7%8E%AF%E5%A2%83%E5%A6%82%E4%BD%95%E6%B7%BB%E5%8A%A0%E5%88%B0pycharm%E4%B8%AD&spm=1018.2226.3001.4187

3. 实现

from tree_sitter import Language, Parser
import json
import os
import re# 加载C语言模块
Language.build_library('build/my-languages.so',['vendor/tree-sitter-c']
)C_LANGUAGE = Language('build/my-languages.so', 'c')
parser = Parser()
parser.set_language(C_LANGUAGE)# 提取代码信息
def extract_code_information(node, code):functions = []  # 存放最终的代码提取结果comment = ''  # 存放函数前的注释in_comment = ''  # 存放函数中的注释function = ''  # 存放函数for child in node.children:# 只保存函数前存在注释的函数及其注释if child.type == 'function_definition' and child.prev_sibling and child.prev_sibling.type == 'comment':# 首先处理函数function = extract_node_information(child, code)# 然后处理函数中的注释in_comment = traverse_children(child, code)# 最后处理函数前的注释temp_node = child.prev_siblingwhile temp_node.type == 'comment':comment += extract_node_information(temp_node, code)if temp_node.prev_sibling:temp_node = temp_node.prev_siblingelse:break# 将函数和其注释保存到最终的结果中functions.append({'comment_before_function': comment,'comment_in_function': in_comment,'function': function})comment = ''in_comment = ''function = ''return functions# 深度优先遍历节点的全部孩子节点
def traverse_children(node, code):if node is None:return ''comment = ''if node.type == 'comment':comment += extract_node_information(node, code)for child in node.children:comment += traverse_children(child, code)return comment# 提取节点信息
def extract_node_information(node, code):try:start_row, start_col = node.start_pointend_row, end_col = node.end_point# 将源代码按行进行拆分code_lines = code.split('\n')# 如果起始行和结束行在同一行if start_row == end_row:extracted_code = code_lines[start_row][start_col:end_col]else:# 提取起始行到结束行中的内容extracted_code = code_lines[start_row][start_col:]for i in range(start_row + 1, end_row):extracted_code += code_lines[i] + '\n'extracted_code += code_lines[end_row][:end_col]return extracted_codeexcept AttributeError as e:return ''# 查找文件夹中的.c和.cpp文件
def get_c_files(folder):c_files = []for root, dirs, files in os.walk(folder):for file in files:if re.search(r'\.c$|\.cpp$', file):c_files.append(os.path.join(root, file))return c_files# 处理文件夹中的.c和.cpp文件
def pipeline(folder_path):c_files = get_c_files(folder_path)functions = []for c_file in c_files:print(c_file)temp = []try:try:with open(c_file, 'r', encoding='gbk') as file:code = file.read()tree = parser.parse(bytes(code, 'gbk'))root_node = tree.root_nodetemp = extract_code_information(root_node, code)functions.append(temp)except UnicodeDecodeError as e:with open(c_file, 'r', encoding='utf8') as file:code = file.read()tree = parser.parse(bytes(code, 'utf8'))root_node = tree.root_nodetemp = extract_code_information(root_node, code)functions.append(temp)except UnicodeDecodeError as e:print("UnicodeDecodeError!")# 将结果保存在functions.json中with open('functions.json', 'w', encoding='utf8') as json_file:json.dump(functions, json_file, indent=4, ensure_ascii=False)if __name__ == '__main__':folder_path = '文件夹的绝对路径'pipeline(folder_path)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/3222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

把 KubeBlocks 跑在 Kata 上,真的可行吗?

背景 容器的安全性一直是广受关注的话题。这个领域也产生了很多不错的开源项目。Kata就是其中之一。 Kata Containers(简称 Kata)是一种开源项目,它提供了一种安全而高性能的容器运行时环境。Kata Containers 利用虚拟化技术(通常…

【算法刷题 | 贪心算法03】4.25(最大子数组和、买卖股票的最佳时机|| )

文章目录 4.最大子数组和4.1题目4.2解法一:暴力4.2.1暴力思路4.2.2代码实现 4.3解法二:贪心4.3.1贪心思路4.3.2代码实现 5.买卖股票的最佳时机||5.1题目5.2解法:贪心5.2.1贪心思路5.2.2代码实现 4.最大子数组和 4.1题目 给你一个整数数组 n…

【面经八股】搜广推方向:面试记录(十三)

【面经&八股】搜广推方向:面试记录(十三) 文章目录 【面经&八股】搜广推方向:面试记录(十三)1. 自我介绍2. 实习经历问答3. 八股之类的问题4. 编程题5. 反问6. 可以1. 自我介绍 。。。。。。 2. 实习经历问答 挑最熟的一个跟他讲就好了。 一定要熟~3. 八股之类…

Mac下XDebug安装

文章目录 1、下载对应的版本2、编译XDebug3、配置XDebug4、配置PhpStormDebug一下 前置工作 Mac下安装HomebrewMac下brew安装php7.4 1、下载对应的版本 首先按照支持的版本和兼容性来下载对应的版本,此表列出了仍支持哪些 Xdebug 版本,以及哪些版本可用…

GPT的全面历史和演变:从GPT-1到GPT-4

人工智能新篇章:GPT-4与人类互动的未来! 本文探讨了生成式预训练 Transformer (GPT) 的显着演变,提供了从开创性的 GPT-1 到复杂的 GPT-4 的旅程。 每次迭代都标志着重大的技术飞跃,深刻影响人工智能领域以及我们与技术的互动。 我…

linux+ndk把jni制作成so库供apk使用(基础)

环境配置之类的我之前的博客有写,这篇文章我们就直接开始 1.在有ndk配置的服务器创建文件夹,文件夹再创建jni文件夹,jni文件夹里面放置Application.mk,Android.mk与test.c,因为我的ndk运行配置默认是项目下面的jni目录,所以我需要多一个jni目录 2.这里的Application.mk写的是架…

OpenHarmony语言基础类库【@ohos.util (util工具函数)】

ohos.util (util工具函数) 该模块主要提供常用的工具函数,实现字符串编解码([TextEncoder]),[TextDecoder])、有理数运算([RationalNumber8])、缓冲区管理([LRUCache9])、范围判断&…

5款好用的监控员工电脑软件推荐 (如何监控员工上班工作情况)

在现代的商业环境中,管理和监控员工的工作内容是至关重要的。 为了确保员工的工作效率和质量,公司需要使用一些工具来监控他们的工作进程。 以下是五款实用的监控员工工作内容的软件。 域智盾软件 域智盾是一款专为企业打造的智能管理系统。 它借助人…

Vivado-IP-DDS and Testbench Learning

DDS内部结构 实现流程 首先新建一个工程,创建bd文件,添加DDS Compiler核,此处不多赘述 Block Design 在观测输出的信号时,需要将最高位符号位的信号取反,这样才能输出正弦波,否则输出的波形如下图所示 将t…

暴雨亮相CCBN2024 助力广电行业数智化转型

4月23日,第三十届中国国际广播电视信息网络展览会(简称CCBN2024)在北京开展,本次展览会由国家广播电视总局指导、广播电视科学研究院主办,作为国内广电视听领域首个综合性、专业化、引领性、国际化科技产业盛会&#x…

第三节课,后端登录【1】

一、总任务 二、登录接口 get 请求,有缺陷,长度有限制 三、登录逻辑 四、代码书写位置 4.1 编写业务逻辑的位置 五、写代码 5.1 代码1 5.1.1 细节 按 CtrlAltShiftL ,快速格式化 5.1. 2 自动生成接口参数 先/** 再回车 效果图 5.2 按 alt enter …

ffmpeg与sdl的个人笔记

说明 这里的ffmpeg基础知识和sdl基础知识仅提及与示例代码相关的知识点, 进阶可学习雷神的博客。 https://blog.csdn.net/leixiaohua1020 当然,如代码写的有问题或有更好的见解,欢迎指正! 音视频基础知识 在学习音视频理论知识时&#xff…

德思特车载天线方案:打造智能互联的公共安全交通网络

作者介绍 一、方案介绍 随着自动驾驶与智慧汽车概念的逐步推进,人们对汽车的交互性、智能性、互联性有了更高的要求。今天,大多数汽车制造商和供应商普遍将GNSS定位功能与其他信号如广播、电视、蓝牙、Wifi一起集成到汽车中,包括博世、大陆、…

LabVIEW学习记录2 - MySQL数据库连接与操作

LabVIEW学习记录2 - MySQL数据库连接与操作 一、前期准备1.1 windows下安装MySQL的ODBC驱动 二、LabVIEW创建MySQL 的UDL文件三、LabVIEW使用UDL文件进行MySQL数据库操作3.1 建立与数据库的连接:DB Tools Open Connection.vi3.2 断开与数据库的连接:DB T…

【C语言】贪吃蛇详解(附源码)

一、贪吃蛇实现效果 【C语言】贪吃蛇(控制台) 二、源码 🎈🎈🎈Snake 残风也想永存/C语言项目 - 码云 - 开源中国 (gitee.com)🎈🎈🎈 三、如何使用C语言去实现一个贪吃蛇&#xff1f…

【04-提升模型性能:集成学习与超参数优化】

文章目录 前言集成学习BaggingBoosting超参数优化随机搜索贝叶斯优化总结前言 在前几篇博文中,我们已经介绍了一些机器学习的基础知识、Scikit-learn的核心工具与技巧,以及如何评估模型性能。本篇博文将重点讲解两个可以显著提升机器学习模型性能的高级策略:集成学习和超参数…

【ARMv9 DSU-120 系列 8 -- L3 Cache 详细介绍】

请阅读【Arm DynamIQ™ Shared Unit-120 专栏 】 文章目录 L3 Cache In DSU-120L3 cache allocation policyCache WaysL3缓存分区和带宽分区L3 cache partitioningBandwidth partitioningCache stashingL3 Cache In DSU-120

【机器学习】集成学习---投票法(Voting)

一、引言 集成学习(Ensemble Learning)是机器学习领域中的一种重要策略,它通过结合多个模型的预测结果来提高整体性能。在单个模型容易过拟合或欠拟合的情况下,集成学习能够通过综合多个模型的优点来减少这种风险,从而…

OceanBase v4.2特性解析:Oracle 的XML Type兼容

概述:在OceanBase 的Oracle模式支持XMLType特性后,OceanBase拥有了XML的数据存储、计算、分析能力。用户无需将XML数据作为文本存储,在业务代码中解析并操作XML文本,而是可以直接基于XML内置的能力,对XML数据进行存储、…

Web前端一套全部清晰 ① 学习路线

一切都会好的,我一直相信 —— 24.4.25 基础入门:HTML5CSS3移动web技术进阶: JavaScript全套(js基础Web APIsjs进阶) ——> 《框架前置课》AJAX-Node.js-Webpack-GitVUE开发: 框架前置课Node.js&es6 ——> Vue2Vue3全套 ——> iHRM人力资源后台管理项 …