編譯原理二版答案
㈠ 急急急 求答案! 編譯原理
如果你想對S求follow,那大概要做下面的兩件事情
如果你發現有些rule包含Sb,那麼b就屬於follow(S)
如果你發現有些rule包含SB,那麼first(B)就包含於follow(S)
如果你發現有些rule長得像Shit ::= xxxx S,那麼follow(Shit)就包含於follow(S)
㈡ 編譯原理:構造產生此語言的上下文無關文法G
對於文法G=(V, T, S, P),如果產生式的形式如下:
A -> xB
A -> x
其中A, B屬於V,x屬於T*,則稱為右線性文法;相似的,如果產生式的形式如下:
A -> Bx
A -> x
則稱為左線性文法。右線性文法和左線性文法統稱為正則文法。
正則表達式的表達能力等價於正則文法,正則表達式的定義如下:
字母表中的任意字母是正則表達式,空串和空集也是正則表達式;
如果r, s是正則表達式,那麼r|s, rs, r*, (r)也是正則表達式。
正則表達式的擴展:
r+:一個或多個重復
. :任意字元
[a-z]:字元范圍
[^abc]:不在給定集合中的任意字元
r?:可選
正則表達式只能使用終結符(字母表中的字元),因而很容易變得復雜又難懂,實際中,經常使用正則描述,正則描述允許使用非終結符定義表達式,很像EBNF,但是它限制在未完全定義之前,不能使用非終結符,也就是說不允許遞歸或自嵌套。
像正則表達式的表達能力等價於正則文法一樣,BNF範式的表達能力等價於上下文無關文法。BNF是「Backus Naur Form」的縮寫。John Backus和Peter Naur首次引入一種形式化符號來描述給定語言的語法。
BNF的元符號:
::= 表示「定義為 」,有的書上用-->
| 表示「或者」
< > 尖括弧用於括起非終結符。
BNF的擴展EBNF:
可選項被括在元符號「[」和「]」中
重復項(零個或者多個)被括在元符號「{」和「}」中
僅一個字元的終結符用引號(")引起來,以和元符號區別開來
上述操作符不是嚴格限定的,有的人喜歡直接使用擴展正則表達式的操作符描述EBNF。除了方便表達以外,引入EBNF的另一個主要原因是為了更緊密地把文法映射到遞歸下降分析程序的真實代碼。當需要手動構造歸下降分析程序的時候,通常把上下文無關文法改寫為EBNF是必需的。
如果一個上下文無關文法G不是自嵌套或自遞歸的,即不存在如下推導:
U =>* xUy
那麼L(G)是正則語言。自嵌套的上下文無關文法不一定是正則語言。事實上,一個上下文無關文法是嚴格的,既不可能由正則文法產生,當且僅當該語言的一切文法都是自嵌套的。
如果一個上下文無關文法G不是自嵌套或自遞歸的,即不存在如下推導:
U =>* xUy
那麼L(G)是正則語言。自嵌套的上下文無關文法不一定是正則語言。事實上,一個上下文無關文法是嚴格的,既不可能由正則文法產生,當且僅當該語言的一切文法都是自嵌套的。
BNF的擴展EBNF:
可選項被括在元符號「[」和「]」中
重復項(零個或者多個)被括在元符號「{」和「}」中
僅一個字元的終結符用引號(")引起來,以和元符號區別開來
上述操作符不是嚴格限定的,有的人喜歡直接使用擴展正則表達式的操作符描述EBNF。除了方便表達以外,引入EBNF的另一個主要原因是為了更緊密地把文法映射到遞歸下降分析程序的真實代碼。當需要手動構造歸下降分析程序的時候,通常把上下文無關文法改寫為EBNF是必需的。
如果一個上下文無關文法G不是自嵌套或自遞歸的,即不存在如下推導:
U =>* xUy
那麼L(G)是正則語言。自嵌套的上下文無關文法不一定是正則語言。事實上,一個上下文無關文法是嚴格的,既不可能由正則文法產生,當且僅當該語言的一切文法都是自嵌套的。
如上所述,上下文無關文法的遞歸性,對其分析方法也有很大影響。首先,用作識別這些結構的演算法必須使用遞歸調用或顯式管理的分析棧。其次,用作表示語言語義結構的數據結構現在也必須是遞歸的(通常是一顆分析樹),而不再是線性的(如同用於詞法和記號中的一樣)了。
在程序設計語言中,通常用正則表達式描述詞法規則。但是正則表示式的表達能力有限,她無法表達括弧配對等語法形式,因而,需要引入表達能力更強的上下文無關文法。編譯程序中常用正則文法表示詞法,用上下文無關文法表示語法。那麼程序語言中那些屬於詞法哪些屬於語法呢?一個簡單的辦法,把所有能用正則文法表示的規則成為詞法,即我們用盡可能的使用正則文法表示更多的東西,那些無法用正則表示式表示的成為句法,如C語言中的{ statement; }語法形式。語言中有些規則使用上下文無關文法仍然無法描述,例如變數的定義在使用之前,類型匹配等等,這些通常稱為(靜態)語義,它們在編譯程序的靜態語義檢查階段進行檢測。
如果一個上下文無關文法G不是自嵌套或自遞歸的,即不存在如下推導:
U =>* xUy
那麼L(G)是正則語言。自嵌套的上下文無關文法不一定是正則語言。事實上,一個上下文無關文法是嚴格的,既不可能由正則文法產生,當且僅當該語言的一切文法都是自嵌套的。
㈢ 誰有百度文庫的下載券幫我下個編譯原理教程課後習題答案——第三章!急急急急!
2.2文法G[N]為
N→D|ND
D→0|1|2|3|4|5|6|7|8|9
G[N]的語言是什麼?
解:G[N]的語言為V+。 V={0,1,2,3,4,5,6,7,8,9}
N=>ND=>NDD. . . .=>NDDDD.. .D=>D. . . . . .D
㈣ 編譯原理教程(第二版)》(胡元義主編,西安電子科技大學出版社出版)課後習題答案
http://cache..com/c?m=13d3c3&p=9f769a448faf09ea08e2977e7f00&user=
㈤ 編譯原理——First集與Follow集
First(A)為A的開始符或者首符號集。
如果兩個A產生式 A -> α | β ,且FIRST(α)和FIRST(β)不相交;
下一個輸入符號是x,若x∈FIRST(α),則選擇 A->a ,若x∈FIRST(β),則選擇 A->b 。
計算FIRST(X)的方法
如果演算法看不懂,那我們來根據演算法來模擬一下!
因為求FIRST集合如果有終結符號會比較好處理,所以我們逆順序進行實施;
應該一看明白了!
Follow(A)指的是在某些句型中緊跟在A右邊的 終結符號 的集合
一步一步來看
2.1 第一次迭代
第一種情況: FOLLOW(T)=FIRST(E')={ + }
第二種情況 : FOLLOW(E')=FOLLOW(E)={ $ }
第一種情況: FOLLOW(T)=FIRST(E')={ + }
第二種情況 : FOLLOW(T)=FOLLOW(E')={ + , $ }
第一種情況: FOLLOW(F)=FIRST(T')={ * }
第二種情況 : FOLLOW(T')=FOLLOW(T)={ + , $ }
第一種情況: FOLLOW(F)=FIRST(T')={ * }
第二種情況 : FOLLOW(F)=FOLLOW(T')={ + , * , $ }
第一種情況 : FOLLOW(E)={ $ , ) }
2.2 第二次迭代
由於我們列出了等值關系,所以只需要再走一次第一次迭代的過程就可以了!
因為主要是FOLLOW可能在變,所以我們只需要找到FOLLOW的等值關系即可
我在上面標出了第一次迭代的FOLLOW的最新版
下面我只要列出更新的即可
2.3 第三次迭代
第三次迭代就會發現 FOLLOW集合 不再發生改變,這時候規則結束,求出FOLLOW集合。
Follow比較容易出錯,出錯的點主要在迭代過程的第二種情況的: A -> αBβ 且FIRST(β)包含ε
我們容易忽略這種情況。
只要把每一次迭代過程都寫在紙上,尤其注重 Follow集合 的等值!
㈥ 高手請進!急問編譯原理:*0((0|1)*|01*0)*1的DFA圖怎麼畫
先畫出NFA 在根據 子集法 求出dfa 參考 《編譯原理》課後習題答案%2B清華大學出版社第二版
中第四章 第一題 第二小題 相似
㈦ 編譯原理 設文法G[S] 求答案!
·消除左遞歸 S→aAS'|∧aAS'
S'→VaAS'|ε對A的產生式提取左因子 A→∧aA' A'→A|ε
· 非終結符合 First Follow
S a∧ #
S』 V ε #
A ∧ #
A『 ∧ #
Select(S→aAS')=a
Select(S→∧aAS')=∧
Select(S'→VaAS')=V
Select(S'→ε)=#
Select(A→∧aA')=∧
Select(A'→A)=∧
Select(A'→ε)=#
符合LL(1)文法
a ∧ V #
S S→aAS' S→∧aAS'
S' S'→VaAS' S'→ε
A A→∧aA'
A' A'→A A'→ε