first集合的求法:
first集合最終是對產生式右部的字串而言的,但其關鍵是求出非終結符的first集合,由於終結符的first集合就是它自己,所以求出非終結符的first集合後,就可很直觀地得到每個字串的first集合。
1.直接收取:對形如u-a…的產生式(其中a是終結符),把a收入到first(u)中
2.反覆傳送:對形入u-p…的產生式(其中p是非終結符),應把first(p)中的全部內容傳送到first(u)中。
follow集合的求法:
follow集合是針對非終結符而言的,follow(u)所表達的是句型中非終結符u所有可能的後隨終結符號的集合,特別地,「#」是識別符號的後隨符。
1.直接收取:注意產生式右部的每乙個形如「…ua…」的組合,把a直接收入到follow(u)中。
2.直接收取:對形如「…up…」(p是非終結符)的組合,把first(p)除ε直接收入到follow(u)中。
3.反覆傳送:對形如p-…u的產生式(其中u是非終結符),應把follow(p)中的全部內容傳送到follow(u)中。(或 p-…ub且first(b)包含ε,則把first(b)除ε直接收入到follow(u)中,並把follow(p)中的全部內容傳送到follow(u)中)
例1:判斷該文法是不是ll(1)文法,說明理由 s→abc a→a|ε b→b|ε?
first集合求法就是:能由非終結符號推出的所有的開頭符號或可能的ε,但要求這個開頭符號是終結符號。如此題a可以推導出a和ε,所以first(a)={a,ε};同理first(b)=;s可以推導出abc,還可以推導出bc,還可以推導出c,所以first(s)={a,b,c}。
follow集合的求法是:緊跟隨其後面的終結符號或#。但文法的識別符號包含#,在求的時候還要考慮到ε。具體做法是把所有包含你要求的符號的產生式都找出來,再看哪個有用。 follow(s)={#} 如求a的,產生式:s→abc a→a|ε ,但只有s→abc 有用。跟隨在a後年的終結符號是first(b)={b,ε},當first(b)的元素為ε時,跟隨在a後的符號就是c,所以 follow(a)={b,c} 同理follow(b)={c}。
出自:
編譯原理 編譯原理期末複習1
1,關於文法 乙個文法g可以抽象的分為四元組 vn,vt,p,s vn表示非終結符 vt表示終結符 p表示產生式 s表示開始符 2,老師上課說的編譯原理的階段說的是 詞法分析,語法分析,語義分析,中間 生成,優化,目標 生成 其中語法分析,語義分析,中間 生成稱為語法制導翻譯 語義分析,中間 生成稱...
編譯原理語義分析 編譯原理 語義分析和符號表
本文使用 zhihu on vscode 創作並發布經過詞法分析 語法分析之後,源程式形式上和結構上的正確性基本得到了保證。然而,僅有形式上的正確性,並不能保證源程式就是完全正確的,還要檢查源程式的含義是否正確。諸如符號的使用是否得當,表示式的型別是否相容等,完成這些功能的編譯階段稱為語義分析。語義...
javascript預編譯原理和例子
先看 alert typeof vv var vv variable function vv alert vv script 執行結果是 function 和 variable 照理說,一開始,vv有變數宣告,有vv函式的函式宣告,但vv的函式宣告覆蓋了變數宣告,所以typeof vv為 funct...