編譯原理 --- 詞法分析中的一些重要概念:串和語言,及語言的運算法則

首先,字母表,即Alphabet,是一個有限的符號集合。

然後,串(string) 是該字母表 的一個有窮序列。

舉個簡單的例子,集合{0,1}是一個二進制字母表(Binary Alphabet),可以取這個字母表裏面的元素組成串,即01序列。

我們通常將串的長度記做 |s|,空串是長度爲0的串,記做 ϵ
語言(Language) 是某個給定的字母表上任意一個可數的串的集合。

也即,字母表 裏的符號組成 ,各個 的集合叫做 語言

對於串來說,我們有如下的一些術語:

1)串的前綴(prefix) 是 從串s的頭部取0個或多個符號形成的新串
如串a、串ap是串apple的前綴。
2)串的後綴(suffix) 是 從串s的尾部取0個或多個符號形成的新串
如串e、串le是串apple的前綴。
3)串的子串(substring)是刪除串s的某個前綴和某個後綴形成的新串。
4)串的真前綴真後綴真子串是既不包含空串ϵ,也不包含s本身的前綴、後綴、子串。
5)串的子序列是從串s任意按順序地取出符號形成地串。如子序列apple可以是al、pe、appe、apple。

我們定義串x與串y的連接運算是將串y附加到串s後面,記做xy,也可以看作是x與y的乘法運算。
如x=dog,y=house,那麼xy=doghouse
對於連接運算有如下性質:對於任意的串s,都有:ϵs=sϵ=s

串的 “指數運算” 如下:
定義s0=ϵ,si=si-1s,那麼有s1=s,s2=ss,s3=s2s=sss,…,sn=ssss…ssss(n個s)

語言的運算規則

設L、M是兩種語言,有:
L和M的並:L∪M = { s | s ∈ L 或 s∈M }
L和M的連接:LM = { xy | x ∈ L 且 y∈M}
兩種語言的連接就是,從語言L任取一個串,與從語言M任取的串連接起來的所有可能的串的集合。舉個例子,假設L={ab,cd},M={12,34},那麼LM={ab12,ab34,cd12,cd34}。
L的正閉包:L+=Ui=1Li
L+=Ui=1Li=L1∪L2∪…∪L

爲了解讀正閉包的定義,我們先來看Li怎麼計算。

由於LM = { xy | x ∈ L 且 y∈M},如果我們令M=L,我們可以得到L2={ xx | x ∈ L },L3=LL2={ xxx | x ∈ L },L4=LL3={ xxxx | x ∈ L }
由上面歸納得到:Li={ xxx…xxx | x ∈ L } (i個x) ={ xi | x ∈ L }。也就是說,L的i次方Li實際上就是L裏面隨意取i個串連接起來,其連接後所有可能得到的串的集合。舉個簡單的例子,令L={‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’},這個語言由9個串組成,每個串含有一個符號。那麼L3表示的是所有可能的三位數集合,如{‘012’,‘252’,…}。

搞懂了Li的含義之後,看正閉包的定義就簡單了。正閉包的定義如下:
L+=Ui=1Li=L1∪L2∪…∪L
可以觀察到,L的正閉包其實就是,從L裏面隨意取出串,拼接成所有可能長度(長度至少爲1)的串的集合。應用上面的例子L={‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’},那麼L的正閉包L+表示的就是所有能夠表示出來的數字的集合,如{‘1’,‘8’,‘12’,‘01’,‘789’,‘948357’,…}請注意,正閉包的定義裏不包含L0={s0}=ϵ,也就是說,正閉包不包含空串ϵ。

L的Kleene閉包:L*=Ui=0
L=Ui=0Li=L0∪L1∪L2∪…∪L
可以看到,L的Kleene閉包和正閉包的區別僅僅在於多了個L0,也就是說,Kleene閉包僅僅是在正閉包的基礎上加入了空串。
再次應用上面的例子L={‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’},那麼L*={ϵ,‘1’,‘8’,‘12’,‘01’,‘789’,‘948357’,…}

發佈了16 篇原創文章 · 獲贊 2 · 訪問量 6987
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章