当前位置: 首页 > news >正文

Rust调用tree-sitter解析C语言

文章目录

  • 一、Rust 调用 tree-sitter 解析 C 语言代码
    • 1. 设置 Rust 项目
    • 2. 添加 tree-sitter 依赖
    • 3. 编写 Rust 代码
    • 4. 运行程序
    • 5. 编译出错
  • 二、解决步骤
    • 1. 添加 tree-sitter 构建依赖
    • 2. 添加 tree-sitter-c 源代码
    • 3. 修改 build.rs 以编译 tree-sitter-c 库
    • 4. 修改 Cargo.toml
    • 5. 重新构建项目

一、Rust 调用 tree-sitter 解析 C 语言代码

要使用 Rust 调用 tree-sitter 解析 C 语言代码,你可以遵循以下详细步骤:

1. 设置 Rust 项目

首先,你需要初始化一个新的 Rust 项目。如果你还没有安装 Rust,可以按照 Rust 官方指南 进行安装。

然后,使用 cargo 创建一个新的项目:

cargo new tree_sitter_c_example
cd tree_sitter_c_example

2. 添加 tree-sitter 依赖

在 Cargo.toml 文件中,添加 tree-sitter 和 tree-sitter-c 依赖,这些是解析 C 语言所需的库。

[dependencies]
tree-sitter = "0.23"
tree-sitter-c = "0.23"

3. 编写 Rust 代码

在 src/main.rs 文件中,编写代码来加载 tree-sitter 解析器并解析 C 语言代码。

use tree_sitter::{Parser, Language};// 引入 tree-sitter-c 的解析器
extern "C" { fn tree_sitter_c() -> Language; }fn main() {// Initialize the parserlet mut parser = Parser::new();// Set the language to Clet language = unsafe { tree_sitter_c() };parser.set_language(&language).expect("Error loading C grammar"); // Borrow here// Code to parselet source_code = r#"int main() {printf("Hello, World!");return 0;}"#;// Parse the source codelet tree = parser.parse(source_code, None).unwrap();// Get the root node of the syntax treelet root_node = tree.root_node();// Output the parsed resultprintln!("Parsed C code:\n{:?}", root_node);// Traverse the syntax tree and print each nodetraverse_tree(root_node, source_code);
}fn traverse_tree(node: tree_sitter::Node, source_code: &str) {let kind = node.kind();let start = node.start_position();let end = node.end_position();let text = &source_code[node.byte_range()];println!("Node type: {}, range: {:?} - {:?}, code: \n{}", kind, start, end, text);// 递归遍历子节点for child in node.children(&mut node.walk()) {traverse_tree(child, source_code);}
}

4. 运行程序

现在你可以运行程序来解析 C 语言代码:

cargo run

这段程序会解析一个简单的 C 语言代码片段并输出语法树的根节点信息,同时递归遍历并打印语法树中的所有节点。

5. 编译出错

运行程序后,你可能会看到类似以下的输出:

  = note: /home/dev2/tree_sitter_c_example/target/debug/deps/tree_sitter_c_example-4b36636fa00ecd52.0gq5053ay0orez5jtdb9nuh83.rcgu.o: In function tree_sitter_c_example::main':          /home/dev2/tree_sitter_c_example/src/main.rs:11: undefined reference to tree_sitter_c'          collect2: error: ld returned 1 exit status= note: some extern functions couldn't be found; some native libraries may need to be installed or have their path specified= note: use the -l flag to specify native libraries to link= note: use the cargo:rustc-link-lib directive to specify the native libraries to link with Cargo (see https://doc.rust-lang.org/cargo/reference/build-scripts.html#rustc-link-lib)

错误信息表明,在链接过程中,Rust 代码未能找到 tree_sitter_c 函数。这种情况通常发生在原生库(在这种情况下是 tree-sitter-c 解析器)没有正确链接的时候。以下是如何解决这个问题的步骤:

二、解决步骤

1. 添加 tree-sitter 构建依赖

tree-sitter-c 是一个原生库,因此你需要显式地在构建中包含 C 解析器库。在项目根目录中添加一个 build.rs 文件来处理 C 库的链接。

在项目根目录创建 build.rs 文件:

touch build.rs

在 build.rs 中添加以下代码:

fn main() {println!("cargo:rustc-link-lib=static=tree-sitter-c");
}

2. 添加 tree-sitter-c 源代码

你需要在项目中包含 tree-sitter-c 的源代码。你可以通过克隆 tree-sitter-c 仓库作为一个 Git 子模块,或者直接将其添加到项目中。

克隆 tree-sitter-c:

git submodule add https://github.com/tree-sitter/tree-sitter-c.git

3. 修改 build.rs 以编译 tree-sitter-c 库

修改 build.rs 文件以编译 tree-sitter-c 库:

extern crate cc;fn main() {cc::Build::new().include("tree-sitter-c/src").file("tree-sitter-c/src/parser.c").compile("tree-sitter-c");println!("cargo:rerun-if-changed=tree-sitter-c/src/parser.c");
}

这段代码使用 cc crate 来编译 tree-sitter-c 的 C 源代码,并将编译后的库链接到 Rust 项目中。

4. 修改 Cargo.toml

确保在 Cargo.toml 文件中有必要的依赖项:

[build-dependencies]
cc = "1.0"

5. 重新构建项目

最后,重新构建并运行项目:

cargo build
cargo run

这样做应该可以通过编译和链接 C 解析器来解决链接错误。

相关文章:

Rust调用tree-sitter解析C语言

文章目录 一、Rust 调用 tree-sitter 解析 C 语言代码1. 设置 Rust 项目2. 添加 tree-sitter 依赖3. 编写 Rust 代码4. 运行程序5. 编译出错 二、解决步骤1. 添加 tree-sitter 构建依赖2. 添加 tree-sitter-c 源代码3. 修改 build.rs 以编译 tree-sitter-c 库4. 修改 Cargo.tom…...

奇瑞汽车—经纬恒润 供应链技术共创交流日 成功举办

2024年9月12日,奇瑞汽车—经纬恒润技术交流日在安徽省芜湖市奇瑞总部成功举办。此次盛会标志着经纬恒润与奇瑞汽车再次携手,深入探索汽车智能化新技术的前沿趋势,共同开启面向未来的价值服务与产品新篇章。 面对全球汽车智能化浪潮与产业变革…...

vue3 TagInput 实现

效果 要实现类似于下面这种效果 大致原理 其实是很简单的,我们可以利用 element-plus 组件库里的 el-tag 组件来实现 这里我们可以将其抽离成一个公共的组件,那么现在有一个问题就是通讯问题 这里我们可以利用父子组件之间的通讯,利用 v-model 来实现,父组件传值,子组…...

mysql中的json查询

首先来构造数据 查询department里面name等于研发部的数据 查询语句跟普通的sql语句差不多,也就是字段名要用到path表达式 select * from user u where u.department->$.name 研发部 模糊查询 select * from user u where u.department->$.name like %研发%…...

Etcd权限认证管理

1 查看是否开启权限认证 ctl auth status 2 开启权限认证 ctl auth enable。开启后每一条命令都要加上用户 --userroot:root(root默认最高权限) 3 创建其他用户 ctl user add user1 --user用户名:密码 4 创建角色 ctl role add testR --user 5 为角色添加权限 ctl role g…...

图文组合商标部分驳回后优化后初审通过!

这几天以前有个企业的商标初审下来了,以前是加了图形个别部分没有通过初审,后面是把图形去掉重新用文字申请下来初审。 图形与文字同时申请,会分别审查有一个元素过不了,整体就会过不了,所以平常就会建议分开申请注册商…...

【最新华为OD机试E卷-支持在线评测】爱吃蟠桃的孙悟空(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…...

BUUCTF [SCTF2019]电单车详解两种方法(python实现绝对原创)

使用audacity打开,发现是一段PT2242 信号 PT2242信号 有长有短,短的为0,长的为1化出来 这应该是截获电动车钥匙发射出的锁车信号 0 01110100101010100110 0010 0前四位为同步码0 。。。中间这20位为01110100101010100110为地址码0010为功…...

Apache James配置连接达梦数据库

项目场景: Apache James配置连接达梦数据库,其他配置中不存在的数据库也可参考此方案。 配置步骤 1、把需要的jar包导入到James 把DmJdbcDriver18.jar复制到下面lib目录下 james-2.3.2\lib 2、 修改连接配置 james-2.3.2\apps\james\SAR-INF\confi…...

Java实现栈

一、栈Stack 1.1 概念 一种特殊的线性表,只允许在固定的一段进行插入和删除元素操作。进行数据的插入和删除操作的一段称为栈顶,另一端称为栈低。栈中的元素遵循后进先出 LIFO(Last In First Out)的原则。 进栈 出栈 举例:在word中&#xf…...

数据结构—栈

栈 概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈…...

服务设计原则介绍

在Java或任何软件开发中,设计服务时遵循一些核心原则是非常重要的,这些原则不仅有助于构建高质量、可维护的软件系统,还能提高系统的可扩展性和可重用性。以下是一些关键的服务设计原则: 单一职责原则(SingleResponsib…...

【Qualcomm】高通SNPE框架的使用 | 原始模型转换为量化的DLC文件 | 在Android的DSP端运行模型

目录 ① 激活snpe环境 ② 设置环境变量 ③ 模型转换 ④ run 首先,默认SNPE工具已经下载并且Setup相关工作均已完成。同时,拥有原始模型文件,本文使用的模型文件为SNPE 框架示例的inception_v3_2016_08_28_frozen.pb文件。image_file_list…...

爬虫的流程

爬虫的流程 获取网页提取信息保存数据自动化程序能爬怎样的数据 获取网页 获取网页就是获取网页的源代码,源代码里包含了网页的部分有用信息,所以只要把源代码获取下来,就可以从中提取想要的信息浏览器访问网页的本质:浏览器向服…...

Git之如何删除Untracked文件(六十八)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...

k8s集群自动化管理

项目地址 https://github.com/TimeBye/kubeadm-ha准备安装包 # 离线安装环境 curl -LO https://oss.choerodon.com.cn/kubeadm-ha/kubeadm-ha-base-amd64.tar # 集群运行所需的镜像 curl -LO https://oss.choerodon.com.cn/kubeadm-ha/kubernetes-1.30.2-images-amd64.tgz # …...

yum库 docker的小白安装教程(附部分问题及其解决方案)

yum库 首先我们安装yum 首先在控制台执行下列语句 首先切换到root用户,假如已经是了就不用打下面的语句 su root #使用国内的镜像,不执行直接安装yum是国外的,那个有问题 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.al…...

python如何实现日期加减

首先通过import datetime,导入日期处理库。 然后把日期转化成datetime标准格式,使用datetime.datetime.strptime()方法将字符串格式的时间转化为标准格式。 其中"%Y/%m/%d %H:%M:%S"为time字符串的时间格式:Y为年,m为月…...

springboot实战学习笔记(4)(Spring Validation参数校验框架、全局异常处理器)

接着上篇博客学习。上篇博客是已经基本完成用户模块的注册接口的开发。springboot实战学习笔记(3)(Lombok插件、postman测试工具、MD5加密算法、post请求、接口文档、注解、如何在IDEA中设置层级显示包结构、显示接口中的方法)-CSDN博客本篇博客主要是关…...

网络七层协议

网络七层协议,也称为OSI(Open Systems Interconnection)参考模型,是由国际标准化组织(ISO)提出的一种网络通信的协议分层模型。该模型将网络通信过程划分为七个层次,从下到上依次为物理层、数据…...

3步实现Mac微信防撤回:零配置本地化解决方案

3步实现Mac微信防撤回:零配置本地化解决方案 【免费下载链接】WeChatIntercept 微信防撤回插件,一键安装,仅MAC可用,支持v3.7.0微信 项目地址: https://gitcode.com/gh_mirrors/we/WeChatIntercept 告别消息遗憾&#xff1…...

拉丝机在紧固件生产中的作用与工艺流程_6月FES上海紧固件展

2026第十六届上海紧固件专业展将于6月24日至26日在国家会展中心(上海)举行。本届展会由上海上搜展览与华人螺丝网联合打造,并获得行业权威机构支持,整体展出规模约70,000平方米,预计汇聚1,400余家参展企业和25,000名专…...

cv_unet_image-colorization高保真上色案例:人脸肤色/服饰纹理自然还原实录

cv_unet_image-colorization高保真上色案例:人脸肤色/服饰纹理自然还原实录 你有没有翻看过家里的老相册?那些泛黄的黑白照片,记录着珍贵的瞬间,却总让人觉得少了点什么。色彩,是记忆的温度。过去,为黑白照…...

CasRel在电商商品知识图谱中的应用:标题-品牌-品类-功效三元组生成

CasRel在电商商品知识图谱中的应用:标题-品牌-品类-功效三元组生成 1. 理解CasRel关系抽取模型 CasRel(Cascade Binary Tagging Framework)是一个专门从文本中自动提取结构化信息的智能模型。想象一下,你有一大段描述商品的文字…...

当LLM学会“思考”算法逻辑:拆解EoH如何用“思想+代码”协同进化,碾压传统自动设计

当LLM成为算法设计师:揭秘EoH如何用“思维代码”双螺旋进化重塑自动算法设计 想象一下,你正在指挥一支由建筑师和施工队组成的特殊团队。建筑师负责绘制蓝图,施工队负责将蓝图变为现实。但与传统团队不同,你的建筑师能根据施工反…...

如何高效提取Wallpaper Engine资源:RePKG完整使用指南

如何高效提取Wallpaper Engine资源:RePKG完整使用指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款专为Wallpaper Engine设计的专业资源提取工具&#xf…...

终极指南:如何用Locale Emulator轻松解决Windows多语言软件兼容性问题

终极指南:如何用Locale Emulator轻松解决Windows多语言软件兼容性问题 【免费下载链接】Locale-Emulator Yet Another System Region and Language Simulator 项目地址: https://gitcode.com/gh_mirrors/lo/Locale-Emulator 你是否曾经因为日文游戏乱码而烦恼…...

基于StructBERT的短视频评论情感分析系统搭建

基于StructBERT的短视频评论情感分析系统搭建 1. 引言 短视频平台每天产生海量用户评论,这些评论蕴含着用户对内容的真实感受和反馈。传统的人工审核方式效率低下,难以应对实时海量的评论数据。而基于StructBERT的情感分析系统能够自动识别评论的情感倾…...

避坑指南:GD32F407移植FATFS到SD卡,这几个STM32老司机常踩的坑你别再跳了

GD32F407 FATFS移植避坑实战:STM32老手最容易忽略的5个硬件差异 从STM32切换到GD32F407的开发者,往往带着"Pin to Pin兼容"的预期开始SD卡文件系统移植,却在调试阶段遭遇各种诡异问题。上周一位资深工程师向我展示了他的调试记录&a…...

如何高效配置Unity插件框架:终极解决方案指南

如何高效配置Unity插件框架:终极解决方案指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一个功能强大的Unity游戏插件框架和模组开发平台,专…...