I . 上下文無關語法 設計 示例
1 . 上下文無關語法 設計要求 : 設計一個語法 , 使用該語法生成語言 w , 該 w 語言的字符串的開始和結尾的字符是相同的 ;
2 . 設計方法 : 非確定性優先自動機 ( NFA ) 識別某語言 , 將 NFA 轉爲 確定性優先自動機 ( DFA ) , 然後將 DFA 轉爲 上下文無關語法 ;
3 . 語法設計要求分析 :
-
開始字符 要麼是 0 , 要麼就是 1 ;
-
如果開始字符是 0 , 對應的結尾字符也是 0 ;
-
如果開始字符是 1 , 對應的結尾字符也是 1 ;
4 . 初始狀態 S 規則 : 上述語法描述轉爲規則 如下 , 其中 S 爲初始狀態 ;
S→0S′0∣1S′1
5 . S′ 規則 : S′ 表示中間的字符串 , 這個 S′ 字符串可以是任意字符串 , 根據下面的規則可以生成任意的 0,1 組成的字符串 ;
S′→0S′∣1S′∣ε
II . 上下文無關語法 的歧義性
給出如下上下文無關語法 ( CFG ) :
Expression→Expression+Expression∣Expression×Expression∣Expression∣a
語法的含義是 :
- Expression 可以被 Expression+Expression 替換 ;
- Expression 可以被 Expression×Expression 替換 ;
- Expression 可以被 Expression 替換 ;
- Expression 可以被 a 替換 ;
1 . 語法的有歧義性 : 同樣的一個字符串 , 可以有不同的語法分析樹 ;
① 語法分析樹 1 :
2 . 在上述的 語法分析樹中 , 加法優先級高於乘法 , 這是錯誤的分析 ;
② 語法分析樹 2 :
在上述的 語法分析樹中 , 乘法優先級高於加法 , 這是正確的分析 ;
3 . 語法歧義性分析 : 上述語法中是無法區分 加法 和 乘法的優先級的 , 因此這裏得到兩個完全不一致得我語法分析樹 , 那麼該語法是有歧義的 ;
4 . 與代數表達式語法對比 : 之前講的代數表達式是好的語法 , 乘法 和 加法的優先級 也體現出來 , 乘法優先級高於加法 , 括號的優先級高於乘法 ;
① 代數表達式語法 :
- Expression→Expression+Term∣Term
- Term→Term×Factor∣Factor
- Factor→Expression∣a
② 代數表達式語法分析樹 : 這個語法分析樹是唯一的 , 沒有其它的形式 , 該語法是沒有歧義的 ;
③ 有歧義的語法 : 在本節的語法中 , 無法區分 加法 和 乘法的優先級 , 該語法是有歧義的 ;
5 . 總結 : 如果語法有歧義 , 那麼中間的字符串有歧義 ; 沒有算法 可以判定 上下文無關語法 是否有歧義 ; 有些語法天生就是有歧義的 , 但可以通過某種方法去掉語法中的歧義性 ;
III . Chomsky 範式
1 . Chomsky 範式 : 上下文無關語法中的任何規則都是如下格式 ;
① A→BC : A 是 變元 , B,C 也是變元 ;
② A→a : A 是 變元 , a 是常元 , A 可以被終端字符替換 ;
③ B,C 變元要求 : B,C 變元一定不能是開始變元 ;
④ S→ε : S 開始變元可以爲空 ;
⑤ 不能出現 變元→變元 單個變元 到 單個變元不允許出現 ;
2 . S→ε 規則 說明 :
① 語言包含空字符串 : 如果上下文無關語法包含空字符串時 , 一定需要 S→ε 規則 ;
② 語言不包含空字符串 : 如果上下文無關語法不包含空字符串時 , 一定不需要 S→ε 規則 ;
③ 規則總結 : 該規則決定 上下文無關語法 所生成的語言 是否包含 空字符串 , 如果包含必須要這個規則 , 如果不包含空字符串一定不要這個規則 ;
IV . 上下文無關語法 轉爲 Chomsky 範式
Chomsky 範式規則 的 上下文無關語法 生成的語言 的語法分析樹 除葉子節點之外 都 是二叉樹 , 葉子節點 與 上一層都是 一對一的節點 ;
任何 上下文無關語法 , 都可以找到一個 Chomsky 範式 與其等價 ;
任何 上下文無關語法 的語法分析樹 都可以進行修剪 , 修剪後的樹都是二叉樹 ;
上下文無關語法 轉爲 Chomsky 範式 步驟 :
1 . 添加開始變元及規則 : 添加一個新的開始變元 S0 , 以及配套的規則 S0→S , S 是舊的開始變元 ;
① 目的 : 添加開始變元的目的是 開始變元 永遠出現在左邊 ;
② Chomsky 範式 中 , 開始變元始終在規則的左邊 , 不允許開始變元在規則的右側 ;
③ 對應 Chomsky 範式 規則 : A→BC 規則 , A 是 變元 , B,C 也是變元 , 並且 B,C 不允許是開始變元 ;
2 . 消除所有的 ε 規則 : 消除所有從 變元 到 空字符 的規則 ;
3 . 消除所有的 A→B 規則 : 消除所有從 單個變元 到 單個變元的 單條規則 , 允許從 單個變元 到 多個變元或常元 ;
如 A→B 是需要刪除的 , A→BS 可以保留 ;
V . 上下文無關語法 轉爲 Chomsky 範式 示例
將 上下文無關語法 G6 轉爲 Chomsky 範式 :
- S→ASA∣aB
- A→B∣S
- B→b∣ε
轉換過程如下 :
1 . 添加新的開始變元 : S0 , 舊的開始變元 S 就不是開始變元了 ;
當前的語法格式如下 :
- S0→S
- S→ASA∣aB
- A→B∣S
- B→b∣ε
2 . 消除 ε 規則 :
消除 ε 規則 原則 : 假設有規則 C→ε , D→uCv , 如果要刪除 ε 規則 , 需要實現 消除前後具有 相同的替換效果 , 將規則改爲 D→uv 即可刪除 ε 相關規則 ;
( 消除前後 , 替換效果必須一致 )
3 . 消除 B→b∣ε 中的 ε : 會影響 S→ASA∣aB 和 A→B∣S 兩條規則中涉及到了 B 變元 , 消除的原則是 " 消除前後 , 替換效果必須一致 " ;
3.1 . S→ASA∣aB 規則消除 ε 分析 : 這裏討論 消除 B→b∣ε 規則中的 B→ε 規則 對 aB 的影響 ;
① 消除 B→ε 規則前分析 : 使用 B→b∣ε 規則 對 aB 進行替換 有兩種情況 , 分別是 ab , a , 兩種情況 ;
② 消除 B→ε 規則後分析 : 如果要消除 B→ε 規則 , 那麼消除後的規則是 B→b , 使用 B→b 規則對 aB 進行替換 , 其替換 結果必須是 ab , a , 兩種情況 ;
分析 ab , a 兩種結果 :
-
aB 使用 B→b 規則替換 , 可以得到 ab ;
-
a 替換結果無法獲取 , 此時需要在 aB 的平級 , 再次添加 a 即可達到上述效果 ;
aB 最終修改方案 : 將 aB 改爲 aB∣a , 使用 B→b 規則替換 aB∣a 的結果是 ab , a , 與上述消除 B→ε 規則 前的結果一致 ;
③ S→ASA∣aB 規則對應的消除 B→ε 規則後的結果爲
S→ASA∣aB∣a
④ 當前的語法格式如下 : 注意 還沒有討論 A→B∣S 規則中的 B , B→b∣ε 規則中的 ε 還不能刪除 ;
- S0→S
- S→ASA∣aB∣a
- A→B∣S : 注意此時該規則不完善 , 還沒有刪除 ε ;
- B→b
3.2 . A→B∣S 規則消除 ε 分析 : 這裏討論 消除 B→b∣ε 規則中的 B→ε 規則 對 B 的影響 ;
① 消除 B→ε 規則前分析 : 使用 B→b∣ε 規則 對 B 進行替換 有兩種情況 , 分別是 b , ε , 兩種情況 ;
② 消除 B→ε 規則後分析 : 如果要消除 B→ε 規則 , 那麼消除後的規則是 B→b , 使用 B→b 規則對 B 進行替換 , 其替換 結果必須是 b , ε , 兩種情況 ;
分析 b , ε 兩種結果 :
-
B 使用 B→b 規則替換 , 可以得到 b ;
-
ε 替換結果無法獲取 , 此時需要在 B 的平級 , 再次添加 ε 即可達到上述效果 ;
B 最終修改方案 : 將 B 改爲 B∣ε , 使用 B→b 規則替換 B∣ε 的結果是 b , ε , 與上述消除 B→ε 規則 前的結果一致 ;
③ A→B∣S 規則對應的消除 B→ε 規則後的結果爲
A→B∣ε∣S
④ 當前的語法格式如下 : 注意 還沒有討論 A→B∣S 規則中的 B , B→b∣ε 規則中的 ε 還不能刪除 ;
- S0→S
- S→ASA∣aB∣a
- A→B∣ε∣S
- B→b
4 . 消除 A→B∣ε∣S 中的 ε : 會影響 S→ASA∣aB∣a 規則中涉及到了 A 變元 , 消除的原則是 " 消除前後 , 替換效果必須一致 " ;
① 消除 ASA 中的 ε , 添加以下項即可 :
-
第一個 A 通過 ε 代替 : 添加 SA 項 ;
-
第二個 A 通過 ε 代替 : 添加 AS 項 ;
-
兩個 A 都通過 ε 代替 : 是 S , 可以不同寫 , S→S 沒啥意義 ;
② S→ASA∣aB∣a 規則對應的消除 A→ε 規則後的結果爲 :
S→ASA∣AS∣SA∣aB∣a
③ 當前的語法格式如下 :
- S0→S
- S→ASA∣AS∣SA∣aB∣a
- A→B∣S
- B→b
5 . 消除 A→B 規則 :
假設要消除 C→D 規則 : 如果語法中有 D→W 規則 , 那麼如果消除 C→D , 需要將 C→W 體現出來 ;
消除 A→B 規則 , 檢查 B 出現在規則左邊的情況 , 這裏有 B→b 規則 , 需要 添加 A→b 規則後 , 即可刪除 A→B 規則 ;
刪除前規則 :
- S0→S
- S→ASA∣AS∣SA∣aB∣a
- A→B∣S
- B→b
刪除後規則如下 :
- S0→S
- S→ASA∣AS∣SA∣aB∣a
- A→b∣S
6 . 消除 A→S 規則 :
① 消除 A→S 規則 , 檢查 S 出現在規則左邊的情況 , 這裏有 S→ASA∣AS∣SA∣aB∣a 規則 , 需要 添加 A→ASA∣AS∣SA∣aB∣a 規則後 , 即可刪除 A→S 規則 ;
② 刪除前規則 :
- S0→S
- S→ASA∣AS∣SA∣aB∣a
- A→b∣S
③ 刪除後規則如下 :
- S0→S
- S→ASA∣AS∣SA∣aB∣a
- A→b∣ASA∣AS∣SA∣aB∣a
7 . 分解規則 :
① 分解示例 : S→ASA 可以分解爲 S→R , R→SA
② 分解前的規則 :
- S0→S
- S→ASA∣AS∣SA∣aB∣a
- A→b∣ASA∣AS∣SA∣aB∣a
③ 分解後的規則 :
下面的規則 是 S→ASA∣AS∣SA∣aB∣a 分解後的規則 :
- S→R
- R→SA
- S→AS
- S→SA
- S→aB
- S→a
下面的規則 是 A→b∣ASA∣AS∣SA∣aB∣a 分解後的規則 :
- A→b
- A→R
- A→SA
- A→AS
- A→SA
- A→aB
- A→a