学 号:
01
课 程 设 计
题 目
学 院
专 业
班 级
姓 名
指导教师
DO-WHILE 循环语句的翻译程序设计
(LR 方法、输出四元式)
计算机
计算机科学
高 曙
2012 年 1 月 4 日
武汉理工大学《编译原理》课程设计说明书
课程设计任务书
学生姓名:
专业班级:
指导教师: 高 曙
工作单位:计算机科学与技术学院
题目: DO-WHILE 循环语句的翻译程序设计(LR 方法、输出四元式)
初始条件:
理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在
其上进行设计。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
(1) 写出符合给定的语法分析方法的文法及属性文法。
(2) 完成题目要求的中间代码四元式的描述。
(3) 写出给定的语法分析方法的思想,完成语法分析和语义分析程序
设计。
(4) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分
析程序。
(5) 设计报告格式按附件要求书写。课程设计报告书正文的内容应包
括:
1 系统描述(问题域描述);
2 文法及属性文法的描述;
3 语法分析方法描述及语法分析表设计;
4 按给定的题目给出中间代码形式的描述及中间代码序列的结
构设计;
5 编译系统的概要设计;
6 详细的算法描述(流程图或伪代码);
7 软件的测试方法和测试结果;
8 研制报告(研制过程,本设计的评价、特点、不足、体会等);
9 参考文献(按公开发表的规范书写)。
时间安排:
设计安排一周:周 1、周 2:完成系统分析及设计。
周 3、周 4:完成程序调试及测试。
周 5:撰写课程设计报告。
设计验收安排:设计周的星期五第 1 节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午 10 点。
指导教师签名:
2011 年 12 月 23 日
系主任(或责任教师)签名:
2011 年 12 月 23 日
第 2 页 共 20 页
武汉理工大学《编译原理》课程设计说明书
1 要求完成的主要任务
(1) 写出符合给定的语法分析方法的文法及属性文法。
(2) 完成题目要求的中间代码四元式的描述。
(3) 写出给定的语法分析方法的思想,完成语法分析和语义分析程序
设计。
(4) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分
析程序。
2 文法的描述
本程序所用的文法如下:
1)S'-->S
2)S-->do A while B
3)A-->{F}
4)F-->M
5)F-->FM
6)M-->id=E;
7)E-->E+id
8)E-->E-id
9)E-->E*id
10)E-->E/id
11)E->id|常数
12)E-->(E)
13)B-->(EOE)
14)O--><|<=|>|>=|!=
//M 为一个赋值表达式
//防止循环体中有多个赋值语句
3.语法分析方法描述及语法分析表设计
3.1 语法分析方法描述
本实验采用 LR 分析方法对 DO-WHILE 语句进行语法分析。LR 分析法是一种能
根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入串的 K 个
(K>=0)符号就能惟一的确定分析器的动作是移进还是归约和用哪个产生式归
约,因而也就能惟一的确定句柄。LR 分析法的归约过程是规范推导的逆过程,
第 3 页 共 20 页
武汉理工大学《编译原理》课程设计说明书
所以 LR 分析过程是一种规范过程。
一个 LR 分析器由 3 个部分组成:
总控程序,也可以称为驱动程序。对所有的 LR 分析器,总控程序是相同的。
分析表或分析函数。不同的方法分析表将不同,同一个方法采用的 LR 分析器不
同时,分析表也不同,分析表表又可以分为动作(ACTION)表和状态转换(GOTO)
表两个部分,它们都可以用二维数组表示。
分析栈,包括文法符号栈和相应的状态栈。它们均是先进后出栈。
分析器的动作由栈顶状态和当前输入符号所决定。
LR 分析器工作过程示意图如图所示:
SP
Sn
.
.
S1
S0
Xn
.
.
X1
#
输入串 XXX…#
总控程序
输出
ACTION
表
GOTO
表
其中 SP 为栈顶指针,S[i]为状态栈,X[i]为文法符号栈。状态转换表内容按关系
GOTO[Si,X]=Sj 确定,改关系式是指当前栈顶状态为 Si 遇到当前文法符号为 X
时应转向状态 Sj。X 为终结符或非终结符。
ACTION[Si,a]规定了栈顶状态为 Sj 时遇到输入符号 c[i]应该执行的动作。动作有
以下四种可能:
移进:当 Sj=GOTO[Si,a]成立,则把 Sj 移入到文法符号栈。其中 i,j 表示状态
号。
规约:当在栈顶形成句柄为 b 时,则用 b 归约为相应的非终结符 A,即当文法中
有 A->b 的产生式,而 b 的长度为 r,则从状态栈和文法符号栈中自栈顶向下去
掉 r 个符号。并把 A 移入文法符号栈内,再把满足 Sj=GOTO[Si,A]的状态移进
状态栈,其中 Si 为修改指针后的栈顶状态。
接受 acc:当归约到文法符号栈中只剩下文法的开始符号 S 时,并且输入符号串
已结束即当前输入符是‘#’,则为分析成功。
报错:当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明
输入串不是该分发能接受的句子。
3.2 语法分析表设计
第 4 页 共 20 页
武汉理工大学《编译原理》课程设计说明书
3.2.1 构造文法的 DFA
I0: S'-->·S, S-->·do A while B
I1: S'-->S·
I2: S-->do· A while B, A-->·{F}
I3: S-->do A ·while B
I4: S-->do A while· B, B-->·(EOE)
I5: A-->{·F} ,F-->·M,F-->·FM, M-->·id=E;
I6: A-->{F·},F-->F·M, M-->·id=E
I7: A-->{F}·
I8: F-->FM·
I9: F-->M·
I10: M-->id·=E;
I11: M-->id=·E;,E-->·E+id ,E-->·E-id,E-->·E*id,E-->·E/id,E->·id|
常数,E-->·(E)
I12: E->id·|常数
I13: M-->id=E·; ,E-->E·+id ,E-->E·-id,E-->E·*id,E-->E·/id
I14: M-->id=E; ·
I15: E-->E+·id
I16: E-->E-·id
I17: E-->E*·id
I18: E-->E/·id
I19: E-->E+id·
I20: E-->E-id·
I21: E-->E*id·
I22: E-->E/id·
I23:B-->(·EOE),E-->·E+id ,E-->·E-id,E-->·E*id,E-->·E/id,E->·id|
常数,E-->·(E)
I24: B-->(E·OE), O-->·<
I25: O--><·
I26: B-->(EO·E) E-->·E+id ,E-->·E-id,E-->·E*id,E-->·E/id,E->·id|
常数,E-->·(E)
I27: B-->(EOE·)
I28: B-->(EOE)·
第 5 页 共 20 页
武汉理工大学《编译原理》课程设计说明书
A
while
I3
I23
(
I4
I25
id
I23
B
id
I24
<
O
I26
id
I27
+,-,;
I19
I20
I14
+,-,;
*,/
*,/
=,+,-,*,/,;
I21
)
I28
#
Id,}
;
id
id
id
I2
{
do
I1
S
I0
I5
id
F
=
I10
id
I6
Id,}
I8
M
}
I12
Id,}
while
I9
I7
E
id
=,+,-,*,/,;
I13
I11
/
+
-
*
I15
I16
I17
=,+,-,*,/,;
I18
id
I22
3.2.2 然后写出 LR 分析表
第 6 页 共 20 页
武汉理工大学《编译原理》课程设计说明书
4.中间代码形式的描述及中间代码序列的结
构设计
4.1 中间代码形式的描述
在本程序中作用四元式表示中间代码
三地址码的表达形式为:
地址
(
操作符
操作数 1 操作数 2 结果
)
常见四元式表示举例:
赋值语句
5,
条件转移 if true goto Label
(:=,
,
n)
第 7 页 共 20 页
武汉理工大学《编译原理》课程设计说明书
无条件转移 goto Label
…
5.编译系统的概要设计
本编译程序的结构图如下:
源程序(do-while 语句)
词法分析(Lex 函数)
语法语义分析 (Analyze 函数)
代码生成程序
程序输出
说明:源程序(do-while 语句)通过控制台输入。然后通过 Lex 函数对输入的源
程序进行分析后,将分析结果以二元组的方式输出到控制台。接下来通过调用语
法语义分析函数来完成对分析得到的单词进行文法句子的识别,并用进行语法制
导翻译,完成属性文法定义规定的相关语义动作。本编译程序最后完成的三地址
码输出是通过中间文件间接输出到控制台上的。在执行 Analyze 函数的过程中,
同时运用 ofstream 文件流将三地址码输出到一个 ASCII 码的 txt 类型文件中,最
后从该文件中读出最终处理的三地址码输出至控制台。
6.详细的算法描述
6.1 主函数
//主函数
int main()
第 8 页 共 20 页