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

Rust實(shí)現(xiàn)一個(gè)表達(dá)式Parser小結(jié)

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

正文

src/lib.rs 補(bǔ)上一個(gè)函數(shù)和一個(gè) 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));
    }
}
復(fù)制代碼

lexer

Lexer 模塊主要圍繞 DFA 展開講了很多, 具體實(shí)現(xiàn)的時(shí)候其實(shí)并沒有那么復(fù)雜, 主要是需要設(shè)計(jì)好存儲(chǔ)結(jié)構(gòu), 并理解清楚狀態(tài)轉(zhuǎn)移表的含義

parser

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

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

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

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

traversal

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

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

說(shuō)在最后

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

    Rust 中解析 JSON的方法

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

    Rust語(yǔ)言中的String和HashMap使用示例詳解

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

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

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

    詳解Rust中的方法

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

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

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

    深入了解Rust的生命周期

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

    Rust中的derive屬性示例詳解

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

最新評(píng)論

大竹县| 固镇县| 新营市| 武邑县| 肥乡县| 常德市| 阜新市| 鄢陵县| 勐海县| 星子县| 宁远县| 新兴县| 五家渠市| 池州市| 罗田县| 永川市| 吉隆县| 新绛县| 山西省| 咸阳市| 兰州市| 东乡县| 永兴县| 侯马市| 平昌县| 奉节县| 禹城市| 六安市| 察雅县| 依兰县| 九龙坡区| 横峰县| 沙河市| 当雄县| 赣榆县| 连山| 舟山市| 襄汾县| 满洲里市| 永城市| 佛山市|