- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
试题编译原理
陇东学院
1.(15分)
(a) 字母表( = { ( , ) }上的语言{ ( ), (( )( )), ((( ))), ( )( )( )( )( )}是不是正规语言?为什么?
(b) 正规式 (0 | 1)* 和( (( | 0) 1* )*是否等价,说明理由。
2.(15分)接受文法
S ( A a | b A c | d c | b d a
A ( d
活前缀的DFA见下图。请根据这个DFA来构造该文法的SLR(1)分析表,并说明该文法为什么不是SLR(1)文法。
3.(10分)现有字母表(={ a },写一个和正规式a*等价的上下文无关文法,要求所写的文法既不是LR文法,也不是二义文法。
4.(20分)
(a) 下面的文法定义语言L = { anbncm | m, n ( 1}。写一个语法制导定义,其语义规则的作用是:对不属于语言L的子集L1= { anbncn | n ( 1}的句子,打印出错信息。
S ( D C D ( a D b | a b C ( C c | c
(b) 语句的文法如下:
S ( id := E | if E then S | while E do S | begin S ; S end | break
写一个翻译方案,其语义动作的作用是:若发现break不是出现在循环语句中,及时报告错误。
5.(5分)C程序设计的教材上说,可以用两种形式表示字符串:其一是用字符数组存放一个字符串,另一种是用字符指针指向一个字符串。教材上同时介绍了这两种形式的很多共同点和不同点,但是有一种可能的区别没有介绍。下面是一个包含这两种形式的C程序:
char c1[]=“good!”;
char *c2=“good!”;
main()
{
c1[0]= ‘G’;
printf(“c1=%s\n”, c1);
c2[0]= ‘G’;
printf(“c2=%s\n”, c2);
}
该程序在X86/Linux机器上运行时的信息如下:
c1=Good!
Segmentation fault (core dumped)
请问,出现Segmentation fault的原因是什么?
6.(15分)下面是一个C语言程序:
long f1( i )
long i;
{
return(i*10);
}
long f2(long i)
{
return(i*10);
}
main()
{
printf(“f1 = %d, f2 = %d\n”, f1(10.0), f2(10.0) );
}
其中函数f1和f2仅形式参数的描述方式不一样。该程序在X86/Linux机器上的运行结果如下:
f1 = 0, f2 = 100
请解释为什么用同样的实在参数调用这两个函数的结果不一样。
7.(10分)下面是一个C语言程序和在X86/Linux机器上编译(未使用优化)该程序得到的汇编代码(为便于理解,略去了和讨论本问题无关的部分,并改动了一个地方)。
(a) 为什么会出现一条指令前有多个标号的情况,如.L2和.L4,还有.L5、.L3和.L1?从控制流语句的中间代码结构加以解释。
(b) 每个函数都有这样的标号.L1,它的作用是什么,为什么本函数没有引用该标号的地方?
main()
{
long i,j;
if ( j )
i++;
else
while ( i ) j++;
}
main:
pushl %ebp ――将老的基地址指针压栈
movl %esp,%ebp ――将当前栈顶指针作为基地址指针
subl $8,%esp ――为局部变量分配空间
cmpl $0,-8(%ebp)
je .L2
incl -4(%ebp)
jmp .L3
.L2:
.L4:
cmpl $0,-4(%ebp)
jne .L6
jmp .L5
.L6:
incl -8(%ebp)
jmp .L4
.L5:
.L3:
.L1:
leave ――和下一条指令一起完成恢复老的基地址指针,将栈顶
ret ――指针恢复到调用前参数压栈后的位置,并返回调用者
8.(10分)cc是UNIX系统上C语言编译命令,(l是连接库函数的选择项。两个程序员分别编写了函数库libuser1.a和libuser2.a。当用命令
cc test.c (luser1.a (luser2.a
编译时,报告有重复定义的符号。(备注:库名中的lib在命令中省略。该命令和命令cc test.c libuser1.a libuser2.a的效果是一致的)。而改用命令
cc test.c (lus
文档评论(0)