试题编译原理.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

cgtk187 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档