资源描述:
《试题编译原理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、陇东学院1.(15分)(a)字母表S={(,)}上的语言{(),(()()),((())),()()()()()}是不是正规语言?为什么?(b)正规式(0
2、1)*和((e
3、0)1*)*是否等价,说明理由。2.(15分)接受文法S®Aa
4、bAc
5、dc
6、bdaA®dS’®.SS®.AaS®.bAcS®.dcS®.bdaA®.dI0S®b.AcS®b.daA®.dI3daS®d.cA®d.I4AS’®S.I1SS®A.aI2AS®Aa.I5bS®bA.cI6dS®dc.I8S®bd.aA®d.I7cS®bAc.I9S®bda.
7、I10ca活前缀的DFA见下图。请根据这个DFA来构造该文法的SLR(1)分析表,并说明该文法为什么不是SLR(1)文法。3.(10分)现有字母表S={a},写一个和正规式a*等价的上下文无关文法,要求所写的文法既不是LR文法,也不是二义文法。4.(20分)(a)下面的文法定义语言L={anbncm
8、m,n³1}。写一个语法制导定义,其语义规则的作用是:对不属于语言L的子集L1={anbncn
9、n³1}的句子,打印出错信息。S®DCD®aDb
10、abC®Cc
11、c(b)语句的文法如下:S®id:=E
12、ifEthenS
13、whi
14、leEdoS
15、beginS;Send
16、break写一个翻译方案,其语义动作的作用是:若发现break不是出现在循环语句中,及时报告错误。5.(5分)C程序设计的教材上说,可以用两种形式表示字符串:其一是用字符数组存放一个字符串,另一种是用字符指针指向一个字符串。教材上同时介绍了这两种形式的很多共同点和不同点,但是有一种可能的区别没有介绍。下面是一个包含这两种形式的C程序:charc1[]=“good!”;char*c2=“good!”;main(){c1[0]=‘G’;printf(“c1=%s”,c1);c2[0]
17、=‘G’;printf(“c2=%s”,c2);}该程序在X86/Linux机器上运行时的信息如下:c1=Good!Segmentationfault(coredumped)请问,出现Segmentationfault的原因是什么?6.(15分)下面是一个C语言程序:longf1(i)longi;{return(i*10);}longf2(longi){return(i*10);}main(){printf(“f1=%d,f2=%d”,f1(10.0),f2(10.0));}其中函数f1和f2仅形式参数的描述方式
18、不一样。该程序在X86/Linux机器上的运行结果如下:f1=0,f2=100请解释为什么用同样的实在参数调用这两个函数的结果不一样。7.(10分)下面是一个C语言程序和在X86/Linux机器上编译(未使用优化)该程序得到的汇编代码(为便于理解,略去了和讨论本问题无关的部分,并改动了一个地方)。(a)为什么会出现一条指令前有多个标号的情况,如.L2和.L4,还有.L5、.L3和.L1?从控制流语句的中间代码结构加以解释。(b)每个函数都有这样的标号.L1,它的作用是什么,为什么本函数没有引用该标号的地方?main(){
19、longi,j;if(j)i++;elsewhile(i)j++;}main:pushl%ebp――将老的基地址指针压栈movl%esp,%ebp――将当前栈顶指针作为基地址指针subl$8,%esp――为局部变量分配空间cmpl$0,-8(%ebp)je.L2incl-4(%ebp)jmp.L3.L2:.L4:cmpl$0,-4(%ebp)jne.L6jmp.L5.L6:incl-8(%ebp)jmp.L4.L5:.L3:.L1:leave――和下一条指令一起完成恢复老的基地址指针,将栈顶ret――指针恢复到调用前参数
20、压栈后的位置,并返回调用者8.(10分)cc是UNIX系统上C语言编译命令,-l是连接库函数的选择项。两个程序员分别编写了函数库libuser1.a和libuser2.a。当用命令cctest.c-luser1.a-luser2.a编译时,报告有重复定义的符号。(备注:库名中的lib在命令中省略。该命令和命令cctest.clibuser1.alibuser2.a的效果是一致的)。而改用命令cctest.c-luser2.a-luser1.a时,能得到可执行程序。试分析原因。编译原理和技术试题参考答案1.(a)语言{()
21、,(()()),((())),()()()()()}是正规语言,因为该语言只包括有限个句子,它可以用正规式定义如下:()
22、(()())
23、((()))
24、()()()()()(b)我们分析正规式((e
25、0)1*)*表示的语言。可以看出正规式(e
26、0)1*描述的语言是集合{e,1,11,111,…,0,01,011,011