编译原理课程设计.doc

上传人:laozhun 文档编号:2386038 上传时间:2023-02-17 格式:DOC 页数:19 大小:153.50KB
返回 下载 相关 举报
编译原理课程设计.doc_第1页
第1页 / 共19页
编译原理课程设计.doc_第2页
第2页 / 共19页
编译原理课程设计.doc_第3页
第3页 / 共19页
编译原理课程设计.doc_第4页
第4页 / 共19页
编译原理课程设计.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《编译原理课程设计.doc》由会员分享,可在线阅读,更多相关《编译原理课程设计.doc(19页珍藏版)》请在三一办公上搜索。

1、编译技术课程设计一、目的是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二、任务及要求基本要求:1 词法分析器 产生下述小语言的单词序列这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表: 单词符号种别编码助记符内码值DIMIFDOSTOPEND标识符常数(整)=+*,()1234567891011121314$DIM$IF$DO$STOP$END$ID$INT$ASSIGN$

2、PLUS$STAR$POWER$COMMA$LPAR$RPAR-内部字符串标准二进形式-对于这个小语言,有几点重要的限制:首先,所有的关键字(如IFWHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须

3、至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为 IF i0 i= 1;而绝对不要写成 IFi0 i=1;因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。这个小语言的单词符号的状态转换图,如下图: 2 语法分析器 能识别由加+ 减- 乘* 除/ 乘方 括号()操作数所组成的算术表达式,其文法如下:EE+T|E-T|TTT*F|T/F|FFPF|Pp(E)|i 使用的算法可以是:预测分析法;递归下降分析法;算符优先分析法;LR分析法等。3 中间代码生成器 产生上述算术表达式的中间代码(四元式序列)三、实现过程说明1、词法分析器的流程图 2、语法分

4、析器流程图3、中间代码生成器流程图四、源程序清单词法分析器:#include stdafx.h#include iostream#include stringusing namespace std;/reserve保留字string reserve5 = DIM,IF,DO,STOP,END;/结构体数组,保存已识别的单词struct tablestring str;string name;table400;int count = 0;/判断是否为保留字bool Reserve(string str)bool flag = false;for(int i=0; isizeof(reserve)

5、; i+)if(str = reservei) flag = true;break;return flag;/读入源程序string readStr() FILE *fp; string str = ;char c, filename20;coutfilename;if(fp = fopen(filename,r) = NULL)coutfile not foundendl; else while(c = fgetc(fp) != EOF) str += c;return str;/将结果显示void putToFile(struct table tablep)char ch;int i, j

6、, k;for(i=0; icount; i+)for(j=0; jtablei.str.size(); j+)ch = tablei.strj;coutch;cout ;for(k=0; ktablei.name.size(); k+)ch = tablei.namek;coutch;coutendl; cout分析完毕! 0) c = inputi+;n -;/找到第一个不为空的字符while(c = | c = n | c = t)c = inputi+;n -;if(isalpha(c) while(isalpha(c) | isdigit(c)strToken += c;c = in

7、puti+;n -;i-; /将游标回退一位n+; tablecount.str = strToken;if(!Reserve(strToken)/不是保留字tablecount+.name = $ID; else for(int k=0; ksizeof(reserve); k+)if(strToken = reservek)tablecount+.name = $+reservek;break;strToken = ; /清空,以备下次使用 else if(isdigit(c) while(isdigit(c)strToken += c;c = inputi+;n -;i-;n+;tabl

8、ecount.str = strToken;tablecount+.name = $INT;strToken = ; else if(c = *) c = inputi+;n-;if(c = *) tablecount.str = *;tablecount+.name = $POWER; else i-;n+;tablecount.str = *;tablecount+.name = $STAR; else strToken += c;tablecount.str = strToken;switch(c) /暂时识别以下符号case # : tablecount+.name = $POUND;

9、break;case : tablecount+.name = $QUOTE;break;case = : tablecount+.name = $ASSIG;break;case + : tablecount+.name = $PLUS;break;case ; :tablecount+.name = $SEMICOLON; break;case ( :tablecount+.name = $LPAR;break;case ) :tablecount+.name = $RPAR;break;case : tablecount+.name = $LBRACE;break;case , :tab

10、lecount+.name = $COMMA; break;case :tablecount+.name = $RBRACE; break;default : count+;break;strToken = ; void main()while(1)string str;str = readStr();lex(str);putToFile(table);语法分析器 :#include stdafx.h#include#includeusing namespace std;void E();void E1();void T();void T1();void F();string s;int i;

11、int ERR;int SwitchNum;int main()dos=;i=0;ERR=0;cout请输入你要分析的句子:s;s.resize(s.size()+1);ss.size()-1=#;E();if(si=#)cout是该文法产生的算术表达式endl;elsecoutendl;coutSwitchNum);return 0;void E() if(ERR=0)T();E1();void E1()if(ERR=0)if(si=+)+i;T();E1();else if(si!=#&si!=)cout不是该文法产生的算术表达式endl;ERR=1;void T()if(ERR=0)F(

12、);T1();void T1()if(ERR=0)if(si=*)+i;F();T1();else if(si!=#&si!=)&si!=+)cout不是该文法产生的算术表达式endl;ERR=1;void F()if(ERR=0)if(si=()+i;E();if(si=)+i;else if(si= #)cout不是该文法产生的算术表达式endl;ERR=1;+i;else if(si=i)+i;elsecout不是该文法产生的算术表达式endl;ERR=1;中间代码生成器:#include stdafx.h#include#include#includeusing namespace s

13、td;#define MAX 100int m=0,sum=0;/sum用于计算运算符的个数 /m用于标记输入表达式中字符的个数char JG=A;char strMAX;/用于存输入表达式int token=0;/左括号的标志/*用于更改计算后数组中的值*/void change(int e)int f=e+2;char ch=strf;if(ch=A&ch=Z)for(int l=0;l=A&stre=Z)for(int i=0;im;i+)if(stri=stre)stri=JG;void chengchuchuli(int i,int m) i+;for( ;i=m-1;i+)/处理乘

14、除运算 if(stri=*|stri=/) cout(stri stri-1 stri+1 JG)endl; change(i-1); stri-1=stri=stri+1=JG; sum-; JG=(char)(int)JG+; void jiajianchuli(int j,int m)j+;for( ;j=m-1;j+)/处理加减运算 if(strj=+|strj=-) cout(strj strj-1 strj+1 JG)endl; change(j-1); strj-1=strj=strj+1=JG; sum-; JG=(char)(int)JG+; /*扫描一遍从文件中读入表达式*

15、/void scan(FILE *fin) int pMAX; char ch=a;int c=-1,q=0;while(ch!=EOF)ch=getc(fin);while(ch= |ch=n|ch=t) ch=getc(fin);/消除空格和换行符strm+=ch;if(ch=|ch=+|ch=-|ch=*|ch=/) sum+;else if(ch=() p+c=m-1; else if(ch=) q=m-1; chengchuchuli(pc,q);/从左括号处理到又括号 jiajianchuli(pc,q); JG=(char)(int)JG-; strpc=strm-1=JG; c

16、-; JG=(char)(int)JG+; /*对表达是进行处理并输出部分四元式*/void siyuanshi()for(int i=0;i=m-1;i+)/处理乘除运算 if(stri=*|stri=/) cout(stri stri-1 stri+1 JG)endl; change(i-1); stri-1=stri=stri+1=JG; sum-; JG=(char)(int)JG+; for(int j=0;j=m-1;j+)/处理加减运算 if(strj=+|strj=-) cout(strj strj-1 strj+1 JG)endl; change(j-1); strj-1=s

17、trj=strj+1=JG; sum-; JG=(char)(int)JG+; for(int k=0;k=m-1;k+)/处理赋值运算 if(strk=) JG=(char)(int)-JG; cout(strk strk+1 strk-1)endl; sum-; change(k+1); strk-1=JG; /*主函数*/void main()char inMAX; /用于接收输入输出文件名 FILE *fin; /用于指向输入输出文件的指针while(1) coutin;coutendl; if (fin=fopen(in,r)=NULL) /判断输入文件名是否正确 coutendl打

18、开词法分析输入文件出错!endl; cout四元式如下:endl;scan(fin);/调用函数从文件中读入表达式 /*调用生成四元式的函数*/siyuanshi(); /*判断是否成功*/if(sum=0) cout成功!endl;else cout有错误!endl; /关闭文件fclose(fin);五、程序运行结果词法分析器测试用例:DIM IF DO SDOP END 76 = + * * , ( )语法分析器测试用例:(1)输入i,预期显示:是该文法产生的算术表达式(2)输入a,预期显示:不是该文法产生的算术表达式(3)输入(i+i*i),预期显示:是该文法产生的算术表达式(4)输入

19、(i+i,预期显示:不是该文法产生的算术表达式中间代码生成器:测试用例x=i+iy=i*iz=ia=(i+i)*ib=(i+i)*i+i*i六、总结本课程设计程序是以C语言为基础,并整合了C、C+等一些编译语言的思想,能够实现对整数的四则运算以及相应的赋值语句、条件语句和循环语句,其中以递归的思想实现了词法分析、语法分析和语义分析,最终结果使用四元式输出。增加了对注释的分析,并能够实现文件的读入,大大地增强了程序的可用性和效率。美中不足的是程序中没有类型检查、没有布尔表达式的分析,结果只以中间代码(四元式)表示,没有生成目标代码,还有受文件操作的限制分析的程序不支持中文,这些也希望在以后的日子里继续学习和完成。做这份课程设计也用了近一周的时间,整体来说对课本的知识的巩固和对自己的编程思想都有一定的好处,通过课程设计使我进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,培养独立思考问题、分析问题、解决实际问题的动手能力,使我了解到编译原理与方法对于深刻理解程序设计语言、深入了解程序在计算机中的运行机制、掌握程序设计语言的翻译方法起到不可替代的作用。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号