Rust實(shí)現(xiàn)一個(gè)表達(dá)式Parser小結(jié)
正文
在 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 展開(kāi)講了很多, 具體實(shí)現(xiàn)的時(shí)候其實(shí)并沒(méi)有那么復(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, 由于筆者接觸不多, 就不好展開(kāi)講了
不過(guò)這里個(gè)人認(rèn)為, 比起 Parser Combinator 本身, 他的設(shè)計(jì)理念更值得關(guān)注, 尤其是這種相對(duì)比較小眾的函數(shù)式編程思維, 個(gè)人覺(jué)得很有意思
traversal
Traversal 模塊最主要的就是訪問(wèn)者模式了, 根據(jù)我查到的資料來(lái)看, 普通的 AST 基本只有這一種遍歷方式
借助訪問(wèn)者模式, 將所有的 visitor 單獨(dú)抽離進(jìn)行實(shí)現(xiàn), 代碼可讀性和耦合度得到了很大的優(yōu)化, 筆者最開(kāi)始其實(shí)是希望實(shí)現(xiàn)一個(gè)最最最簡(jiǎn)化的表達(dá)式解析器, 因此第一版并沒(méi)有引入訪問(wèn)者模式, 而在實(shí)現(xiàn)最后的兩個(gè)需求時(shí)發(fā)現(xiàn)代碼完全耦合在一起實(shí)在很惡心, 就干脆加進(jìn)來(lái)了, 反正遍歷 AST 基本逃不掉這個(gè)訪問(wèn)者模式
說(shuō)在最后
個(gè)人感覺(jué)很多內(nèi)容其實(shí)都講的有遺漏或者有不規(guī)范的地方, 但是整個(gè)編譯領(lǐng)域, 光入門(mén)的理論知識(shí)就太多太多了, 況且筆者只是自己寫(xiě)了個(gè)玩具, 而且?guī)缀跏莻€(gè)純編譯前端的項(xiàng)目, 也不敢說(shuō)入門(mén)了, 因此就權(quán)當(dāng)是學(xué)習(xí)筆記的分享了
源碼中有大量注釋, 個(gè)人感覺(jué)結(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)建全局變量和使用操作方法
從 Rust1.34 版本后,就正式支持原子類型,原子指的是一系列不可被 CPU 上下文交換的機(jī)器指令,這些指令組合在一起就形成了原子操作,這篇文章主要介紹了rust使用Atomic創(chuàng)建全局變量和使用,需要的朋友可以參考下2024-05-05
Rust語(yǔ)言中的String和HashMap使用示例詳解
這篇文章主要介紹了Rust語(yǔ)言中的String和HashMap使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10

