編譯原理(龍書)學習之路(1)

2021-07-29 15:43:03 字數 1361 閱讀 2157

在第三章末尾,有一節介紹了由正規表示式直接生成dfa的方法。需要三個輔助函式nullable,firstpos,lastpos和followpos。其中前三個都很好計算也很好理解,而followpos雖然通過例子知道了如何計算,但演算法中對它的原理介紹卻十分含糊。書上是這麼說的:

如果n是乙個cat結點,且其左右子節點分別為c1、c2,那麼對於lastpos(c1)中的每個位置i,firstpos(c2)中的所有位置都在followpos(i)中。

如果n是star結點,並且i是lastpos(n)中的乙個位置,那麼firstpos(n)中的所有位置都在followpos(i)中。

其實書裡有很多這種定義,看了半天都不理解在說什麼。我們直接看例項。

首先根據前面的例子可以知道,followpos(i)其實就是i後面可以接的結點編號。第一種情況,n是cat結點,以first=,last=的結點為例,它所代表的表示式可以以1,2或3開頭(其中以3開頭是在左子結點為空的情況下),以3結尾。看它的左子節點*,它的lastpos後面接的就是右子節點a的firstpos,很好理解。第二種情況,n是star,那麼它代表的表示式就是(…)*,即括號裡內容任意迴圈,即last後緊接fist,答案就出來了。

演算法描述依然看不懂,只記住了兩個定義:dstates和dtran,直接看給的例子。

給得很清晰,但不明白原理的話很容易忘。(大白話說演算法預警)

首先,dstates是狀態集合,根結點肯定得先進來,因為它的fistpos和lastpos表明了整個正規表示式的開始和結尾。首先得到了a,需要解釋的來了,就是dtran[a,a]的計算方法。dtran是轉換函式,意思就是a經過a到達的狀態是誰,同理dtran[a,b]就是a經過邊b到達的狀態,一看到「經過」就用followpos,圖就能畫出來了。但這裡有個點很有意思,就是為什麼它等於代表a的編號(1和3)的followpos?

感覺好像天經地義,但仔細想想,a是轉換條件,而1234編號代表狀態!

答案作者已經給出了,就在前面幾頁:

顯然重要狀態的位置就對應抽象語法樹中各個運算分量的編號!

在這裡記錄的原因就是希望自己和大家思考一下原理,把這個演算法和之前的內容聯絡起來。明天開始看語法分析了,將還會記錄一些未解釋的演算法。

紫書學習筆記(1)

這幾天雜七雜八的事情太多,再加上進入了考試周,所以很難有時間安安靜靜的敲敲 看看書,寫寫部落格了。最近寫了一些oj的題目,但是寫到這個份上,發現有些做不動了。因為自己沒有很系統的看過一些演算法競賽書,所以很多時候時間複雜度和空間複雜度都控制不好,所以就想寫一寫前段時間買的劉汝佳的紫書,也就是 演算法...

西瓜書 學習筆記 (1)緒論

個人自學筆記,內容摘自原書 個人理解,不一定正確,若有誤,歡迎指出。機器學習的定義 假設用p來評估電腦程式在某任務類t上的效能,若乙個程式通過利用經驗e在任務t中獲得了效能改善,則我們就說關於t和p,該程式對e進行了學習。mitchell,1997 通俗地說,機器學習即是通過學習演算法,從經驗 資料...

HBASE原理與實踐 讀書學習

hbase principle and practice 書挺好。學習之。基礎,元件,核心原理,運維,高階話題。一 模型,結構,特性 二 跳躍表,lsm樹,布隆過濾器 三 zookeeper,hdfs 四 hbase客戶端 meta表,scan 五 regionserver 內部結構,hlog,me...