课程设计任务书
题目: IF-ELSE 条件语句的翻译程序设计(简单优先法、输出三地址表
示)
初始条件:
理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进
行设计。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体
要求)
(1) 写出符合给定的语法分析方法的文法及属性文法。
(2) 完成题目要求的中间代码三地址表示的描述。
(3) 写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5) 设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:
1 系统描述(问题域描述);
2 文法及属性文法的描述;
3 语法分析方法描述及语法分析表设计;
4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;
5 编译系统的概要设计;
6 详细的算法描述(流程图或伪代码);
7 软件的测试方法和测试结果;
8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);
9 参考文献(按公开发表的规范书写)。
时间安排:
设计安排一周:周 1、周 2:完成系统分析及设计。
周 3、周 4:完成程序调试及测试。
周 5:撰写课程设计报告。
设计验收安排:设计周的星期五第 1 节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午 10 点。
指导教师签名:
2013 年 月 日
系主任(或责任教师)签名:
2013 年 月 日
IF-ELSE 条件语句的翻译程序设计(简
单优先法、输出三地址表示)
1 系统描述
1.1 题目
IF-ELSE 条件语句的翻译程序设计(简单优先法、输出三地址表示)
1.2.目的
通过设计、编制、调试一个条件语句的语法及语义分析程序,加深对语法及语义分
析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。
1.3.设计内容及步骤
对条件语句: IF 〈布尔表达式〉 THEN 〈赋值语句〉 ELSE 〈赋值语句〉
(1) 按给定的题目写出符合语法分析方法要求的文法和属性文法描述。
(2) 按给定的题目给出语法分析方法的思想及分析表设计。
(3) 按给定的题目给出中间代码序列的结构设计。
(4) 完成相应的词法分析、语法分析和语义分析程序设计。
(5) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
2 文法及属性文法的描述
2.1 文法
文法是用于描述语言的语法结构的形式规则(即语法规则)。这些规则必须是准确
的、易于理解的以及有相当强的描述能力。由这种规则所产生的程序语言应有利于句子
分析和翻译,而且,最好能通过这些规则自动产生有效的语法分析程序。
IF-ELSE 条件语句的文法 G[S]如下所示:
(1) S
-> CM
(2) S
-> TM
(3) M -> begin L end
(4) C
-> if B then
(5) T
-> C M else
其中非终结符 B 为布尔表达式,其文法 G[B]如下:
(1) B
-> B1 or B2
(2) B
-> B1 and B2
(3) B
-> not B1
(4) B
-> ( B1 )
(5) B
-> id1 rop id2
(6) B
-> true
(7) B
-> false
而在文法 G[S]中非终结符 L 表示赋值语句块,其文法 G[L]如下:
(1) L
-> L1 A ;
(2) L
-> A;
(3) A
-> id = M
(4) M
-> E
(5) E
-> E1 + E2
(6) E
-> E1 * E2
(7) E
-> -E1
(8) E -> ( E1 )
(9) E -> id
2.2 属性文法
属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或者非终结符)
配备若干相关的“值”(与文法符号相关的属性)。
在一个属性文法中,对应于每个产生式 A→a 都有一套与之相关联的语义规则,每
规则的形式为:b:=f(c1,c2,…,ck)其中 f 是一个函数,而且或者①b 是 A 的一个综合属
性并且 c1,c2,…,ck 是产生式右边文法符号的属性或者②非终结符既可有综合属性也可
有继属性,文法开始符号的所有继承属性作为属性计算前的初始值[1]。
2.2.1 语义变量和语义动作说明
对于文法 G[L],首先对 id 表示的单词定义一属性 id.name,用做语义变量,用
Lookup(id.name)语义函数审查 id.name 是否出现在符号表中,如在,则返回一指向
该登陆项的指针,否则返回 nil。语义过程 emit 表示输出四元是到输出文件上。语义过
程 newtmp 表示生产一临时变量,每调用一次,生成一新的临时变量。语义变量 E.place,
表示存放 E 值的变量名在符号表的登陆项或一整数码(若此变量时一个临时变量)[2],
2.2.1 给出了翻译赋值语句块到三地址的语义描述。
2.2.1
G[S]的属性文法为:
(1) S
-> CM
{ S.chain := merge(C.chain,M.chain) }
(2) S
-> TM
{ S.chain := merge(T.chain,M.chain) }
(3) M -> begin L end { M.chain := L.chain}
(4) C
-> if B then
{ bakpatch(B.true,nextstat)
(5) T
-> C M else
{
q := nextstat
C.chain := B.false}
emit(‘GOTO’--)
backpatch(C.chain,nextstat)
T.chain := merge(M.chain,q)}
2.2.2
G[B]的属性文法为:
(1) B
-> B1 or B2
{ backpatch(B1.false,B2.codebgin);
B.codebegin := B1.codebegin;
B.true := merge(B1.true,B2.true);
B.false := B2.false}
(2) B
-> B1 and B2
{ backpatch(B1.true,B2.codebegin);
B.codebegin := B1.codebegin;
B.true := B2.true;
B.false := merge(B1.false,B2.false);}
(3) B
-> not B1
{ B.true := B1.false;
B.codebegin := B1.codebegin;
B.false := B1.true;}
(4) B
-> ( B1 )
{ B.true := B1.true;
B.codebegin := B1.codebegin;
B.false := B1.false;}
(5) B
-> id1 rop id2
{ B.true := nextstat;
B.codebegin := nextstat;
B.false := nextstat+1;
emit(‘if’id1.place‘rop’id2.place‘goto’--);
(6) B
-> true
{ B.true := nextstat;
emit(‘goto’--)}
B.codebegin := nextstat;
emit(‘goto’--)}
(7) B
-> false
{ B.false := nextstat;
B.codebegin := nextstat;
emit(‘goto’--)}
其中 nextstat 给出在输出序列中下一三地址式子的序号。emit 过程没调用一次,
nextstat 增加 1
2.2.3 G[L]的属性文法为:
(1) L
-> L1 A ;
{ L.chain := A.chain}
(2) L
-> A;
{ L.chain := A.chain}
(3) A
-> id := M
{ p := lookup(id.name);
if p ≠ nil then
emit(p ‘:=’ E.place);
else error}
(4) M
-> E
{
}
(5) E
-> E1 + E2
{ E.place := newtemp;
emit(E.place ‘:=’E1.place ‘+’ E2.place)}
(6) E
-> E1 * E2
{ E.place := newtemp;
emit(E.place ‘:=’ E1.place ‘*’ E2.palce)}
(7) E
-> -E1
{ E.palce := newtemp;
emit(E.place ‘:=’ ‘minus’E1.place)}
(8) E -> ( E1 )
{ E.place := E1.place }
(9) E -> id (6)A->num { p := lookup(id.name);
if p ≠ nil then
E.palce := p
else error}
3 语法分析方法描述及语法分析表设计
3.1 简单优先法的定义构造及优缺点
3.1.1 简单优先法定义构造
一个文法 G,若它不含产生式,也不含任何右部相同的不同产生式,并且它的任何
符号对(X,Y),或者没有关系,或者存在下述三种关系:=、<、>之一,则称该文法是一
个简单优先文法。
A)X=Y 当且仅当 G 中含有形如 P…XY…的产生式
B)XY 当且仅当 Y 为 G 的终结符,G 中含有形如 P…QR…的产生式,其中 Q,R 为
非终结符,且 Q …X,YFirst(R)
D)对任何 X,若文法开始符号 SX…,则##。[3]
3.1.2 简单优先法的优缺点
优点:准确、规范,技术简单。
缺点:适用的范围小,构造的分析表太大,分析效率较低。
3.2 语法分析
为实现简单优先算法,可以使用工作栈.用以寄存操作数或运算结果.算法的基本思想是:
(1) 置初始状态:S(1):=‘#’, i:=1, j:=1
(2) 若 S(i)与 T(j)无任何关系,则出错停机
(3) 若 S(i)= T(j)或 S(i)〈T(j),则把 T(j)送入 S 栈中,读下一符,转(2)。
(4) 若 S(i)〉T(j),则从 S 栈顶开始往前栈串 Sj1 ,Sj1+1,…,Si
其中 Sj1 为第一个使 Sj1-1〈Sj1 ,然后用 Sj1,Sj1+1,…Si 去查生产式表,
若查到有相同右部的产生式即 U→Sj1,Sj1+1,…Si,则从栈中退掉子串
Sj1,Sj1+1,…Si,并把 U 进栈;然后转(2)。若查不到转出错处理。
(5) 若 T(j)=‘#’,并且 S 栈的内容为# Z(Z 为文法开始符号)则正确停机。否则,出
错停机。
3.3 语法分析表设计
3.3.1 G[S]的优先关系表如表 1:
表 1
G[S] 的优先关系矩阵
begin
L
end
if
B
then else
#
>
S
C
T
S
C
T
M
begin
L
end
if
B
then
else
#
<
<
<
M
=
=
>
>
=
<
<
<
<
>
>
<
=
>
>
>
=
<
=
<
注:表中空白表示无优先关系,分析过程中查找到无优先关系的两个文法符号则表示出
错,下同。
3.3.2 G[B]的优先关系表如表 2:
表 2
G[B] 的优先关系矩阵
id
rop
true
fasle #
B
>
>
B
or
and
not
(
)
id
rop
true
false
or
=
and
not
=
<
<
>
>
(
<
<
)
=
>
>
>
<
<
=
=
>
>
>
>
>
#
>
>
>
<
#
注:表中 id 代表标识符,rop 代表关系运算符,下同。
<
<
<
3.3.2 G[L]的优先关系表如表 3:
表 3
;
L
A
=
G[L] 的优先关系矩阵
:=
id
<
(
)
=
>
>
>
>
>
>
<
=
<
<
<
<
<
>
=
>
<
<
<
<
<
<
<
<
L
A
;
:=
(
)
id
+
-
M
E
*
#
-
<
M
=
+
>
=
*
>
=
E
<
=
=
=
=