编译原理实验指导书
一、目的
《编译原理》是一门实践性较强的软件基础课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据编译程序的一般原理和基本方法,通过具体语言的编译程序的编写,掌握编译程序的主要实现技术,并养成良好的程序设计技能。
二、要求
通过这次设计,要求在词法分析,语法分析和语义分析等方面加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
三、内容
对一个C语言的子集(即简化后的C语言)编制一个编译程序,编程工具不限(C/VC++/Java/VB/Delphi等)。主要包括以下步骤:
1.词法分析
设计、编制并调试该C语言子集的词法分析程序,要求显示二元组形式的结果。
2.语法分析
编制一个语法分析程序,分析方法不限,实现对词法分析程序所提供的单词序列进行语法检查和结构分析。
3.语义分析
采用语法制导翻译原理,将语法分析所识别的语法成分变换成四元式形式的中间代码序列,要求显示中间代码结果。
四、成绩评定
平时表现:30% 上机演示:40% 设计报告:30%
五、时间分配
第三学年暑期
日 期 安 排 |
实 验 内 容 |
备 注 |
第1天 |
明确题目要求、确定实现方法等 |
|
第2-3天 |
完成程序编制 |
|
第4天 |
上机演示,回答教师提问,准备书写实验报告 |
实验报告包括总体描述、算法思想描述及程序框图、程序运行情况、使用说明,实习体会心得等;最后将以上文字材料及程序装订。 |
六、参考资料
《编译原理》 吕映芝等 清华大学出版社
《程序设计语言编译原理》 陈火旺等 国防工业出版社
《编译原理》 何炎祥 华中理工大学出版社
七、附录
1.待分析的C语言的子集文法
(1) <程序>→main()<语句块>
(2) <语句块>→{<语句串>}
(3) <语句串>→ε|<语句>;<语句串>
(4) <语句> →<赋值语句>|<条件语句>
(5) <赋值语句> →ID=<表达式>
(6) <条件语句>→if (<条件>) <语句块>
(7) <条件>→<表达式><关系运算符><表达式>
(8) <表达式>→<项>|<表达式>+<项>|<表达式>-<项>
(9) <项>→<因子>|<项>*<因子>|<项>/<因子>
(10) <因子>→ID|NUM|(<表达式>)
(11) <关系运算符>→< | <= | > | >= | == | !=
注:该文法省略了变量说明部分,即标志符可以不经定义而直接使用。
2.待分析的C语言的子集词法
a.关键字
main if while
注:关键字必须小写
b..运算符和界符
= + - * / < <= > >= == != ; { } ( )
c.标志符ID和常数NUM
通过以下正规式定义其他标记:
ID→letter(letter|digit)*
NUM→digit digit*
letter→a|…|z|A|…|Z
digit→0|…|9
d.空格由空白、制表符和换行符组成
空格一般用来分隔ID、NUM、专用符号和关键字,词法分析阶段常常被忽略。
e.各种单词符号对应的种别码
单词符号 |
种别码 |
单词符号 |
种别码 |
main |
1 |
) |
27 |
if |
2 |
{ |
28 |
ID |
10 |
} |
29 |
NUM |
20 |
; |
30 |
= |
21 |
> |
31 |
+ |
22 |
< |
32 |
- |
23 |
>= |
33 |
* |
24 |
<= |
34 |
/ |
25 |
!= |
35 |
( |
26 |
== |
36 |
3.输出的四元式举例
对于程序:
main(){
i=2*3+4;
if (i>10) {j=3;};
}
输出的四元式序列如下:
(1) (*, 2, 3, T1)
(2) (+, T1, 4, T2)
(3) (=, T2, , i)
(4) (j>, i, 10, 6)
(5) (j, , , 7)
(6) (=, 3, , j)
(7) …