[編譯原理]如何判斷某文法的二義性以及找到文法對應的語言

Appletree24發表於2023-02-23

隨便說說

這學期開編譯原理課了,覺得還挺有意思的,寫點部落格記錄記錄。

如何根據文法找到其對應生成的語言

image.png
如圖所示,假設我們現在有文法如下:

\[G(Z):Z->aZb|ab \]

根據文法產生語言的定義,語言是文法產生的句子的全體,用集合表示如下:

\[L(G)=\left \{ α|S\stackrel+\Rightarrow α \&α∈V_T^*\right \} \]

而句子的定義則是由文法的開始符S出發,經過1步或有限步推匯出來的符號串並且該符號串全部由終結符組成
在上述白板題目中,由文法可知,開始符為G,有兩個產生式,分別是Z->aZb和Z->ab
採用遞迴的方式,任意組合兩種產生式,進行一步或有限步的推導,使得聲稱式的右側不含有非終結符。
終結符就是語言中不可再分的基本符號,例如一個語言的字母表
而非終結符也叫語法變數,代表語法實體或語法範疇,是一個一定的語法概念,可以是一個類、一個集合。

過程也就很簡單了,如上圖中白板所示即可,但最終需要歸納,因為有一種推導的右側時刻會存在非終結符Z,所以可以無限新增a和b的數量。

如何判斷某文法的二義性

判斷二義性的前提是需要知道最左推導和最右推導。
最左推導的定義是,在我們每次使用產生式推導的過程中,肯定會遇到右側存在非終結符的情況,非終結符會存在任意位置,其中如果我們每次推導都替換掉從右往左的第一個非終結符,那麼本次推導就是一次最右推導,反之則為最左推導。
而判斷文法的二義性則是在此基礎上進行推導:
如果文法G[S]的一個句子能夠找到兩種不同的最左推導或最右推導,也就是說存在兩棵不同的語法樹,那麼這個句子就是二義性的,而文法若存在一個有二義性的句子,那麼這個文法也是二義性的。
假設有文法如下:

\[G\left [ S \right ] :S->if\space b\space S \]

\[S->if\space b\space S \space else \space S \]

\[S->a \]

image.png
image.png
根據白板上書寫的兩種最右推導,可以知道句子if b if b a else a是個二義性的句子,因為有兩種最右推導都可以最終得到這個句子,那麼對應的這個文法也就是二義性的了。

相關文章