编译原理-几个练习题

  • 目录 {:toc}
1
2
3
4
5
6
7
8
9
10
1. 给定如下的正则表达式

(a|b)(c|d)*

1)使用Thompson算法将其转换成NFA;

2)使用子集构造算法将NFA转换成DFA;

3)使用Hopcroft算法将上述DFA最小化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2. 对于下述的两个上下文无关文法:

(第一个文法)

E -> n + E

| n

(第二个文法)

E -> E + n

| n

问题:

简要说明为什么上述两个文法产生的语言是一样的;

哪个文法可以用LL(1)分析;为什么?

哪个文法可以用LR(1)分析;为什么?

用LR分析法,对这两个文法的分析效率哪个高?为什么?

1
2
3
4
5
6
7
3. 在C语言中,函数在使用前必须声明其原型;
而在Java中,调用其它类中的方法不需要提前进行原型的声明。
这两种不同的规定,对语义检查器有什么影响?



4. 在类型检查前就进行编译优化会有什么问题?请简单解释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
5. 考虑如下两种不同结合性的表达式:

(第一种)

((k1+k2)+...+kn-1)+kn

(第二种)

k1+(k2+...(kn-1 + kn))

对栈式计算机生成代码的话,哪种表达式会消耗更多的操作数栈的空间。简要解释你的结论。

6. 你学习本课程有何收获?对本课程有什么意见建议?对下轮授课有何期待?请提出你的建议。
【任何答案,除非没有作答,都将得到满分。】

整个课程所写的代码 https://github.com/noname007/mooc163-compiler


编译原理-几个练习题
http://blog.soul11201.com/2017/05/15/compilers-homework/
作者
soul11201
发布于
2017年5月15日
许可协议