前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Rust日报】用Rust从头实现一个C编译器

【Rust日报】用Rust从头实现一个C编译器

作者头像
MikeLoveRust
发布于 2024-04-15 06:02:48
发布于 2024-04-15 06:02:48
18400
代码可运行
举报
运行总次数:0
代码可运行

一个声明式解析库 Untwine 发布0.4

Untwine是一个声明性解析库,它允许一种类似于使用自定义宏语法进行直接模式匹配的解析风格。这允许创建具有良好性能特征和高质量错误消息的极其紧凑的解析器。这些解析器实现起来很简单,有几个精心挑选的例子:

  • 一个几乎完整的JSON解析器,包含12行解析逻辑
  • 支持除特殊转义序列之外的所有基本JSON功能(除“)
  • 一个在6行解析逻辑中具有四运算表达式解析器的pmdas
  • 一个辅助函数对两个数字进行运算

使用untwine制作的解析器也有高质量的错误消息,可以直观地显示错误和相关语法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fn operate(left: f64, op: char, right: f64) -> f64 {
    match op {
        '+' => left + right,
        '-' => left - right,
        '/' => left / right,
        '*' => left * right,
        _ => unreachable!(),
    }
}

parser! {
    sep = #{char::is_ascii_whitespace}*;
    num: num=<"-"? '0'-'9'+ ("." '0'-'9'+)?> -> f64 { num.parse().unwrap() }
    term = (num | "(" sep expr sep ")") -> f64;
    add: first=mul sep ops=(["+-"] sep mul)* -> f64 { ops.into_iter().fold(first, |left, (op, right)| operate(left, op, right)) }
    mul: first=term sep ops=(["*/"] sep term)* -> f64 { ops.into_iter().fold(first, |left, (op, right)| operate(left, op, right)) }
    pub expr = add -> f64;
}

更多信息查看 GitHub,https://github.com/boxbeam/untwine

用Rust从头实现一个C编译器

一个针对 MacOs 和 Linux 的 x86-64 的 C99 编译器,它没有任何依赖项,并且是独立的,因此可以通过单个命令进行安装(请参阅安装)。

更多信息查看 GitHub,https://github.com/PhilippRados/wrecc

Exhaustive 实现一个类型的所有值的测试

这个crate提供了一个特性来生成一个类型的所有值(达到一定深度)。它还提供了一个派生宏,将为您派生此特性。最后,它提供了一个测试宏,用于对某个类型的所有值运行基于属性的测试。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#[derive(Debug, Exhaustive)]
enum Test1 { A, B, }
#[derive(Debug, Exhaustive)]
struct Test2 { a: bool }

#[exhaustive_test]
fn test(v: Test1, w: Test2) {
    println!("{v:?} {w:?}");
}

更多信息查看 GitHub,https://github.com/JonathanBrouwer/exhaustive

From 日报小组 [倪]

社区学习交流平台订阅:

  • Rust.cc论坛: 支持rss
  • 微信公众号:Rust语言学习交流
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Rust 不允许C++方式的函数重载overloading
C++方式的函数重载,即同一个函数名以及多个不同的形参类型和个数(不包括返回值类型), 以Ad-hoc(临时,随时)过于灵活的方式来实现函数的重载!功能非常强大, 同时也是惹祸根源之一!
MikeLoveRust
2020/06/28
1K0
Rust中的过程宏
Rust 吉祥物是只螃蟹,Ferris,这可以理解,但是它为什么被煮了啊?都变红了。
杨永贞
2022/06/27
2.6K0
Rust中的过程宏
Rust实战系列-基本语法
本文是《Rust in action》学习总结系列的第二部分,更多内容请看已发布文章:
abin
2023/03/21
2.3K0
Rust实战系列-基本语法
【Rust日报】 2020-06-04 微软对 Rust 的热爱是怎么回事?
微软对 Rust 的热爱是怎么回事? 就在前天【6月2号】,Rust 进入了 TIOBE 指数的前 20 名,它从第 38 位跃升到第 20 位,跃升了惊人的 18 位,这其实是挺罕见的。于是 Vis
MikeLoveRust
2020/06/09
4240
回撸Rust China Conf 2020 之《浅谈Rust在算法题和竞赛中的应用》
刚刚结束的首届Rust China Conf 2020就是一种交流学习的方式。Rust中文社区采用直播并提供视频回放,为所有Rustacean提供了绝佳的、宝贵的学习资料。
袁承兴
2021/01/04
7580
自己动手写编译器:使用 PDA 实现增强和属性语法的解析
在前面章节中我们了解了增强语法和属性语法,特别是看到了这两种语法的结合体,本节我们看看如何使用前面我们说过的自顶向下自动机来实现这两种语法结合体的解析,这里使用的方法也是成熟编译器常用的一种语法解析算法。
望月从良
2024/02/23
2160
自己动手写编译器:使用 PDA 实现增强和属性语法的解析
再探 Parser 和 Parser Combinator
在几年前的文章《Policy Engine 的前世今生》里,我谈到了自己探索如何生成高效的表达式求值的工具的整个过程。我先是使用 JISON(javascript 的 Flex/Bison)做了一个解析器(parser),后来又用 Elixir 自己的宏编程进行了优化,让单个表达式的验证从 200+ us 提升到 20+ us。最近无意间看到了 Guido van Rossum 大神的文章 [1],讲他探索 PEG 解析器的历程(Python 3.9 已经实现了新的 PEG parser [2])。于是,这个周末,我花了一个晚上,尝试了用 Rust 下的 PEG 解析器 — pest 重新实现了 policy 表达式解析器部分,为了更好地对比 pest 和 Rust 下的另外一个神器 nom 的效果,我也同时实现了 nom 下的 policy 表达式解析器。
tyrchen
2021/02/26
2.4K0
再探 Parser 和 Parser Combinator
一网打尽 Rust 语法
大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder
前端柒八九
2024/04/30
1660
一网打尽 Rust 语法
Node.js 开发者的 Rust 入门指南
随着WebAssembly的进步,如果你想在JavaScript和Node.js的基础上,提高浏览器、服务器和边缘计算的性能,那么可以了解一下Rust。
五月君
2021/07/15
2K0
Node.js 开发者的 Rust 入门指南
【Rust日报】 2019-06-16:用 Rust, Haskell, C++ 等实现同一个工程的比较
刚出来,仅供了解,这里的“交易”是指业务的原子性,常见于数据库中。与区块链或密码学中的交易,是不同的概念。类似于 STM。
MikeLoveRust
2019/07/09
8490
【Rust日报】 2019-06-16:用 Rust, Haskell, C++ 等实现同一个工程的比较
【Rust 日报】2022-04-10 适用于Rust的异步CQL驱动
这是 ScyllaDB 的客户端驱动程序,用纯 Rust 编写,使用 Tokio 实现完全异步 API。尽管针对 ScyllaDB 进行了优化,但也与 Apache Cassandra 兼容。
MikeLoveRust
2022/04/18
9250
【Rust 日报】2022-04-10 适用于Rust的异步CQL驱动
自己动手写编译器:增强语法极其实现
我们前面章节看到的语法规则中,语法只给出了代码字符串组合规则是否符合规定,实际上我们可以在语法解析过程中增加一些特定的属性或者操作,使得语法解析流程中就能完成中间代码生成,或者是创建好特定的元信息,以便在后续处理流程中辅助代码生成。例如我们看看如何在语法解析规则中附加特定操作,使得语法解析过程就能生成中间代码,我们看一个例子,给定如下语法规则:
望月从良
2024/02/23
990
自己动手写编译器:增强语法极其实现
听GPT 讲Rust源代码--src/tools(15)
在Rust源代码中,rust/src/tools/rust-analyzer/crates/mbe/src/token_map.rs文件的作用是实现了一个能够将输入的文本映射为标记的结构。具体来说,它定义和实现了几个结构体(struct)和枚举(enum),包括TokenMap和TokenTextRange。
fliter
2023/12/26
2150
听GPT 讲Rust源代码--src/tools(15)
【每周一库】- sprs - 用Rust实现的稀疏矩阵库
sprs是用纯Rust实现的部分稀疏矩阵数据结构和线性代数算法 特性 结构 矩阵 三元组矩阵 稀疏向量 运算 稀疏矩阵 / 稀疏向量积 稀疏矩阵 / 稀疏矩阵积 稀疏矩阵 / 稀疏矩阵加法,减法 稀疏向量 / 稀疏向量加法,减法,点积 稀疏 / 稠密矩阵运算 算法 压缩稀疏矩阵的外部迭代器 稀疏向量迭代 稀疏向量联合非零迭代 简单的稀疏矩阵Cholesky分解 (需要选择接受 LGPL 许可) 等式右侧为稠密矩阵或向量情况下的稀疏矩阵解三角方程组 示例 矩阵创建 use sprs::TriMat; let
MikeLoveRust
2021/01/07
9680
Rust从零实现一个命令行端口扫描工具
按照惯例,还是和之前实现的文本编辑器一样,我给这个工具起名为X-SCAN,它的功能很简单,通过命令行参数的方式对指定IP进行扫描,扫描结束之后返回该IP地址中处于开放状态的端口号,学完本文,你将自己实现一个如下效果的端口扫描工具(截图以CSDN平台的IP地址的扫描结果为例)
堆栈哲学
2024/06/07
2200
Rust从零实现一个命令行端口扫描工具
取代Python?Rust凭什么
【导语】Rust 也能实现神经网络?在前一篇帖子中,作者介绍了MNIST数据集以及分辨手写数字的问题。在这篇文章中,他将利用前一篇帖子中的代码,通过Rust实现一个简单的神经网络。其目标是探索用Rust实现数据科学工作流程的性能以及人工效率。
AI科技大本营
2019/09/09
1.2K0
取代Python?Rust凭什么
超越C++:Ziglang 元编程一文打尽
Zig 的元编程采用了简单且直观的设计,主要依赖于编译时执行(comptime)和反射机制。Zig 的元编程旨在保持语言核心简单,不引入额外的语法复杂性。类型和编译时值是语言的基本组成部分,所有元编程功能都以一种直观的方式集成到语言中
zouyee
2024/11/23
2930
超越C++:Ziglang 元编程一文打尽
自己写的一个 json parser
之前看到知乎上有人问,会写Parser, Tokenizer是什么水平,绝大情况下,屁用没有。小部分情况,就看你运气了。因为这东西,面试又不会加分,而且,如果你面试的小公司,可能面试官甚至都不懂你在说啥。
MikeLoveRust
2020/05/26
1.4K0
【Rust日报】2023-01-18 希望你能早点学到的 Rust 技巧
ReadMore: https://rauljordan.com/rust-concepts-i-wish-i-learned-earlier/
MikeLoveRust
2023/02/15
2440
【Rust日报】2023-01-18 希望你能早点学到的 Rust 技巧
【Rust日报】 2019-07-25:用 Rust,Cursive 和 PubNub 开发一个聊天客户端
这是一篇很优秀的文章,讲了 C 编译器的实现中的一些优化情况,以及带来的风险,对于正在进化的 Rust 编译器,可能能提供一些参考。
MikeLoveRust
2019/07/30
7300
推荐阅读
相关推荐
Rust 不允许C++方式的函数重载overloading
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档