返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >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://lsjlt.com/news/173349.html(转载时请注明来源链接)

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

猜你喜欢
  • Rust实现一个表达式Parser小结
    目录正文lexerparsertraversal说在最后正文 在 src/lib.rs 补上一个函数和一个 smoke test, 如下 pub use traversal::{ev...
    99+
    2022-11-21
    Rust Parser表达式小结 Rust Parser
  • 基于Java实现一个复杂关系表达式过滤器
    目录背景分析准备实现方式写在最后背景 最近,有一个新需求,需要后台设置一个复杂的关系表达式,根据用户指定ID,解析该用用户是否满足该条件,后台设置类似于禅道的搜索条件 但是不同的是...
    99+
    2024-04-02
  • 用 Go 实现一个完整的数学表达式计算引擎
    导读这篇文章将从头开始,使用 Go 语言来实现一个完整的数学表达式计算引擎。本文采用的是抽象语法树(Abstract Syntax Tree,AST)实现方式。虽然本文的实现代码为 Go,但不用纠结于此,语言只是实现方式的一种选择,作为开发...
    99+
    2024-04-02
  • python正则表达式如何实现最小匹配
    这篇文章给大家分享的是有关python正则表达式如何实现最小匹配的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。最小匹配格式:量词注:量词有{n,m}、、+、*用处:在字符串中查找符合正则表达式规则的最短子字符串。...
    99+
    2023-06-26
  • 正则表达式从原理到实战全面学习小结
    目录正则是啥?简单字符转义字符字符集和量词字符边界选择表达式分组与引用预搜索修饰符图形化工具JavaScript中的正则RegExp#testRegExp#execString#se...
    99+
    2024-04-02
  • 正则表达式常见的4种匹配模式小结
    目录0.写在前面1.不区分大小写模式2.点号通配模式3.多行匹配模式4.注释模式5.写在最后0.写在前面 今天一起来学习下正则中的匹配模式,所谓的匹配模式,就是指正则中的一些 改变元...
    99+
    2024-04-02
  • jQuery中校验时间格式的正则表达式小结
    代码中用到了jQuery,传入的参数是jQuery选择的input对象.原理:先用正则匹配,再提取时分秒,看其是否在正常的范围内。 复制代码 代码如下:function checkT...
    99+
    2022-11-15
    校验时间
  • Hive中常用正则表达式的运用小结
    在实际的应用中,通常需要在一些复杂的、没有规律的字符串中提取数据,这时候就需要用到正则表达式了,这次讲一下hive的正则表达式。 like 语法:A like B 说明:如果字符串A...
    99+
    2022-11-13
    Hive正则表达式运用 Hive正则表达式 正则表达式运用
  • ORACLE中常用的几种正则表达式小结
    ORACLE正则表达式我基本用到的就一下几种,前四种最长用到 REGEXP_LIKE(source_char, pattern, match_parameter)REGEXP_SUB...
    99+
    2024-04-02
  • 如何在C#项目中创建一个Lambda表达式和Lambda表达式树
    如何在C#项目中创建一个Lambda表达式和Lambda表达式树?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。表达式Lambda  表达式位于 => 运算符右侧的 l...
    99+
    2023-06-06
  • Golang如何实现两个正则表达式相交
    在Golang中,可以使用`regexp`包来实现正则表达式的相交操作。具体步骤如下:1. 导入`regexp`包:```goimp...
    99+
    2023-08-19
    Golang
  • C++实现中缀表达式转化为后缀表达式详解
    目录1.题目描述2.输入输出3.解题思路4.样例解析 5.代码实现5.1.优先级确认5.2.转换函数1.题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运...
    99+
    2024-04-02
  • C++如何实现中缀表达式转化为后缀表达式
    这篇文章将为大家详细讲解有关C++如何实现中缀表达式转化为后缀表达式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.题目描述所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象...
    99+
    2023-06-29
  • CASE表达式如何实现基于条件逻辑来返回一个值
    这篇文章给大家分享的是有关CASE表达式如何实现基于条件逻辑来返回一个值的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。我们在开发过程中,经常需要针对一列,基于条件逻辑来返回一个值...
    99+
    2024-04-02
  • 利用Rust实现一个简单的Ping应用
    目录目标命令行解析实现Ping周期性发送其他验证总结这两年Rust火的一塌糊涂,甚至都烧到了前端,再不学习怕是要落伍了。最近翻了翻文档,写了个简单的Ping应用练练手,被所有权折腾的...
    99+
    2022-12-08
    Rust实现Ping应用 Rust实现Ping Rust Ping
  • 正则表达式regular expression详述(一)284435实现方法
     正则表达式是regular expression,看来英文比中文要好理解多了,就是检查表达式符不符合规定!!正则表达式有一个功能十分强大而又十分复杂的对象RegExp,在...
    99+
    2023-05-20
    正则表达式regular expression详述
  • 正则表达式regular expression详述(一)284455实现方法
     正则表达式是regular expression,看来英文比中文要好理解多了,就是检查表达式符不符合规定!!正则表达式有一个功能十分强大而又十分复杂的对象RegExp,在...
    99+
    2023-05-20
    正则表达式regular expression详述
  • 怎么在python中利用后缀表达式实现一个计算器功能
    本文章向大家介绍怎么在python中利用后缀表达式实现一个计算器功能的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。前缀表达式运算符在数字的前面1 + (2 + 3) * 4 - 5 (中缀)- + 1 * + ...
    99+
    2023-06-06
  • python如何实现列表推导表达式
    这篇文章主要为大家展示了“python如何实现列表推导表达式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python如何实现列表推导表达式”这篇文章吧。列表推导表达式列表推导表达式是创建列表的...
    99+
    2023-06-27
  • Golang栈结构和后缀表达式实现计算器示例
    目录引言问题中缀、后缀表达式的计算人利用中缀表达式计算值计算机利用后缀表达式计算值计算后缀表达式的代码实现中缀表达式转后缀表达式转换过程转换的代码实现总结引言 只进行基本的四则运算,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作