網站首頁 編程語言 正文
正文
在 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 基本逃不掉這個訪問者模式
說在最后
個人感覺很多內容其實都講的有遺漏或者有不規范的地方, 但是整個編譯領域, 光入門的理論知識就太多太多了, 況且筆者只是自己寫了個玩具, 而且幾乎是個純編譯前端的項目, 也不敢說入門了, 因此就權當是學習筆記的分享了
源碼中有大量注釋, 個人感覺結合著看會更加清晰, 可以看一下, 在這里可以看
原文鏈接:https://juejin.cn/post/7166920850904940575
相關推薦
- 2022-02-20 Ubuntu18.04更改apt源為阿里云源的詳細過程_Linux
- 2022-05-27 C++?二叉樹的實現超詳細解析_C 語言
- 2022-04-21 Python的索引與切片原來該這樣理解_python
- 2022-10-04 python3實現倒計時效果_python
- 2022-09-20 用python實現學生信息管理系統_python
- 2022-06-01 C語言詳細分析常見字符串函數與模擬實現_C 語言
- 2022-12-09 C++?Easylogging++日志庫配置使用超詳細講解_C 語言
- 2022-03-24 Android使用Span打造豐富多彩的文本詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支