單選題?(4分)
令文法G[E]為:E->E+T | T ????
? ? ? ? ? ? ? ? ? ? ? ?T->T*F | F
? ? ? ? ? ? ? ? ? ? ? ? F-> (E) | i
句型 F*i+T 的最左素短語是( )
A.F
B.i
C.T
D.F*i
B
短語:
F*i+T、F*i、F、i
素短語:
i
最左素短語:
i
單選題?(4分)
若在C語言程序中出現“aa 11 bb=123;”,且不出現在引號和注釋里,在編譯時會
A.語法分析時報錯
B.語義分析時報錯
C.生成中間代碼時報錯
D.語法分析時報錯
D
單選題?(4分)
活動記錄中靜態鏈的作用是(? )
A.用以實現對非局部名字的訪問
B.用來指向靜態數據區
C.表明過程的嵌套層次
D.建立本過程和主調過程間的聯系
A
嵌套過程語言的程序,內層過程引用非局部量可通過(B )跟蹤外層過程最新活動記錄的位置
A 老SP B 靜態鏈C Previous鏈 D 全局display
靜態鏈的作用是(A)
A.存放過程的直接外層過程最新活動記錄的地址,用以訪問局部數據
B.存放主調過程最新活動記錄的地址,用以建立主被調的聯系
C.存放代碼的返回地址,用以返回主調程序
D.存放靜態數據區的地址,用以訪問靜態數據
表達式(A + B) * (- C - D) 的逆波蘭式是:
A.ABCD+*--
B.AB+CD--*
C.AB+C-D-*
D.AB+-CD-*
C
如果某種程序設計語言設計的程序,其所需數據空間的總量在編譯時是完全確定了的,則最好采用以下哪種存儲分配策略
A.堆式分配策略
B.棧式分配策略
C.靜態分配策略
D.以上都有
C
下面哪種不是自底向上的語法分析文法( ?)。
A.LR(1)
B.SLR(1)
C.LL(K)
D.算符優先法
C
若一個文法是遞歸的,則它產生的句子個數是()
A.無窮個
B.可能有限個,可能無窮個
C.有限個
A
以下關于DFA描述錯誤的是( ? )
A.初態唯一
B.終態唯一
C.轉態轉換函數是單值映射
D.不含標記有空串的轉換弧
B
下面關于編譯方式與解釋方式描述有誤的是(??)
A.編譯方式是先翻譯后執行
B.解釋方式是邊翻譯邊執行
C.在解釋方式下,程序運行時解釋器掌握控制權
D.解釋方式優于編譯方式
D
令文法G[E]為:E->E+T| T
? ? ? ? ?T->T*F| F
? ? ? ? ?F->(E) | i
E+F*(T+i)文法G的一個規范句型,指出這個規范句型的句柄是(? ?)
A.i
B.T
C.T+i
D.F
D
LR分析器的核心部分是一張分析表,這張表包括( ?)
A.預測分析表、轉態轉換表
B.優先關系矩陣、動作表
C.動作表、狀態轉換表
D.內情向量表、符號表
C
局部優化是在什么范圍內進行的優化?
A.過程體
B.函數體
C.基本塊
D.循環體
C
如果文法無二義性,則與規范歸約互為逆過程的是(??)
A.最右歸約
B.最左歸約
C.規范推到
D.最左推導
C
在C語言中,不同過程中的變量名可以相同,這些相同的變量名在符號表中存入同一符號表入口。
錯
遞歸文法的語言是無窮集,程序設計語言的文法通常是遞歸的
對
中間代碼優化的目的是生成更有效的目標代碼,為了追求高效的目標代碼,優化應不計代價。
錯
“遍”是對源程序或源程序的中間結果從頭到尾掃描一次,并做有關加工處理,生成新的中間結果或目標程序。一個編譯程序所分遍數越多越好。
錯
只能用機器語言編寫編譯程序
錯
過程的活動指該過程的一次執行,在任一時刻,一個過程只可能有一個活動活躍著。( )
錯
如果文法中的某個句型,存在不同的推導序列,則該文法就是二義性文法
錯
反例:存在非二義性文法,其某些?句型?有多個推導序列,但所有?句子?只有一個推導樹。
S → A b | B c
A → a
B → a
句型?
S
?的推導序列:
序列 1:
S ? A b
序列 2:
S ? B c
句型?
S
?有兩個不同的推導序列。句子分析:
句子?
a b
?的唯一推導:S ? A b ? a b
句子?
a c
?的唯一推導:S ? B c ? a c
所有句子(如?
a b
、a c
)都只有唯一語法樹,因此文法?非二義性。
句型和句子
句子:僅含終結符的句型
二義性文法的正確定義
一個文法是二義性的,當且僅當存在?至少一個句子(即終結符串),該句子對應:
兩個或更多不同的?最左推導(或等價地,兩個或更多不同的?最右推導),或
兩個或更多不同的?語法樹。
關鍵點:二義性必須針對?句子(終結符串)?定義,而不是針對一般的句型(可能包含非終結符)。
現有文法G[S]: S—>a |b | (T)
? ? ? ? ? ? ? ? ? ? ? ? ? T —>S T’
? ? ? ? ? ? ? ? ? ? ? ? ? T’->*ST’|?
則FOLLOW(S)為:( )
A.{#}
B.{#,)}
C.{#,*,)}
D.{*,)}
C
FIRST(S)={a,b,(}
FIRST(T)=FIRST(S)={a,b,(}
FIRST(T')={*,
}
FOLLOW(S)={#}
?FIRST(T')-
?
?FOLLOW(T)={#,*,)}
FOLLOW(T)={)}
FOLLOW(T')=FOLLOW(T)={)}
非終結符 FOLLOW 集 關鍵步驟說明 S {#,?,)} 1. 開始符號加入?#? [1]
2.?T→ST′加入 *? ?[3] FIRST(T')-
3.??T→ST′,T′??ε 時加入 FOLLOW(T)={)} [4]
T {)} S→(T) 直接加入?)? [2] T′ {)} T→ST′ 末尾加入 FOLLOW(T)={)}? ?[4]
當
T’
推導出 ε 時,產生式T→ST’
等價于T→S
(即T’
“隱身”)。此時,S
在T
中的位置相當于直接處于T
的末尾,因此S
后面的符號(即FOLLOW(T)
)會直接成為T’
后面的符號。
換句話說,T’
作為可空后綴,其后面的符號本質上就是T
后面的符號,因此FOLLOW(T')
與FOLLOW(T)
相同。空符號串在語法分析中對后繼符號集的傳遞作用
間接三元式表示法的特點為( ?)。
A.采用間接碼表,便于優化處理
B.節省存儲空間,不便于表的修改
C.便于優化處理,浪費存儲空間
D.節省存儲空間,不便于優化處理
A
四元式(Quadruples)
- 結構:包含四個字段?
(運算符, 運算對象1, 運算對象2, 結果)
。- 特點:
- 每個四元式獨立存儲運算信息,便于代碼優化(如刪除無用代碼、重新安排計算順序)。
- 需要顯式存儲臨時變量(結果字段),可能導致存儲空間浪費。
- 對應選項:
C. 便于優化處理,浪費存儲空間。三元式(Triples)
- 結構:通過運算對象的位置(編號)引用操作數,不單獨存儲臨時變量,而是通過 “對三元式的引用” 表示中間結果。
- 特點:
- 無需顯式存儲臨時變量,節省存儲空間。
- 若需調整計算順序(如優化時),可能需要大量修改三元式編號的引用,不便于優化。
- 對應選項:
D. 節省存儲空間,不便于優化處理間接三元式(Indirect Triples)
- 結構:在三元式基礎上增加一個 “執行順序表”(間接碼表),通過該表記錄三元式的執行順序,而非直接修改三元式本身。
- 特點:
- 優化時只需調整間接碼表,無需修改三元式,便于優化處理。
- 需額外維護間接碼表,增加了實現復雜度。
- 對應選項:
A. 采用間接碼表,便于優化處理。
正規表達式與正規文法是不同的形式化描述工具,它們之間不存在等價性。
錯
不是所有句型都有規范推導
對
面向人類語言的特點是程序執行效率低,編制效率低,可讀性差
錯