使用 rust pest 實作簡單的 PEG simple 剖析器

上一篇 我們看了 PEG 相關的內容,這篇我們就來介紹該如何用 PEG 寫一個簡單的剖析器。

...

剖析表達文法 PEG 簡介

剖析表達文法 PEG 為 Parsing Expression Grammar 的縮寫,2004 年由 Bryan Ford 教授所提出, 相對於一般在編譯器課上教 parsing 所用的 CFG (Context Free Grammar) ,已經被鑽研數十年之久,可說是相當年輕的形式化語言。

...

整理 rust module 的安排方式

故事是這樣子的,兩年前因為傳說中的 jserv 大神的推薦,我讀了 Understanding Computation 這本書 ,讀完覺得學到很多東西,深受啟發; 後來大概花了兩個月的時間,用Rust 重寫了裡面所有的範例程式碼,目前在 github 上查了一下, 我應該是除了原作實作 之外,實作最完整的一個,可謂一人之下,萬人之上(誤。

最近因為一些原因,把之前的實作打開來看,馬上關上,假的!趕快在筆電前面打坐。
當初到底怎麼寫這麼醜,還查到有些章節的內容沒有實作完,那時候可能太難不會寫,先跳過結果就忘了QQ……最近這一兩個禮拜陸續花了一點時間整理。

這次整理的一大修正,是把本來是散在各處的原始碼,重新照 rust 慣例統整到 src 資料夾下面,並使用 cargo 管理,帶來的好處包括有:

  1. 可以一次 cargo build 編譯所有程式
  2. 引入 cargo test 代替本來編譯成執行檔用 println debug 的實作
  3. 在各章的內容間重用 module ,提升重用比例
  4. 另外也能使用網路上其他人寫的 Rust module(其實這才是原初整理的目的)

例如在我之前實作的程式碼,在寫 finite automata 時,dfa, nfa 各自有一個實作,使用 u32 作為狀態; 但到了 regular expression 的時候,為了產生 nfa 就不能用 u32 作為狀態,於是我複製了一版 nfa, 改成用 object pointer 作為狀態 , 兩者程式碼的重複率就非常高,這次也一併改成 generic 的 nfa 實作,兩邊就能分享同一套程式碼。

...

實用的gdb 指令

最近工作上大量使用到 gdb,想說來整理一下一些常用的 gdb 使用方式,以及對應的場景;當然,這絕對不是 gdb 完整的功能介紹,只是目前我遇到比較多的使用方式而已。

...

使用rust closure實作fizzbuzz

之前用Rust 重寫Understanding Computation 裡面的ruby code,目前從 github 上來看,我的 Rust code 應該是僅次於原作者的 code,完成度最高的一個版本。
從去年五月,把大部分的 code 完成以來,唯一一個沒寫的章節:chapter 6 的 fizzbuzz,最近終於實作出來了\weee/。

...

Rust 開發迷你ARM kernel 系列 0:Hello world

故事是這樣的,很久以前曾經在rust 上面實作 hello world 的 arm 程式 ,不過那時候的作法現在已經不能用,而且除了輸出x 之外其實不能幹嘛,更別提後面更多的東西了。

其實網路上也查得到不少Rust OS 的實作,沒道理我做不到,於是就來試一試了。

...

不為人知的gdb 使用方式系統-gdb pretty printer auto load

前言:
最近因為jserv 大神的關係,看了下面這部Become a GDB Power User

覺得裡面還不少生猛的用法之前都不會用,決定把它整理一下,上回 我們提到了gdb 的pretty printer,現在我們就來看個範例:寫Rust 用的Rust-gdb。

...

使用clap-rs 建構程式介面

最近小弟在改 rust completion tool: racer 的code ,發現它用的程式介面crates: clap-rs還不錯,值得專文介紹一下:

其實這不是第一個類似的套件,事實上已知有以下這幾個選項:

...

 July 24, 2016 |    rust  |    rust  | 2 分鐘  |  YodaLee

淺談rust option type

強者我同學qcl 做了一系列的簽名檔,大體的概念就是用女友狂炸執行緒,以下是C++ version:

int main(int argc, char *argv[]) {
    QCL *qcl = new QCL();
    Girl *gf = qcl->findGirlfriend();
    printf("%s\n", gf→name());
    return 0;
}
qcl@QCLS:~$ g++ qcl.cc
qcl@QCLS:~$ ./a.out
Segmentation fault
...

 April 21, 2016 |    rust  |    rust  | 1 分鐘  |  YodaLee

使用 Rust 實作 regular expression tester

其實這個功能很早以前就已經完成了,將正規表示式對轉換成Non-Deterministic Automata(NFA) ,來 match 字串,
先前的實作有一些問題,因為再建 NFA的時候,狀態是使用整數來表示。

在轉換成NFA時,正規表示式的 Concatenate, Choose, Repeat 需要將兩個NFA 結合成一個,因為由 Empty 或 Literal 直接建NFA時, 編號一定是從 0 開始,兩個都包含狀態 0 的狀態機,直接結合起來絕對不會是對的,需要讓兩邊的狀態都不一樣才行。
當然也不可能用亂數來作為狀態,畢竟以亂數作為狀態,連一個NFA裡面有哪些狀態都不知道,結合時根本就無法檢查是否有衝突。

...