編譯原理-文法壓縮練習

在這里插入圖片描述

這個任務的目標就是把一個給定的文法變得“干凈”和“高效”,剔除所有無用的部分。根據幻燈片,無用的(多余的)規則分為兩大類:

  1. 不可達規則:規則的“頭”(左部非終結符)從起始符號出發根本走不到。就像地圖上一個孤立的島嶼,你永遠無法從大陸到達那里。
  2. 不活動規則:規則本身或其“身體”(右部)含有無法最終變成終結符串的“死胡同”符號。用了這條規則,你的推導就永遠無法結束。

解決這類問題的標準做法是分兩步走,順序很重要:


化簡文法的兩步法

第一步:消除“不活動”符號 (Eliminate Non-Terminating Symbols)

  • 目標:找出所有不能推導出終結符串的非終結符,然后刪除所有包含它們的規則。
  • 方法:我們反過來找,找出所有推導出終結符串的“活動符號”。這是一個迭代的過程:
    1. 第1輪:找出所有能直接推導出終結符串的非終結符(例如 A → a)。把它們加入“活動集”。
    2. 第2輪:找出所有能推導出由“終結符”和“活動集中的符號”組成的字符串的非終結符。把新找到的也加入“活動集”。
    3. 重復第2步,直到“活動集”不再增大。
    4. 最后,所有不在“活動集”中的非終結符都是“不活動符號”。

第二步:消除“不可達”符號 (Eliminate Unreachable Symbols)

  • 目標:從起始符號 S 出發,找出所有能訪問到的符號,刪除所有訪問不到的。
  • 方法:這就像一個圖的遍歷:
    1. 第1輪:將起始符號 S 加入“可達集”。
    2. 第2輪:查看“可達集”中所有符號的產生式,把它們右手邊出現的所有的非終結符都加入“可達集”。
    3. 重復第2步,直到“可達集”不再增大。
    4. 最后,所有不在“可達集”中的非終結符都是“不可達符號”。

解題步驟 walkthrough

讓我們用這個方法來解決你的例題:
原始文法 G[S]:
S -> ABC | CD
A -> Aa | a
B -> Bb
C -> Cc | c
D -> Dd | d
E -> Ee | E

第一步:消除不活動符號

我們要建立一個“活動符號”的集合。

  1. 第1輪:尋找能直接推導出終結符的規則。

    • A -> a => A 是活動的。
    • C -> c => C 是活動的。
    • D -> d => D 是活動的。
    • 當前活動集 = { A, C, D }
  2. 第2輪:尋找規則右部只包含終結符和活動集成員的。

    • S -> CD: 右部的 CD 都在活動集中。所以 S 是活動的。
    • A -> Aa: 右部的 A 在活動集中,a 是終結符。所以 A 是活動的(這只是確認,沒有新增)。
    • C -> Cc: 右部的 C 在活動集中,c 是終結符。確認 C
    • D -> Dd: 右部的 D 在活動集中,d 是終結符。確認 D
    • 當前活動集 = { A, C, D, S }
  3. 第3輪:再次檢查,看看活動集是否能繼續擴大。

    • S -> ABC: AC 在活動集中,但 B 不在。所以這條路走不通。
    • B -> Bb: 右部的 B 不在活動集中。走不通。
    • E -> Ee | E: 右部的 E 不在活動集中。走不通。
    • 活動集沒有再增大了。

結論

  • 活動符號S, A, C, D
  • 不活動符號B, E

操作:刪除所有與 BE 相關的規則。

  • 刪除 B -> Bb
  • 刪除 E -> Ee | E
  • 刪除 S -> ABC (因為它包含了不活動符號 B)

化簡后的文法 (第一步結束):
S -> CD
A -> Aa | a
C -> Cc | c
D -> Dd | d


第二步:消除不可達符號

我們從起始符號 S 出發,建立一個“可達符號”的集合。

  1. 第1輪:起始符號 S 是可達的。

    • 當前可達集 = { S }
  2. 第2輪:查看 S 的規則。

    • S -> CD: 右部引入了新的非終?符 CD
    • 當前可達集 = { S, C, D }
  3. 第3輪:查看新加入的 CD 的規則。

    • C -> Cc | c: 右部只包含 C,已經在可達集中。
    • D -> Dd | d: 右部只包含 D,已經在可達集中。
    • 可達集沒有再增大了。

結論

  • 可達符號S, C, D
  • 不可達符號A

操作:刪除所有與 A 相關的規則。

  • 刪除 A -> Aa | a

最終結果:壓縮后的文法

經過以上兩步,我們得到的最終文法是:

S -> CD
C -> Cc | c
D -> Dd | d

這就是這道題的完整解法和最終答案。這個兩步法是一個標準的、機械化的流程,只要按照步驟來,就一定能正確地化簡任何文法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96693.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96693.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96693.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GPU硬件架構和配置的理解

從公司架構理解GPU架構想象一個GPU就像一家大型科技公司,它的任務是處理圖形和計算任務(“干活”)。硬件概念公司架構比喻作用和特點Platform (平臺)集團公司最大的獨立實體。比如谷歌Alphabet是一個集團公司,它旗下有谷歌、Waymo…

【硬件開發】電源抑制比PSRR

電源抑制比PSRR是電壓輸入量和電壓輸出量的比值,通常用dB來表示。 PSRR這個參數經常和運放,LDO,DCDC變換器有關聯。(2 封私信 / 58 條消息) 電源抑制比(PSRR)的基礎知識 - 知乎

七、卷積神經網絡

目錄 7.1 整體結構 7.2 卷積層 7.2.1 全連接層存在的問題 7.2.2 卷積運算 7.2.3 填充 7.2.5 3維數據的卷積運算 7.2.6 結合方塊思考 7.2.7 批處理 7.3 池化層 7.4 卷積層和池化層的實現 7.4.1 4維數組 7.4.2 基于 im2col的展開 7.4.3 卷積層的實現 7.4.4 池化層的…

加餐加餐!燒烤斗破蒼穹

忽然起了吃燒烤的念頭,便掏出手機點了一堆。不過二十分鐘,外賣小哥便按響了門鈴,手里提著一個方正的紙袋,還冒著熱氣。我將燒烤一一取出,排在茶幾上。肉串油光發亮,韭菜翠綠間點綴著蒜蓉,茄子剖…

搜索引擎收錄網站帶www和不帶www有區別嗎?

這是一個非常常見且重要的問題。簡單直接的回答是:有區別,但對搜索引擎來說,處理得當就不會重復;處理不當則會造成嚴重重復和權重分散。下面我為您詳細解釋一下,并提供正確的處理方法。核心區別:兩個不同的…

AFSim2.9.0學習筆記 —— 2、AFSim的Wizard軟件概述(ArkSIM集成開發環境 (IDE))

🔔 AFSim2.9.0 相關技術、疑難雜癥文章合集(掌握后可自封大俠 ?_?)(記得收藏,持續更新中…) 若還沒有下載AFSim2.9.0完整軟件或源碼,請先進入本人另篇文章了解下載。 正文 ??主界面 打開 Ar…

建自己的Python項目倉庫,使用工具:GitHub(遠程倉庫)、GitHub Desktop(版本控制工具)、VSCode(代碼編輯器)

結合 GitHub(遠程倉庫)、GitHub Desktop(版本控制工具)、VSCode(代碼編輯器) 三個工具,以下是更具體的Python項目倉庫搭建流程,包含工具協同操作的詳細步驟: 一、整體流程…

iDEA Lombok 失效 和 slf log 變量失效問題

1. lombok 失效:檢查下配置有沒有使用注解處理器;且這個處理中有沒有帶上版本;版本號需要與上面引入的依賴版本一致。2. 對于找不到 log 變量的操作,則是使用下面將這個變量使用下面的代碼定義出來;上面去掉 slf4j注解…

go資深之路筆記(二) sync.Pool

一、 使用 sync.Pool 減少 GC 壓力,提升性能 簡單講下go的gc,它的核心原理就是三色標記法和寫屏障,可以實現優秀并發處理。gc一般不會頻繁調用,他是根據GOGC的值來判斷,具體就是上次觸發GC后總堆值大于等于上次的(1GO…

【面試筆記-Java開發崗】

目錄:1. synchronized 和 ReentrantLock 的區別及應用場景2. HashMap 與 LinkedHashMap 的區別3. ConcurrentHashMap 的數據結構及 JDK1.7 與 JDK1.8 區別4. Spring 常用的模式及應用場景5. 事務的四大特性(ACID)6. 鎖機制:行級鎖…

CSS :has() 選擇器詳解:為什么它是“父選擇器”?如何實現真正的容器查詢?

一、前言 在傳統的 CSS 中,我們只能根據元素的自身屬性、類名、ID 或其子元素/兄弟元素來設置樣式,卻無法根據其父元素或后代元素的狀態來改變自身樣式。 直到 :has() 選擇器的出現,這一局面被徹底改變。 :has() 被稱為 “父選擇器” 或 “…

李宏毅 Deep Learning

感謝李宏毅老師qwq1. 基礎概念1.1 Machine Learning問題引出:預測后面幾天的觀看人數;初步構建模型:擬合效果不好,就是在原數據上平移了一段距離;此處構建模型的本質:利用特征工程,將“多維特征…

【AI論文】分享即關愛:基于集體強化學習經驗共享的高效語言模型(LM)后訓練方法

摘要:利用強化學習(RL)對語言模型(LMs)進行后訓練,無需監督微調即可增強其復雜推理能力,DeepSeek-R1-Zero便證明了這一點。然而,要有效利用強化學習訓練語言模型,需要進行…

工業網關在汽車沖壓車間的應用:EtherNet/IP轉EtherCAT集成實踐

在汽車零部件沖壓車間中,生產線的高效協同與精準控制是提升整體產能的關鍵。隨著自動化設備的多樣化,不同協議的設備之間的通信成為技術難點。例如,羅克韋爾PLC通常采用EtherNet/IP協議,而許多高性能機械臂則依賴EtherCAT協議。如…

【底層機制】【C++】std::move 為什么引入?是什么?怎么實現的?怎么正確用?

C++底層機制推薦閱讀 【C++基礎知識】深入剖析C和C++在內存分配上的區別 【底層機制】【C++】vector 為什么等到滿了才擴容而不是提前擴容? 【底層機制】malloc 在實現時為什么要對大小內存采取不同策略? 【底層機制】剖析 brk 和 sbrk的底層原理 【底層機制】為什么棧的內存…

Redis面試相關

數據過期策略 惰性刪除 當用到那個key的時候再檢查是否過期,過期則刪除,有效則返回key 優點是可以節省檢查過期的時間 缺點是會浪費內存 定期刪除 每隔一段時間對一些key進行檢查并且刪除里面的過期key 有兩種模式 slow模式是定時任務,頻率是…

知識輸出零散沒有體系怎么辦

當面臨知識輸出零散、不成體系的困境時,其根本原因在于未能建立一個從輸入、整合到輸出的閉環系統。要解決這一問題,核心在于構建個人知識管理體系、掌握結構化思維與表達能力、運用合適的工具與方法進行固化、持續實踐并迭代優化。這意味著,…

【C語言選擇排序算法詳解】+ 算法性能優化 + 動態演示實現

文章目錄一、算法介紹二、算法特點三、代碼實現與解析四、代碼解析1. 打印數組函數2. 選擇排序核心邏輯3. 動態展示實現4. 主函數五、算法優化思路與實現優化1:減少交換次數優化原理:優化2:雙向選擇排序優化原理:優化3&#xff1a…

棧(Java)

提示:多練才是王道,加油?(?????)? 棧Java1. 棧2. Java中棧的其中兩種實現方式2.1 Stack類2.1.1 Stack的模擬實現2.2 LinkedList類3. 典型習題講解3.1 逆波蘭表達式求值3.2 匹配括號3.3 合理彈出序列3.4 最小棧1. 棧 棧是一種特殊的線性表,其只允許在固定的一…

LayaAir鼠標(手指)控制相機旋轉,限制角度

切換天空盒腳本掛載到相機身上 const { regClass, property } Laya;regClass() export class SmoothCameraController extends Laya.Script {declare owner: Laya.Camera;// 旋轉靈敏度property({ type: Number, name: "旋轉靈敏度" })public rotationSensitivity:…