题目:简单的编译器设计
专业:计算机科学与技术
班级:计科 06-1
姓名:
学号:
主要内容
本程序整合了 C,C++,VB 等一些编译语言的思想,能够实现对 integer
和 real 的四则运算以及相应的赋值语句,条件语句和循环语句,其中以递
归的思想实现了词法分析,语法分析和语义分析,最终结果使用四元式输
出。
基本要求
写出符合分析方法要求的文法,给出分析方法的思想,完成分析程
序设计;编制好分析程序后,设计若干用例,上机测试并通过所设计的分
析程序。
主要参考资料
1 程序设计语言编译原理(第 3 版)陈火旺 刘春林 谭庆平 赵克佳 刘
越 编著 国防工业出版社
2008 年 6 月
2 C 程序设计(第三版)谭浩强编著
清华大学出版社
2005
年 7 月
3 上网查了一些资料
完 成 期 限:2009.6.15-2009.6.19
指导教师签名:
课程负责人签名:
2009 年 6 月 15 日
郑州轻工业学院本科
编译原理课程设计总结报告
设计题目:简单编译器的设计
学生姓名:
系
专
班
学
别:计算机与通信工程学院
业:计算机科学与技术
级:计科 06-1
号:
指导教师:韩丽
2009 年 6 月 19 日
一.运行环境(软、硬件环境)
软件:Microsoft Visual C++ 6.0,
Microsoft Office Word 2007
Microsoft Office Excel 2007,Microsoft Office Visio 2007
硬件:处理器 AMD Athlon(tm) 64 X2 Dual Core Processor 4000+显卡
NVIDIA GeForce 6100 nForce 400
二 算法设计思想(包含主程序的示意图)
a) 关键字
"program","var","procedure","begin","end","if","then","else","wh
ile","do","integer","real"(12个)
b) 运算符和界符
+
,
c) 标识符(ID)和常量(NUM),通过以下正规式定义:
ID = letter (letter | digit | _)*
NUM = (-)*digit (digit | . )*
d) 种别码
<=
<>
.
:=
=>
>=
-
*
/
:
;
<
种别码
单词符号
备注
种别码
单词符号
备注
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
program
var
procedure
变量定义
过程
begin
end
if
then
else
while
do
integer
real
ID
NUM
+
-
标识符(变量)
常量
定义变量
赋值号
17
18
19
20
21
22
23
24
25
26
27
28
29
*
/
:
,
.
:=
;
<
<=
<>
=
>
>=
e) 语法分析方法及中间代码形式的描述、文法和属性文法的设计
用扩充的 BNF 表示简单的语法如下:
<程序>::=program ID;<语句串>end.
<语句串>::=<语句>{;<语句>}
<语句>::=<赋值语句>|<关系运算语句>
<赋值语句>::=ID:=<表达式>
<条件语句>::=<关系运算语句>{<赋值语句>|<条件语句>|<循
环语句>|}
<循环语句>::=<关系运算语句>{<赋值语句>|<条件语句>|<
循环语句>|}
<表达式>::=<项>{+ <项> | - <项>}
<项>::=<因子>{* <因子> | / <因子>}
<因子>::=ID | NUM |(<表达式>)
::=<字母>{字母|数字|下划线}
::={负号}<数字>{数字|小数点}
ID = letter (letter | digit | _)*
NUM = (-)*digit (digit | . )*
构造赋值语句语法树的语法制导定义:
S id := E {p := lookup(id.name);if p nil then
emit ( p,
‘:=’, E.place)else error }
E E1 + E2{E.place := newtemp;emit (E.place, ‘:=’, E1.place, ‘+’,
E2.place) }
E E1 {E.place := newtemp;emit (E.place, ‘:=’, ‘-’, E1.place) }
E (E1) {E.place := E1.place }
E ID
error }
{p := lookup(id.name);if p nil then E.place := p else
构造条件语句语法树的语法制导定义:
S if E then S1 else S2
{E.true := newlabel;
E.false := newlabel;
S1.next := S.next;
S2.next := S.next;
E.code
S.code
:=
||
S1.code
gen(‘goto’, S.next) || gen(E.false, ‘:’) || S2.code}
gen(E.true, ‘ : ’ )
||
||
构造循环语句语法树的语法制导定义:
S while E do S1
{S.begin:= newlabel;
E.true := newlabel;
E.false := S.next;
S1.next := S.begin;
S.code := gen(S.begin, ‘:’) || E.code ||
gen(E.true, ‘:’) || S1.code || gen(‘goto’, S.begin) }
四元式形式:
(:=,NUM,-,ID)表示赋值语句 ID:=NUM;
(rop,op1,op2,T) 表示运算语句 T=op1 rop op2,其中 rop 为四种运算符;
(j,-,-,p) 表示无条件转移语句 goto p;
(jrop,x,y,p) 表示判断语句 if x rop y goto p,其中 rop 为六种关系运
算符。
f) 主要语句和函数的功能
struct{
char name[8];
int address;
}vartable[maxvartablep];//符号表,用来记录变量
struct
{
char op[10];
char argv1[10];
char argv2[10];
char result[10];
}pQuad[maxvartablep];//四元式
void gen(char *op,char *argv1,char *argv2,char *result)//生成四元
式
char* Newtemp()//产生新的临时变量
void enter(char *name)//用来把变量 name 填入到符号表中
void lookup(char *name)//检查是否在符号表中存在相应此名字的入口
void printQuaternion()//打印四元式
g) 主要函数的流程图