版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、山东建筑大学计算机科学与技术学院课程设计说明书题 目: 对PL/0语言及其编译器进行扩充和修改 实现增加数据类型的功能课 程: 编译原理课程设计院 (部): 计算机科学与技术学院专 业: 计算机科学与技术班 级: 计科学生姓名: 学 号: 指导教师: 完成日期: 2014年7月8日山东建筑大学计算机学院课程设计说明书目 录课程设计任务书II对PL/0语言及其编译器进行扩充和修改实现增加数据类型的功能3一、问题描述3二、基本要求4三、算法思想4四、数据结构4五、模块划分5六、源程序5七、测试数据15八、测试情况17结 论18参考文献19课程设计指导教师评语20I山东建筑大学计算机学院课程设计说明
2、书山东建筑大学计算机科学与技术学院课程设计任务书设计题目对PL/0语言及其编译器进行扩充和修改实现增加数据类型的功能已知技术参数和设计要求PL/0程序设计语言是一个较简单的语言,它以赋值语句为基础,构造概念有顺序、条件和重复(循环)三种。PL/0有子程序概念,包括过程定义(可以嵌套)与调用且有局部变量说明。PL/0中唯一的数据类型是整型,可以用来说明该类型的常量和变量。当然PL/0也具有通常的算术运算和关系运算。通过读懂源程序,全面掌握编译原理的基本实现过程。对现存的PL/0编译程序做一些修改或扩充。设计内容与步骤通过读懂源程序,全面掌握编译原理的基本实现过程。扩充PL/0增加识别字符型数据类
3、型和实型数据类型的功能增加的数据类型的定义如下:D |integer id |char id |double id设计工作计划与进度安排1-4:进行完整的编译程序全过程的理解5-12:根据源程序,理解整个编译器的编写中涉及到的全局变量及基本函数的意义。13-20:在读懂全程序的基础上,进行扩充功能,并测试。21-24:撰写课程设计报告书。设计考核要求设计考核方法:课程设计总成绩=算法实现(30%)+课程设计说明书(50%)+平时考勤(20%)。设计考核要求:(1) 规范的课程设计说明书(2) 所设计的算法源代码指导教师(签字): 教研室主任(签字):20山东建筑大学计算机学院课程设计说明书对P
4、L/0语言及其编译器进行扩充和修改实现增加数据类型的功能一、问题描述PL/0程序设计语言是一个较简单的语言,它以赋值语句为基础,构造概念有顺序、条件和重复(循环)三种。PL/0有子程序概念,包括过程定义(可以嵌套)与调用且有局部变量说明。PL/0中唯一的数据类型是整型,可以用来说明该类型的常量和变量。当然PL/0也具有通常的算术运算和关系运算。PL/0语言的BNF文法如下所示: <程序> := <程序体>. <程序体> := <常量说明部分>变量说明部分><过程说明部分><语句> <常量说明部分>:= C
5、ONST<常量定义>,<常量定义> <常量定义> := <标识符>=<无符号整数> <无符号整数> := <数字><数字> <变量说明部分>:= VAR<标识符>,<标识符> <标识符> := <字母><字母>|<数字> <过程说明部分>:= <过程首部><程序体><过程说明部分> <过程首部> := PROCEDURE<标识符> <语句&
6、gt; := <赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<复合语句>|<空> <赋值语句> := <标识符>:=<表达式> <复合语句> := BEGIN<语句><语句>END <条件> := <表达式><关系运算符><表达式>|ODD<表达式> <表达式> := +|-<项><加法运算符><项> <项> :=
7、<因子><乘法运算符><因子> <因子> := <标识符>|<无符号整数>|'('<表达式>')' <加法运算符> := +|- <乘法运算符> := *|/ <关系运算符> := =|#|<|<=|>|>= <条件语句> := IF<条件>THEN<语句> <过程调用语句>:= CALL<标识符> <当型循环语句>:= WHILE<条件>
8、;DO<语句> <字母> := a|b|.|X|Y|Z <数字> := 0|1|2|.|8|9对现存的PL/0编译程序做如下修改或扩充。(1) 扩充识别注释功能:注释由(*和*)包含,不允许嵌套。 (2)识别对else子句进行处理的功能<条件语句> := IF<条件>THEN<语句>ELSE<语句>二、基本要求设计目的:掌握PL/0语言编译器实现的基本原理和实现方法。能在理解其实现原理的方法的基础上进行适当的扩充,使其功能更强大。设计要求:在理解源代码的基础上,根据文法的要求,采用C语言扩充算法。完成扩充识别注
9、释功能,和识别对else子句进行处理的功能3、 算法思想 增加数据类型的功能:因子语法描述该为 numberinteger ident 因子 char double)( 表达式 EBNF文法为:<因子>:=<标识符>|<无符号整数>|<整型>|<字符型>| <浮点型>|(<表达式>)4、 数据结构#define norw 16/关键字的个数#define txmax 100/名字表的容量#define nmax 14/数字的最大位数#define al 10/符号的最大长度#define amax 2047/地
10、址上界#define levmax 3/最大允许的嵌套声明层数#define cxmax 200/最多的虚拟机代码数enum symbol /枚举类型: /nul=0,ident=1,number=2,plus=3,minus=4 /times=5,依次类推,procsym=31 nul, ident, number, /下面的表示的是系统的算数运算符以及逻辑运算符,知道意思就可以 plus, minus, times,/相乘的意思 slash, oddsym, eql, neq, lss, leq, gtr, geq, lparen,/左括号 rparen, comma, semicolon
11、, period, becomes,/赋值的意思 /下面的表示是系统的保留字 beginsym, endsym, ifsym, thensym, whilesym, writesym, readsym, dosym, callsym, constsym, varsym, procsym, integersym,charactersym,doublesym,;#define symnum 35enum object constant, variable, procedur,integer,character,doubler,;五、模块划分过程或函数名简要功能说明pl0主程序Error出错处理,打
12、印出错位置和错误编码Getsym词法分析,读取一个单词Getch漏掉空格,读取一个字符Gen生成目标代码,并送入目标程序区Test测试当前单词符号是否合法Block分程序分析处理过程Enter登录名字表position(函数)查找标识符在名字表中的位置Constdeclaration常量定义处理Vardeclaration变量说明处理Listode列出目标代码清单Statement语句处理Expression表达式处理Term项处理Factor因子处理Condition条件处理Interpret对目标代码的解释执行程序base(函数)通过静态链求出数据区的基地址6、 源程序1、/该函数的功能就
13、是取一个数据单位,通过调用该函数可以一次取出一个/数字或字符串或运算符,这个函数和getch函数我觉得应该是调用最经常地函数啦,/每调用一次该函数,该函数就会去调用getch函数/sym记录的是语句单位的类型,num中存放的是数字的大小int getsym() . /取一个数字单位 else /加入real类型 if (ch>='0'&&ch<='9') k=0; num=0; sym=intsym;/以sym表示这是一个数字 /*type=integer;*/double count=0.1; doif(ch='.'
14、)getchdo;sym=doublesym;while(ch>='0'&&ch<='9')num=num+(ch-'0')*count;k+;count*=0.1;getchdo;break;else num=10*num+ch-'0' k+; getchdo; while(ch>='0'&&ch<='9'|ch='.'); k-; if(k>nmax)/要求数字位数不能超过15位,nmax=14,不过我觉得这有错误 e
15、rror(30);/输出错误码 elseif(int)ch=39)/加入字符类型getchdo;if(ch>='A'&&ch<='Z')|(ch>='a'&&ch<='z')num=(int)ch;getchdo;if(int)ch=39)sym=charsym;elsenum=0;sym=nul;error(49);/类型错误elseerror(49);getchdo; .2、/cc=cx=ll=0;cx表示源程序中代码的第几行/block(0,0,nxtlev)这是主程序
16、/nxtlev中已有部分值为1,大小为32int block(int lev,int tx,bool* fsys)/lev表示分程序所在层,tx表示当前尾指针,fsys表示当前模块后跟符号集 . /如果当前字符是变量,则将字符放入table中,形式同上述代码,如对下面不动的请参照上面的代码 if(sym=intsym) getsymdo; do intdeclarationdo(&tx,lev,&dx); while(sym=comma) getsymdo; intdeclarationdo(&tx,lev,&dx); if(sym=semicolon) get
17、symdo; else error(5); while(sym=ident); /如果当前字符是变量,则将字符放入table中,形式同上述代码,如对下面不动的请参照上面的代码 if(sym=charsym) getsymdo; do chardeclarationdo(&tx,lev,&dx); while(sym=comma) getsymdo; chardeclarationdo(&tx,lev,&dx); if(sym=semicolon) getsymdo; else error(5); while(sym=ident); /如果当前字符是变量,则将字符
18、放入table中,形式同上述代码,如对下面不动的请参照上面的代码 if(sym=doublesym) getsymdo; do doubleclarationdo(&tx,lev,&dx); while(sym=comma) getsymdo; doubleclarationdo(&tx,lev,&dx); if(sym=semicolon) getsymdo; else error(5); while(sym=ident); . if(tableswitch)/是否列出table表中的内容 printf("TABLE:n"); if(tx0
19、+1>tx)/当table表为空时,只输出NULL printf("NULLn"); for(i=tx0+1;i<=tx;i+) /自己修改的 switch(tablei.kind) /自己添加的case integer: printf("%d int %s",i,);printf("lev=%d addr=%dn",tablei.level,tablei.adr); fprintf(fas,"%d integer %s",i,);fprintf(fas,&q
20、uot;lev=%d addr=%dn",tablei.level,tablei.adr); break; case character: printf("%d character %s",i,);printf("lev=%d addr=%dn",tablei.level,tablei.adr); fprintf(fas,"%d character %s",i,); fprintf(fas,"lev=%d addr=%dn",tablei.level,table
21、i.adr); break;case doubler: printf("%d doubler %s",i,);printf("lev=%d addr=%dn",tablei.level,tablei.adr); fprintf(fas,"%d doubler %s",i,);fprintf(fas,"lev=%d addr=%dn",tablei.level,tablei.adr); break; .3、/该函数的功能是将源程序中的常量,变量,分程序符号串输入到table
22、表中/该table表是从下标1开始的,0号空间另做其它用途/void enter(enum object k,enum datatype t,int* ptx ,int lev ,int * pdx)void enter(enum object k,int* ptx ,int lev ,int * pdx) . /自己修改的/case integer:table(*ptx).level=lev;table(*ptx).adr=(*pdx); (*pdx)+; break;case doubler:table(*ptx).level=lev;table(*ptx).adr=(*pdx); (*p
23、dx)+; break;case character:table(*ptx).level=lev;table(*ptx).adr=(*pdx); (*pdx)+; break; .int characterdeclaration(int * ptx,int lev,int * pdx)/如果当前的符号是一个字符类型,则继续执行if(sym=ident) enter(character,ptx,lev,pdx); getsymdo;elseerror(4);return 0;int integerdeclaration(int * ptx,int lev,int * pdx)/如果当前的符号是一
24、个字符类型,则继续执行if(sym=ident) enter(integer,ptx,lev,pdx); getsymdo;elseerror(4);return 0;int doubdeclaration(int * ptx,int lev,int * pdx)/如果当前的符号是一个字符类型,则继续执行if(sym=ident) enter(doubler,ptx,lev,pdx); getsymdo;elseerror(4);return 0;4、/递归读取分析每一个语句,该函数会将整个程序的大部分子程序联系起来/该程序中大部分是递归调用,虽说代码很多,但基本都是一个格式,所以读起来并不复
25、杂/相对来说还比较简单/对于代码实现上差不多的部分,我没有做过多的注释int statement(bool* fsys,int * ptx,int lev) . switch(tablei.kind)/输出处理case character:gendo(opr,0,21);break;case integer:gendo(opr,0,14);break;case doubler:gendo(opr,0,14);break; . if(sym=beginsym) getsymdo; /更改!/if(sym=doublesym)sym=ident; getsymdo;if(sym=intsym)sy
26、m=ident;getsymdo;if(sym=charsym)sym=ident;getsymdo; .5、 /因子处理int factor (bool* fsys,int *ptx,int lev) .case character: gendo(lod,lev-tablei.level,tablei.adr); break; case integer: gendo(lod,lev-tablei.level,tablei.adr); break; case doubler: gendo(lod,lev-tablei.level,tablei.adr); break; . if(sym=num
27、ber|sym=intsym|sym=charsym|sym=doublesym) /如果因子处理时遇到数字 if(num>amax)/如果数字大于最大能表示的数字,则报错。amax=2047 error(31); num=0; gendo(lit,0,num); getsymdo; .6、void interpret() . case 14: / 14号操作为输出栈顶值操作 /输出栈顶值cout<<st-1<<endl;fprintf(fa2,"%lfn",st-1); /同时打印到文件t-; /栈顶下移break;case 15: /15号
28、操作为输出换行操作printf("n"); /输出换行fprintf(fa2,"n"); /同时输出到文件break;case 16: / 16号操作是接受键盘值输入到栈顶printf("输入整形数:"); /屏显问号fprintf(fa2,"输入整形数:"); /同时输出到文件scanf("%lf",&(st); /获得输入fprintf(fa2,"%lfn",st); /把用户输入值打印到文件t+; /栈顶上移,分配空间break;case 17: / 17号操作
29、为输出栈顶值操作printf("%c",(int)st-1); /输出栈顶值fprintf(fa2,"%cn",st-1); /同时打印到文件t-; /栈顶下移break;case 18: / 18号操作为输出栈顶值操作printf("%lf",st-1); /输出栈顶值fprintf(fa2,"%lfn",st-1); /同时打印到文件t-; /栈顶下移break;case 19: / 19号操作是接受键盘值输入到栈顶printf("输入单字符:"); /屏显问号fprintf(fa2,&qu
30、ot;输入单字符:"); /同时输出到文scanf("%s",&(st);fprintf(fa2,"%cn",st); /把用户输入值打印到文件t+; /栈顶上移,分配空间break;case 20: / 20号操作是接受键盘值输入到栈顶printf("输入双精度型数:"); /屏显问号fprintf(fa2,"输入双精度型数:"); /同时输出到文件scanf("%lf",&(st); /获得输入fprintf(fa2,"%lfn",st); /把
31、用户输入值打印到文件t+; /栈顶上移,分配空间break;case 21: / 14号操作为输出栈顶值操作 /输出栈顶值cout<<(char)st-1<<endl;fprintf(fa2,"%lfn",st-1); /同时打印到文件t-; /栈顶下移break; .七、测试数据1、运行编译后的可执行文件,输入用PL/0的源语言写的代码文件integer.txt:该文件内容如下:integer w;begin integer w:=25; write(w); end.得到程序的运行结果如图1所示:图1 测试数据integer.txt的运行结果2、 运行编译后的可执行文件,输入用PL/0的源语言写的代码文件character.txt:该文件内容如下:character m;begin character m:=m; End.得到程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年联通云赛道试题库及答案
- 2025年度共享出行个人司机雇佣管理协议4篇
- 委托居间合同范本模板
- 2025年度环保建筑材料ROHS检测与质量监控协议3篇
- 二零二五年度车辆租赁合同(含司机培训及考核)4篇
- 绿色照明引领未来学校教室健康照明战略
- 2025年度住宅小区地下车库车位产权转让及维修保养合同3篇
- 2025年度人工智能应用开发个人外包合同模板4篇
- 二零二五年度宠物送养与领养公益合作协议3篇
- 二零二五年度宠物领养中心项目合作协议3篇
- 整式的加减单元测试题6套
- 股权架构完整
- 山东省泰安市2022年初中学业水平考试生物试题
- 注塑部质量控制标准全套
- 人教A版高中数学选择性必修第一册第二章直线和圆的方程-经典例题及配套练习题含答案解析
- 毕业设计(论文)-液体药品灌装机的设计与制造
- 银行网点服务礼仪标准培训课件
- 二年级下册数学教案 -《数一数(二)》 北师大版
- 晶体三极管资料
- 银行内部举报管理规定
- 石群邱关源电路(第1至7单元)白底课件
评论
0/150
提交评论