logo资料库

编译原理课程设计之编译器.doc

第1页 / 共33页
第2页 / 共33页
第3页 / 共33页
第4页 / 共33页
第5页 / 共33页
第6页 / 共33页
第7页 / 共33页
第8页 / 共33页
资料共33页,剩余部分请下载后查看
题目:简单的编译器设计 专业:计算机科学与技术 班级:计科 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) 主要函数的流程图
分享到:
收藏