广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Rust实现一个表达式Parser小结
  • 431
分享到

Rust实现一个表达式Parser小结

Rust Parser表达式小结Rust Parser 2022-11-21 22:11:58 431人浏览 八月长安
摘要

目录正文lexerparsertraversal说在最后正文 在 src/lib.rs 补上一个函数和一个 smoke test, 如下 pub use traversal::{ev

正文

src/lib.rs 补上一个函数和一个 smoke test, 如下

pub use traversal::{eval, fORMat};

pub fn build_ast(expr: &str) -> Result<node, String> {
    let root = syntax(lex(expr)?)?;
    Ok(root)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn smoke() {
        let expr = "1*2+(3/(4+(-5)))";
        let ast = build_ast(expr).unwrap();

        assert_eq!(-1, eval(&ast));
        assert_eq!("1 * 2 + 3 / (4 + (-5))", format(&ast));
    }
}
复制代码

lexer

Lexer 模块主要围绕 DFA 展开讲了很多, 具体实现的时候其实并没有那么复杂, 主要是需要设计好存储结构, 并理解清楚状态转移表的含义

parser

Parser 模块大部分篇幅都在讲文法和 Parser Combinator, 最后真正实现的时候反而非常简单, 这里有两点需要注意

  • 文法的处理
    • 处理优先级
    • 消除左递归
  • Parser Combinator 的封装和设计理念

Parser Combinator 只是一种工具而已, 同类型的还有 Parser Generator, 由于笔者接触不多, 就不好展开讲了

不过这里个人认为, 比起 Parser Combinator 本身, 他的设计理念更值得关注, 尤其是这种相对比较小众的函数式编程思维, 个人觉得很有意思

traversal

Traversal 模块最主要的就是访问者模式了, 根据我查到的资料来看, 普通的 AST 基本只有这一种遍历方式

借助访问者模式, 将所有的 visitor 单独抽离进行实现, 代码可读性和耦合度得到了很大的优化, 笔者最开始其实是希望实现一个最最最简化的表达式解析器, 因此第一版并没有引入访问者模式, 而在实现最后的两个需求时发现代码完全耦合在一起实在很恶心, 就干脆加进来了, 反正遍历 AST 基本逃不掉这个访问者模式

说在最后

个人感觉很多内容其实都讲的有遗漏或者有不规范的地方, 但是整个编译领域, 光入门的理论知识就太多太多了, 况且笔者只是自己写了个玩具, 而且几乎是个纯编译前端项目, 也不敢说入门了, 因此就权当是学习笔记的分享了

源码中有大量注释, 个人感觉结合着看会更加清晰, 可以看一下, 在这里可以看

以上就是Rust实现一个表达式Parser小结的详细内容,更多关于Rust Parser表达式小结的资料请关注编程网其它相关文章!

--结束END--

本文标题: Rust实现一个表达式Parser小结

本文链接: https://www.lsjlt.com/news/173349.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Rust实现一个表达式Parser小结
    目录正文lexerparsertraversal说在最后正文 在 src/lib.rs 补上一个函数和一个 smoke test, 如下 pub use traversal::{ev...
    99+
    2022-11-21
    Rust Parser表达式小结 Rust Parser
  • 基于Java实现一个复杂关系表达式过滤器
    目录背景分析准备实现方式写在最后背景 最近,有一个新需求,需要后台设置一个复杂的关系表达式,根据用户指定ID,解析该用用户是否满足该条件,后台设置类似于禅道的搜索条件 但是不同的是...
    99+
    2022-11-13
  • 正则表达式从原理到实战全面学习小结
    目录正则是啥?简单字符转义字符字符集和量词字符边界选择表达式分组与引用预搜索修饰符图形化工具JavaScript中的正则RegExp#testRegExp#execString#se...
    99+
    2022-11-13
  • 用 Go 实现一个完整的数学表达式计算引擎
    导读这篇文章将从头开始,使用 Go 语言来实现一个完整的数学表达式计算引擎。本文采用的是抽象语法树(Abstract Syntax Tree,AST)实现方式。虽然本文的实现代码为 Go,但不用纠结于此,语言只是实现方式的一种选择,作为开发...
    99+
    2022-11-11
  • python正则表达式如何实现最小匹配
    这篇文章给大家分享的是有关python正则表达式如何实现最小匹配的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。最小匹配格式:量词注:量词有{n,m}、、+、*用处:在字符串中查找符合正则表达式规则的最短子字符串。...
    99+
    2023-06-26
  • CASE表达式如何实现基于条件逻辑来返回一个值
    这篇文章给大家分享的是有关CASE表达式如何实现基于条件逻辑来返回一个值的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。我们在开发过程中,经常需要针对一列,基于条件逻辑来返回一个值...
    99+
    2022-10-19
  • Golang如何实现两个正则表达式相交
    在Golang中,可以使用`regexp`包来实现正则表达式的相交操作。具体步骤如下:1. 导入`regexp`包:```goimp...
    99+
    2023-08-19
    Golang
  • 怎么在python中利用后缀表达式实现一个计算器功能
    本文章向大家介绍怎么在python中利用后缀表达式实现一个计算器功能的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。前缀表达式运算符在数字的前面1 + (2 + 3) * 4 - 5 (中缀)- + 1 * + ...
    99+
    2023-06-06
  • 正则表达式regular expression详述(一)284455实现方法
     正则表达式是regular expression,看来英文比中文要好理解多了,就是检查表达式符不符合规定!!正则表达式有一个功能十分强大而又十分复杂的对象RegExp,在...
    99+
    2023-05-20
    正则表达式regular expression详述
  • 正则表达式regular expression详述(一)284435实现方法
     正则表达式是regular expression,看来英文比中文要好理解多了,就是检查表达式符不符合规定!!正则表达式有一个功能十分强大而又十分复杂的对象RegExp,在...
    99+
    2023-05-20
    正则表达式regular expression详述
  • Golang栈结构和后缀表达式实现计算器示例
    目录引言问题中缀、后缀表达式的计算人利用中缀表达式计算值计算机利用后缀表达式计算值计算后缀表达式的代码实现中缀表达式转后缀表达式转换过程转换的代码实现总结引言 只进行基本的四则运算,...
    99+
    2022-11-13
  • 如何实现一个微信小程序仪表盘组件
    小编给大家分享一下如何实现一个微信小程序仪表盘组件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言最近开发了一个小程序动态仪表...
    99+
    2022-10-19
  • 微信小程序如何实现input正则表达式验证功能
    小编给大家分享一下微信小程序如何实现input正则表达式验证功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:1、效果...
    99+
    2022-10-19
  • 小程序使用scroll-view实现一个滑动列表功能
    目录滑动区域下拉刷新触底加载总结 滑动列表是每个应用必不可少的部分,而实现也是一件复杂的事情,根据上面的动图实现一个滑动列表,需要考虑到如下几点。 列表的滑动区域列表的下拉刷新列表的...
    99+
    2022-11-13
    scroll-view横向滚动 小程序scroll-view scroll-view 滑动列表
  • php如何实现正则表达式匹配一段字符串替换
    这篇文章主要介绍了php如何实现正则表达式匹配一段字符串替换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php实现正则表达式匹配一段字符串替换的方法:1、创建一个PHP示例...
    99+
    2023-06-21
  • php怎么实现正则表达式匹配一段字符串替换
    本文操作环境:windows7系统、PHP7.4版、DELL G3电脑php怎么实现正则表达式匹配一段字符串替换?PHP 正则表达式替换一部分内容preg_replace('/&topic=(.*)&type=/&#...
    99+
    2015-04-21
    php
  • 微信小程序中怎么实现一个固定表头、列表格组件
    微信小程序中怎么实现一个固定表头、列表格组件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。实现思路开始想用三个ScrollView去实现滚动联动,固定表头、列的话,表格内容...
    99+
    2023-06-20
  • java实现mysql两个数据库对比表结构是否一致
    【使用场景】 本地开发完后,增加或者删除了字段,或者修改了字段属性。 如何判定现场环境和本地环境的数据表结构一致性? 肉眼看的话,实在是一个大的工作量,所以开发了此工具。 【类存放路径】 CompareDbMain是主函数。 【具体代码】...
    99+
    2023-09-11
    数据库 mysql
  • Java生成微信小程序二维码,5种实现方式,一个比一个简单
    文章目录 前言先看官网一、JDK自带的URLConnection方式二、Apache的HttpClient方式三、okhttp3方式四、Unirest方式五、RestTemplate方式其它细节getAccessToken构建参数m...
    99+
    2023-08-16
    微信小程序 小程序 微信 二维码 http
  • grep正则表达式怎么实现查找某个特定的IP地址
    本篇内容主要讲解“grep正则表达式怎么实现查找某个特定的IP地址”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“grep正则表达式怎么实现查找某个特定的IP地址”吧!下面会举几个在grep命令中...
    99+
    2023-06-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作