1、- 1 -编译原理复习例题(有些内容没有覆盖,比如优化、SLR(1) 、LR(1) 、LALR(1)等。但要求至少要按照作业题的范围复习。)一 选择题1编译的各阶段工作都涉及 。A词法分析 B表格管理 C语法分析 D语义分析2 型文法也称为正规文法。A 0 B 1 C 2 D 33 文法不是 LL(1)的。A递归 B右递归 C2 型 D含有公共左因子的4文法 EE+E|E*E|i 的句子 i*i+i*i 有 棵不同的语法树。A 1 B 3 C 5 D 75文法 SaaS|abc 定义的语言是 。Aa2kbc|k0 Bakbc|k0 Ca2k-1bc|k0 Dakakbc|k06若B为非终结符,
2、则 A.B 为 。A移进项目 B归约项目 C接受项目 D待约项目7同心集合并可能会产生新的 冲突。A二义 B移进/移进 C移进/ 归约 D归约/ 归约8代码优化时所依据的是 。A语法规则 B词法规则 C等价变换规则 D语义规则9表达式 a-(-b)*c 的逆波兰表示(为单目减)为 。Aa-bc* Babc*- Cab- Dabc-*10过程的 DISPLAY 表是用于存取过程的 。A非局部变量 B嵌套层次 C返回地址 D入口地址- 2 -二 填空题1词法分析阶段的任务式从左到右扫描 ,从而逐个识别 。2对于文法 GE:ET|E+T TF|T*F FPF|P P(E)|i,句型 T+T*F+i
3、的句柄是 。3最右推导的逆过程称为 ,也称为 。4符号表的每一项是由名字栏和 两个栏目组成。在目标代码生成阶段,符号表是 的依据。三 判断题(认为正确的填“T”,错的填“F”)【 】1同心集的合并有可能产生“归约/归约”冲突。【 】2一个文法所有句子的集合构成该文法定义的语言。【 】3非终结符可以有综合属性,但不能有继承属性。【 】4逆波兰表示法表示表达式时无需使用括号。【 】5一个有穷自动机有且只有一个终态。【 】6若过程 p 第 k 次被调用,则 p 的 DISPLAY 表中就有k+1 个元素。四 解答题1给定文法 G 和句型(T+F)*i+T, G: E E+T | T TT*F | F
4、 F(E) | i(1)画出句型的语法树;(2)写出句型的全部短语、简单短语和句柄。解:(略)2设有文法 G:SS+S|S*S|i|(S)。(1)对于输入串 i+i*i 给出一个最左推导;(2)该文法是否是二义性文法?请证明你的结论。解:(1)i+i*i 的最左推导:S = S+S = i+S = i+S*S = i+i*S = i+i*i (2)该文法是二义性的。因为对于句子 i+i*i 可以画出两棵语法树(语法树略) 。3给出语言a mbmcn|m1,n0的上下文无关文法(2 型) 。- 3 -解: G: SAB|AAaAb|abBcB|c4给出语言a kbmcn|k,m,n1的正规文法(
5、3 型) 。解: G: AaA|aBBbB|bCCcC|c5将文法 G 改写成等价的正规文法(3 型) 。G: SdABAaA|aBbB|b解: G: SdAAaA|aBBbB|b6构造一文法产生任意长的 a,b 串,使得|a|b|2|a|其中, “|a|”和“|b|”分别表示串中的字符 a 和 b 的个数。解:b 的个数在 a 的个数和其 2 倍之间,串的结构形如 aSBS 和BSaS,其中 B 为 1 或 2 个 b。故得文法G: SaSBS|BSaS|Bb|bb7设有字母表a,b上的正规式 R=(ab|a)*。(1)构造 R 的相应有限自动机;解:0 123baa - +(2)构造 R
6、的相应确定有限自动机;解:将(1)所得的非确定有限自动机确定化 a b-0 11 3 122 1+3a b- 4 -+013 123+123 123 13+13 1230 12aaba-+(3)构造 R 的相应最小确定有限自动机;解:对(2)得到的 DFA 化简,合并状态 0 和 2 为状态 2:12aab-+(4)构造与 R 等价的正规文法解:令状态 1 和 2 分别对应非终结符 B 和 AG: A aB|a|B aB|bA|a|b|可化简为:G: A aB|B aB|bA|8写出如图所示的自动机描述的语言的正规式1 324baba b- +0 aa+解:abb*|abb*aa*b|aaa*
7、b9写出在a,b上,不以 a 开头,但以 aa 结尾的字符串集合的正规式(并构造与之等价的最简 DFA) 。解:依题意, “不以 a 开头” ,则必以 b 开头,又要“以 aa 结尾”,故正规式为:b(a|b)*aa(构造与之等价的最简 DFA,此略)10写一个 LL(1)文法 G,使其语言是- 5 -L(G)= ambnc2n | m=0,n0 并证明文法是 LL(1)。解:文法 G(S):S aS | EE bEE Ecc | ccSelect(S aS)Select (S E)= Select(E Ecc)Select (E cc) =故文法为 LL(1)的11将文法 G 改写成等价的
8、LL(1)文法,并构造预测分析表。G: SS*aT|aT|*aTT+aT|+a(编写递归下降子程序)解:消除左递归后的文法 G: SaTS|*aTSS *aTS|T+aT|+a提取左公因子得文法 G:SaTS|*aTSS *aTS|T+aTT T|Select(SaTS)=aSelect(S*aTS)=*Select(SaTS)Select(S*aTS)=Select(S*aTS)=*Select(S)=Follow(s)=#Select(S*aTS)Select(S)= Select(T+aT)=+Select(TT)=First(T) =+Select(T )=Follow(T)=*,#S
9、elect(TT)Select(T )= 所以该文法是 LL(1)文法。预测分析表:* + a #S STa, N TST, NS STa, N , PT Ta, NT , P T, P , Pa , N# OK(递归下降子程序,略)12对文法 GS: S aSb | PP bPc | bQcQ Qa | a- 6 -构造简单优先关系表。该文法是否是简单优先文法?解:简单优先关系矩阵如下:S a b P Q cS =a = b = = =Q = =c 由于矩阵中有元素存在多种优先关系,故不是简单优先文法。13考虑文法 G: S AS | bA SA | a(1)构造文法的可归前缀图(活前缀的
10、DFA) ;(2)判断文法是否是 LR(0)文法,并说明理由。解:(1)可归前缀图 I0:S. .A S.b . A.a I1:S. A. .S .a S.AS .b I2:Aa. I3:Sb. I4:SA.S . S.b A. .a I5:AS. . .a S.AS .b I6:SA. . .S A.a S.S .b I7:AS. S. .S S.b A. .a S bSaAabA AabSabS A baASSAba(2)因为存在冲突,所以不是 LR(0)文法。14 文法 G 及其 LR 分析表如下,请给出对串 dada#的分析过程。G: S VdB V e V B a - 7 -B Bd
11、a B ACTION GOTO状态d e a # S B V0 r3 S3 1 21 acc 2 S4 3 r2 4 r6 S5 r6 6 5 r4 r4 6 S7 r1 7 S8 8 r5 r5 解:对输入串 dada#的分析过程步骤 状态栈 符号栈 剩余输入符号 动作1234567890020240245024602467024678024601#V#Vd#Vda#VdB#VdBd#VdBda#VdB#Sdada#dada#ada#da#da#a#用 V 归约移进移进用 B a 归约移进移进用 B Bda 归约用 S VdB 归约接受15对传值、传地址和传名 3 种参数传递方法分别写出下列
12、程序的输出:void p(int x, int y, int z) y *= 3;z += x;void main() int a=5, b=2;p(a*b,a,a);printf(“%dn”, a);这些参数传递机制如何实现?解:(1)传值 5; (2)传地址 25; (3)传名 45(参数传递机制,略)16将下面程序划分为基本块,并画出其程序流图。b := 1- 8 -b := 2if w = x goto L2e := bgoto L2L1:goto L3L2:c := 3b := 4c := 6L3:if y = z goto L4haltL4:g := g + 1h := 8goto L1解:(1)基本块: (2)程序流图b := 1b := 2if w = x goto L2 (1)e := bgoto L2 (2)L1: goto L3 (3)L2: c := 3b := 4c := 6 (4)L3: if y = z goto L4 (5)halt (6)L4: g := g + 1h := 8goto L1 (7)1423765