《自己手動寫乙個編譯器 聯結器》一(1)

2021-09-30 13:48:03 字數 1192 閱讀 3322

這次主要是記錄一些關於字母表,和文法的形式定義(基礎部分)

字母表

這個字母表其實囊括了我們的符號和符號串的概念,大可以認為這兩個就是字母表的子集吧!

對於字母表的分析要從兩個方面來看

詞法分析方面

從詞法分析來看我們的字母表其實就是原始碼字元

那麼對應的有符號和符號串的概念,其實

這個時候的符號就是這個字母表的真子集(包含)

符號串就是指一串符號組成的乙個串,這個串不要求有什麼語義。

語法分析方面

從語法分析的角度上來看,我們的字母表就多出了對原始碼字元的組合並且是有意義的(單詞符號等)

那麼對應的符號和符號串的概念:

這個時候的符號同時也是字母表的真子集(乙個個的單詞等)

符號串則是一句有意義並且有相關語法成分的乙個符號串(由之前的符號組合而成的)

此時對於符號串,我們還有一些定義:(具體內容不解釋,方便回顧的時候查缺補漏)

1:空符號串

2:符號串集合

3:符號串相等的概念

4:符號串的長度

5:符號串的連線

6:符號傳結合的乘積,冪運算

7:符號串集合的閉包運算:

a+= …

a*=…

上面那個是下面那個的真子集,差別就是乙個有空符號串,乙個沒有,上面那個叫做正閉包,下面的叫做閉包

文法其實就是約束乙個語言的方法,其實就是讓語言的無窮中句式組合方法抽象為有窮的文法來表示,通過文法,我們可以得到概念,句型句子和語言的定義。

1:文法g一般定義為四元組(v1,v2,p,s)其中v1和v2沒有交集,兩者的並集就是文法g的字母表,其中v1為非終結符(終結符其實就是基本元素,不能再被分解的單位),v2就是終結符(其實兩者的關係我覺得就有點類似於上面從詞法分析和語法分析上面的字元的關係),p是產生式(規則)s是識別符號或者稱開始符號,這個是乙個終結符,在乙個p中作為左部出現。

2:推導即定義v中的符號之間的關係。

3:如果a->b是g的p一條產生c和d是v中的符號有v = cad,w = cbd,那麼就說明w是v的直接推導。

4:g[s]是乙個文法,如果x是從s中推導出來的那麼x就是文法g[s]的句型,如果x僅由終結符組成,那麼x為g[s]的句子。

5:文法描述的語言是該文法一切句子的集合。

(這一部分好抽象,關於文法的型別明天再說吧,今天看了一晚上,暈乎乎的)

《自己手動寫乙個編譯器 聯結器》一(3)

這次記錄的是語法分析 光看定義玖足夠暈人的,所以我看了一遍然後決定一邊重新梳理一邊記錄 語法分析法有兩種,一種是自頂向下法,一種是自底向上法,兩種方法中最常用的是自頂向下法 這個方法也是書中所使用的,所以這裡沒有自底向上法的具體介紹,不過這個方法會在明天的筆記中補全 自頂向下法又分為兩種,就是不確定...

用Scheme寫乙個Scheme編譯器(一)

在博主的大學生涯中,感覺最頭痛的一門課程就是編譯原理了,學習完這門課程之後,雖然知道了ll,lr演算法,和一系列與編譯原理相關的術語,可是對它的了解一直停留在做題上,雖然博主一直希望能夠通過自己寫乙個編譯器來加深對編譯原理的理解,可是用c語言寫編譯器真的是一場噩夢,每天大把的時間都花在了除錯bug上...

自己手動寫乙個HashMap

目錄 public inte ce map public class hashmapimplements map 通過key 進行hash index下表陣列 當前陣列對應的物件entry 判斷當前這個物件為空 如果是空的,直接可以儲存資料,如果不為空,就是hash衝突,所以要用鍊錶,然後返回這個儲...