vt:終結符集合 vn 非終結符結合。s:開始符號。
p:產生式集合。
短語:乙個句型的語法樹中任一子樹葉結點所組成的符號串都是該句型的短語。直接短語:指的是如果子樹中不再包含其他的子樹,即a只能推導出b,而b不能再推出其他的式子,則b為此句型的直接短語。
控制代碼:直接短語中的最左直接短語為該句型的控制代碼。
dfa:確定的有限自動機。nfa:非確定的有限自動機。
nfa轉dfa步驟:
確定由ε得到的closure(0),構造狀態集閉包;
然後確定move( , ),構造closure(move( ,))閉包;
簡化狀態,構造狀態轉移表;
畫圖。最小化dfa步驟:
去除無關狀態,合併等價狀態;
分割子集法,首次分為終態集與非終態集。然後,對每個子集g,如果面對某個輸入符號得到的後繼狀態不屬於同乙個子集,則將g進一步劃分。
自頂向下推導,文法:ll(1)ll(1)重點在於求first集、follow集、select集。
(第乙個l 表示從左到右掃瞄輸入串 第二個l表示生成的是最左推導 1表示向右看乙個輸入符號決定選擇哪個產生式)
first(a)為a的開始符或者首符號集
若x∈vt,則first(x)= 簡單講,終結符的first集就是它本身。
若x∈vn,且有產生式x→a…,a∈vt, 則 a∈first(x) x→ε,則ε∈first(x) 簡單講,若是非終結符x,能推導出以終結符a開頭的串,那麼這個終結符a屬於first(x),若x能夠推導出空符號串ε,那麼空符號串ε也屬於x的first集。
follow(a)為非終結符a的後跟符號集合
設s為文法中開始符號,把加入follow(s)中(這裡「#」 為句子括號)。
若a→αbβ是乙個產生式,則把first(β)的非空元素加入follow(b)中。
如果β能夠推導出ε則把follow(a)也加入follow(b)中,反覆使用(2)直到每個非終結符的follow集不再增大。
select集
若α不能推導出ε,則select(a→α)=first(α)
α能推導出ε則:select(a→α)=(first(α) –)∪follow(a)
注意⚠️:左遞迴問題 公共左因子 不能用自頂而下分析。
如何消除左遞迴??
直接左遞迴:a→aβ|γ ——> a→γa』 (終結符+x』) a'→βa'|ε ( x』+去掉左遞迴的產生式|空集)
間接左遞迴:將間接左遞迴式子化為直接左遞迴,利用1轉化。
自底而上規約,文法:lr(0)、lr(1)、 slr(1)、 lalr(1)重點在於求action-goto表。
action表用於告訴分析引擎:在棧頂狀態為k,輸入符號是a的時候做什麼。
action(k,a)=si // 將狀態i移入棧頂
action(k,a)=rj // 按照第j條產生式進行歸約
action(k,a)=acc // 分析完成
action(k,a)=err // 發現錯誤
goto表
goto(i,a)=j告訴引擎,在依照產生歸約之後,棧頂狀態為i,要將j移進棧頂。
lr(0)文法
拓廣文法 在產生式前加上·
分析接收字元,構造lr(0)自動機
構造lr(0)分析表 status action goto 終止項對應action 內填寫對應的歸約式
判斷是否是lr(0)文法
如果文法對應的自動機中不存在移進-歸約衝突和歸約-歸約衝突則為 lr(0)文法。
slr(1)
拓廣文法、寫自動機、分析過程表與 lr(0)文法相同
判斷是否是slr(1)文法
用 follow集來處理即出現移進-歸約衝突的兩條產生式,如果其 follow集相交為空則為 slr文法,反之不是。
lalr(1)
拓廣文法一致
與 lr(0)自動機,lr(1)自動機多了向前搜尋符
合併同心集,即合併產生式相同但是向前搜尋符不同的項集族.由於合併了同心集,所以 lalr分析表也應該做出相應的改變,例如合併了 i3和 i6,則對應的格中應填 s36 .
判斷是否是lalr(1)文法
合併同心集不會產生新的移進-歸約衝突。但是會產生新的歸約-歸約衝突,如果沒產生衝突就是 lalr 文法,反之不是。
lr(1)
分析過程與 lalr文法相同。
判斷是否是lr(1)文法
因為 lr(1)文法的範圍比較大,所以文法幾乎都是 lr(1)的。現在知道的只有當合併同心集產生了歸約-歸約衝突時才只屬於lr(1)文法,而不屬於其他文法
如果它的任意產生式的右部都不含兩個相繼(並列)的非終結符,即不含如下形式的產生式右部:…qr…那麼我們稱該文法為算符文法。
ll(1)重點在於求firstvt集、lastvt集.
firstvt集
p->a…或者p->qa…,那麼a∈firstvt(p);
a∈firstvt(q)且p->q…,那麼a∈firstvt(p)。
lastvt集
p->…a或者p->…aq,那麼a∈lastvt(p);
a∈lastvt(q),p->…q,那麼a∈lastvt(p)。
文法構造步驟:
構造非終結符的firstvt集和lastvt集;
構造優先關係表:
運用規則:
不斷取輸入字串的棧頂和當前符號比較優先順序,若是《或者=的關係就是移進的操作,如果是》的關係就是規約的關係。
綜合屬性: 自下而上 傳遞資訊繼承屬性: 自上而下 傳遞資訊
終結符只有綜合屬性,由詞法分析器提供。
非終結符既有綜合屬性又可以有繼承屬性。
兩個?,看看吧~寫出乙個語法制導定義,輸出配對括號個數
為s,l引入屬性h
s』—>s print(s.h)
s—>(l) s.h=l.h+1
s—>a s.h=0
l—>l1,s l.h=l1.h+s.h
l—>s l.h=s.h
寫乙個翻譯方案,列印每個a的巢狀深度
s』—>s s.d=0
s—>(l) l.d=s.d+1
s—>a print(s.d)
l—>l1,s l1.d=l.d,s.d=l.d
l—>s s.d=l.d
基本塊是指程式中以順序執行的語句序列,只有乙個出口和入口。如何優化基本塊:
合併已知量;
刪除無用賦值;
共用公共子表示式。
知識點整理
一 標準庫容器和演算法 1.順序容器 與前面類似 2.關聯容器 map和multimap 元素包含key 鍵 和值 value 兩部分 按照鍵對元素排序 map不允許重複元素出現,但multimap可以 set和multliset 是包含已排序物件的關聯容器 只是單純的鍵的集合 set不允許重複鍵出...
知識點整理
一 標準庫容器和演算法 1.順序容器 與前面類似 2.關聯容器 map和multimap 元素包含key 鍵 和值 value 兩部分 按照鍵對元素排序 map不允許重複元素出現,但multimap可以 set和multliset 是包含已排序物件的關聯容器 只是單純的鍵的集合 set不允許重複鍵出...
知識點整理
一 狀態控制碼 code,control flag 標誌位欄位 u a p r s f 佔6位元。各 位元的含義如下 ack 確認位元 acknowledge 只有當ack 1時確認號字段才有效,代表這個封包為確認封包。當ack 0時,確認號無效。psh push function 若為1時,代表要...