最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust實現(xiàn)一個表達式Parser小結(jié)

 更新時間:2022年11月18日 15:13:58   作者:EthanTeng  
這篇文章主要為大家介紹了Rust實現(xiàn)一個表達式Parser小結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

src/lib.rs 補上一個函數(shù)和一個 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 展開講了很多, 具體實現(xiàn)的時候其實并沒有那么復雜, 主要是需要設計好存儲結(jié)構(gòu), 并理解清楚狀態(tài)轉(zhuǎn)移表的含義

parser

Parser 模塊大部分篇幅都在講文法和 Parser Combinator, 最后真正實現(xiàn)的時候反而非常簡單, 這里有兩點需要注意

  • 文法的處理
    • 處理優(yōu)先級
    • 消除左遞歸
  • Parser Combinator 的封裝和設計理念

Parser Combinator 只是一種工具而已, 同類型的還有 Parser Generator, 由于筆者接觸不多, 就不好展開講了

不過這里個人認為, 比起 Parser Combinator 本身, 他的設計理念更值得關(guān)注, 尤其是這種相對比較小眾的函數(shù)式編程思維, 個人覺得很有意思

traversal

Traversal 模塊最主要的就是訪問者模式了, 根據(jù)我查到的資料來看, 普通的 AST 基本只有這一種遍歷方式

借助訪問者模式, 將所有的 visitor 單獨抽離進行實現(xiàn), 代碼可讀性和耦合度得到了很大的優(yōu)化, 筆者最開始其實是希望實現(xiàn)一個最最最簡化的表達式解析器, 因此第一版并沒有引入訪問者模式, 而在實現(xiàn)最后的兩個需求時發(fā)現(xiàn)代碼完全耦合在一起實在很惡心, 就干脆加進來了, 反正遍歷 AST 基本逃不掉這個訪問者模式

說在最后

個人感覺很多內(nèi)容其實都講的有遺漏或者有不規(guī)范的地方, 但是整個編譯領(lǐng)域, 光入門的理論知識就太多太多了, 況且筆者只是自己寫了個玩具, 而且?guī)缀跏莻€純編譯前端的項目, 也不敢說入門了, 因此就權(quán)當是學習筆記的分享了

源碼中有大量注釋, 個人感覺結(jié)合著看會更加清晰, 可以看一下, 在這里可以看

以上就是Rust實現(xiàn)一個表達式Parser小結(jié)的詳細內(nèi)容,更多關(guān)于Rust Parser表達式小結(jié)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • rust使用Atomic創(chuàng)建全局變量和使用操作方法

    rust使用Atomic創(chuàng)建全局變量和使用操作方法

    從 Rust1.34 版本后,就正式支持原子類型,原子指的是一系列不可被 CPU 上下文交換的機器指令,這些指令組合在一起就形成了原子操作,這篇文章主要介紹了rust使用Atomic創(chuàng)建全局變量和使用,需要的朋友可以參考下
    2024-05-05
  • 深入講解下Rust模塊使用方式

    深入講解下Rust模塊使用方式

    很多時候,我們寫的代碼需要按模塊組織,因為我們無法將大量的代碼都寫在一個文件上,那樣不容易維護,下面這篇文章主要給大家介紹了關(guān)于Rust模塊使用方式的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • rust延遲5秒鎖屏的實現(xiàn)代碼

    rust延遲5秒鎖屏的實現(xiàn)代碼

    這篇文章主要介紹了rust延遲5秒鎖屏的實現(xiàn)代碼,文中通過實例代碼也介紹了rust計算程序運行時間的方法,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • Rust 中解析 JSON的方法

    Rust 中解析 JSON的方法

    要開始在 Rust 中使用 JSON,您需要安裝一個可以輕松操作 JSON 的庫,目前可用的流行crate之一是 serde-json,在本文中,我們將討論如何在 Rust 中使用 JSON 解析庫,以及比較最流行的庫及其性能
    2024-03-03
  • Rust語言中的String和HashMap使用示例詳解

    Rust語言中的String和HashMap使用示例詳解

    這篇文章主要介紹了Rust語言中的String和HashMap使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Rust 數(shù)據(jù)類型詳解

    Rust 數(shù)據(jù)類型詳解

    本文介紹了Rust編程語言中的標量類型和復合類型,標量類型包括整數(shù)、浮點數(shù)、布爾和字符,而復合類型則包括元組和數(shù)組,標量類型用于表示單個值,具有不同的表示和范圍,本文介紹的非常詳細,感興趣的朋友一起看看吧
    2025-01-01
  • 詳解Rust中的方法

    詳解Rust中的方法

    方法其實就是結(jié)構(gòu)體的成員函數(shù),在C語言中的結(jié)構(gòu)體是沒有成員函數(shù)的,但是Rust畢竟也是一門面向?qū)ο蟮木幊陶Z言,所以給結(jié)構(gòu)體加上方法的特性很符合面向?qū)ο蟮奶攸c,這篇文章主要介紹了Rust中的方法,需要的朋友可以參考下
    2022-10-10
  • 使用systemd部署r-nacos的操作方法

    使用systemd部署r-nacos的操作方法

    r-nacos是一個用rust實現(xiàn)的nacos服務,我們用它平替java?nacos以降低服務占用內(nèi)存,提升服務的穩(wěn)定性,這篇文章主要介紹了使用systemd部署r-nacos,需要的朋友可以參考下
    2024-03-03
  • 深入了解Rust的生命周期

    深入了解Rust的生命周期

    生命周期指的是引用保持有效的作用域,Rust?的每個引用都有自己的生命周期。本文將通過示例和大家詳細說說Rust的生命周期,需要的可以參考一下
    2022-11-11
  • Rust中的derive屬性示例詳解

    Rust中的derive屬性示例詳解

    derive屬性的出現(xiàn)解決了手動實現(xiàn)一些特性時需要編寫大量重復代碼的問題,它可以讓編譯器自動生成這些特性的基本實現(xiàn),從而減少了程序員需要編寫的代碼量,這篇文章主要介紹了Rust中的derive屬性詳解,需要的朋友可以參考下
    2023-04-04

最新評論

天津市| 定州市| 小金县| 玉山县| 都安| 如皋市| 广丰县| SHOW| 米泉市| 晋城| 蕉岭县| 肇庆市| 苍山县| 东明县| 育儿| 昌邑市| 原阳县| 霍林郭勒市| 许昌县| 富顺县| 敦化市| 页游| 安化县| 阿拉尔市| 新干县| 乌兰察布市| 武宣县| 胶州市| 增城市| 龙里县| 农安县| 宝清县| 永川市| 洛南县| 额尔古纳市| 澎湖县| 云南省| 武汉市| 锦屏县| 三门峡市| 孟连|