当前位置: 首页 > 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)提出的一种网络通信的协议分层模型。该模型将网络通信过程划分为七个层次,从下到上依次为物理层、数据…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...