1、目录一设计题目- 1二主要内容- 1三具体要求- 1四进度安排- 1五成绩评定- 2六设计思路- 2七源程序及运行结果- 3八设计体会- 15正文一 设计题目小型程序设计语言编译器的设计与实现二主要内容自定义一种简单的小型高机程序设计语言,采用任意一种编程语言和编程工具设计并实现其编译器,展示编译系统中词法分析和语法分析(LR分析方法)的全过程。三具体要求1、对单词的构词规则有明确的定义;2、编写的词法分析程序能够正确识别源程序中的单词符号;3、识别出的单词以的二元式形式保存在符号表中并输出;4、构造出程序设计语言各语法单位的SLR分析表;(其他分析表亦可)5、能够对输入的源程序做出正确的语法
2、分析并输出清晰的结果;6、高级语言的规模不易过大,注重编译器内核的设计,对于界面无要求;7、课程设计报告中应对所自定义高级语言进行简单描述,对编译器的设计进行简单的需求分析,给出设计说明和程序结构框架,阐明设计思路、用到的原理和方法。8、不可更改课程设计报告中已有的字体和格式,课程设计报告中新加入内容,汉字采用宋体五号字,英文字符和数字采用Times New Roman五号字。四进度安排序号内 容时间(天)1布置题目、查找资料12概要设计13详细设计34调试分析15测试结果0.56总结和完成设计报告1合 计7.5五成绩评定1、考核方法:通过现场考勤、检查源程序和批改课程设计报告相结合的方式考察
3、学生的动手能力,独立分析解决问题的能力和创新精神,并根据学生的学习态度综合考评。2、成绩评定:成绩分优、良、中、及格和不及格五等。六设计思路开始做的时候很纠结不知道如何开始,然后就按照书上的内容进行编程。但书上的程序太大了,而给自己做的时间有太少了。所以就选择参照书上的内容自己动手,词法分析的思路基本上和书上的一样对每个词进行分析编号。但是由于书上内容复杂,所以我只做了赋值语句的顺序处理部分。而且和书上的赋值语句相比我有加了减法和除法的功能。并且在读取阶段,书上是按行读取(读到”n”为一个readline),而我选择了按语句进行读取(读到”;”为一个readline)。因为有时候一行之间会有好
4、几个语句。我可以把一行上的多个语句分开来,当然书上也可以只不过这一步她是在程序语句处理里面完成的。而我只有赋值语句。并且还要实现顺序结构所以就按照自己的思路做下去了。然后是语法分析,由于词法分析和书上的有出路。所以一开始我就没打算用书上的思路去做。就按照自己的思路来解决,首先是对词法分析里的存储单词的数组进行拷贝和修改(添加了#号使其能区分出赋值语句)、然后正式的语法分析时,我是直接对拷贝后的数组进行分析的,中间出了不少错误,更关键的是语法分析时在顺序上出现了错误,这一点我无法用语言说清楚,解决顺序上的错误时我加入了add1()这个函数,同时这个函数也实现了将终结符改为非终结符的功能(也就是所
5、谓的临时变量)。然后就是一个语句分析完后进行下一个语句的分析。这个就是个衔接问题,改动数组的坐标就能完成,大概的思路就是这样,中间调试时错误百出,对语法分析程序做了不少的小动作。然后就是将语法分析结果显示出来,为了和课本的相似,用了几个条件语句做约定。这个是第二天上午解决的,思考了一会。当然最关键的核心技术,还是和书上的一样。符号种别编码说明Pound_sign7“#”add34“+”sub35“-”mul36“*“div37“/”equal38“=”lbrackets48“(“rbrackets49“)”tempsy55临时变量ident56变量intconst57整常数单词符号的内部定状态
6、ACTIONGOTOi+-*/()#E0S3S211S4S5S6S72S3S283R6R6R6R6R6R64S3S295S3S2106S3S2117S3S2128S4S5S6S7S139R1R1S6S7R1R110R2R2S6S7R2R211R3R3R3R3R3R312R4R4R4R4R4R413R5R5R5R5R5R5算符运算SLR(1)分析表七源程序及运行结果#include#include#includeusing namespace std;#define txtname C:bianyiqi.txt#define ACC -2/-字符定义-#define pound_sign 7 /
7、“#”#define add 34 /“+”#define sub 35 /“-”#define mul 36 /“*“#define div 37 /“/”#define equal 38 /“=”#define lbrackets 48 /“(“#define rbrackets 49 /“)”#define tempsy 55 /临时变量#define ident 56 /变量#define intconst 57 /整常数/-变量申明-char ch=0; /读取字符int count=0; /计buf里的单词个数static char spelling10=; /读取一个变量stat
8、ic char line255=; /单词字符数组char *pline; /单词指针int lnum=0; /行数int nlength=0; /所产生的变量编号static char ntab110010; /存放新的变量并进行比较struct aaint sy1;int pos;buf1000,n,n1,E,sstack100,ibuf100;int tt1=0;int stack1000; /栈int sp=0; /栈的位置数int ii=2; /ibuf数组的位置数int lr; /状态序列int j=0; /ibuf总个数int h=1; /控制”#结束#”的个数函数ifstrea
9、m infile;/-语法分析表-int action149=3,-1,-1,-1,-1,2,-1,-1,1,-1,4,5,6,7,-1,-1,ACC,-1,3,-1,-1,-1,-1,2,-1,-1,8,-1,106,106,106,106,-1,106,106,-1,3,-1,-1,-1,-1,2,-1,-1,9,3,-1,-1,-1,-1,2,-1,-1,10,3,-1,-1,-1,-1,2,-1,-1,11,3,-1,-1,-1,-1,2,-1,-1,12,-1,4,5,6,7,-1,13,-1,-1,-1,101,101,6,7,-1,101,101,-1,-1,102,102,6,
10、7,-1,102,102,-1,-1,103,103,103,103,-1,103,103,-1,-1,104,104,104,104,-1,104,104,-1,-1,105,105,105,105,-1,105,105,-1;/-字符读取-void readline() char ch1;pline=line;infile.get(ch1);while(ch1!=;)*pline=ch1;pline+;infile.get(ch1);*pline=NULL;pline=line;void readch()if(ch=NULL)readline();lnum+;ch=*pline;pline
11、+;/-变量识别-int find(char spel)int ss1=0;int ii=0;while(ss1=0)&(ii=a)&(ch=0)&(ch=9);pline-;spellingk=0;bufcount.sy1=ident;j=find(spelling);if(j=-1)bufcount.pos=tt1;strcpy(ntab1tt1,spelling);tt1+;nlength+;elsebufcount.pos=j;count+;for(k=0;k=0)&(ch=9);bufcount.sy1=intconst;bufcount.pos=ivalue;count+;plin
12、e-;/-词法分析-void scan()while(ch!=)switch(ch)case :break;casea:caseb:casec:cased:casee:casef:caseg:caseh:casei:casej:casek:casel:casem:casen:caseo:casep:caseq:caser:cases:caset:caseu:casev:casew:casex:casey:casez:identifier();break;case0:case1:case2:case3:case4:case5:case6:case7:case8:case9:number();br
13、eak;case+:bufcount.sy1=add;count+;break;case-:bufcount.sy1=sub;count+;break;case*:bufcount.sy1=mul;count+;break;case/:bufcount.sy1=div;count+;break;case=:bufcount.sy1=equal;count+;break;case(:bufcount.sy1=lbrackets;count+;break;case):bufcount.sy1=rbrackets;count+;break;readch();bufcount.sy1=-1; /全部读
14、完最后一个赋值为-1/-void disp2(aa k)switch(k.sy1)case 34:cout+endl;break;case 35:cout-endl;break;case 36:cout*endl;break;case 37:cout/endl;break;case 38:cout=endl;break;case 48:cout(endl;break;case 49:cout)endl;break;case 55:cout临时变量endl;break;case 56:cout变量tntab1k.posendl;break;case 57:cout整常数endl;break;vo
15、id disp1()int i;coutendl-词法分析结果-endl;for(i=0;icount;i+)coutbufi.sy1tbufi.post;disp2(bufi);cout程序总共lnum行,产生了count个二元式;coutendl-变量名表-endl;for(i=0;itt1;i+)coutitntab1iendl;void disp3()cout状态:;for(int i=0;i=sp;i+)coutstacki ;/-与分析表匹配-int change(int n)switch(n)case ident:case intconst:return 0;case add:r
16、eturn 1;case sub:return 2;case mul:return 3;case div:return 4;case lbrackets:return 5;case rbrackets:return 6;case pound_sign:return 7;case tempsy:return 8;/-词法分析数组转化为语法分析数组-void exchange()int i;for(i=0;icount;i+)if(bufi-1.sy1=ident&bufi.sy1=ident)ibufj.sy1=pound_sign;j+;ibufj.sy1=bufi.sy1;if(bufi.s
17、y1=ident)ibufj.pos=bufi.pos;j+;ibufj.sy1=pound_sign;j+;ibufj.sy1=-1;for(i=0;i=j;i+)coutibufi.sy1=i;n-)ibufn+1.sy1=ibufn.sy1;ibufn+1.sy1=tempsy;j+;/-语法分析-void lrparse()lr=actionstackspchange(ibufii.sy1);/coutstacksptchange(ibufii.sy1)t;if(ibufii.sy1!=tempsy)disp3();if(lr=0)sp+;stacksp=lr;if(ibufii.sy
18、1!=tempsy&lr!=ACC)coutendlt移进endl;/cout#ibufii.sy1#endl;ii+;/disp3();/cout#ibufii.sy1#100&lr107)switch(lr)case 101:sp=sp-3;add1(ii);ibufii.sy1=tempsy;coutendlt归约EE+Eendl;break;case 102:sp=sp-3;add1(ii);coutendlt归约EE-Eendl;break;case 103:sp=sp-3;add1(ii);coutendlt归约EE*Eendl;break;case 104:sp=sp-3;add
19、1(ii);coutendlt归约EE/Eendl;break;case 105:sp=sp-3;add1(ii);coutendlt归约E(E)endl;break;case 106:sp=sp-1;add1(ii);coutendlt归约Eiendl;break;lrparse();if(lr=ACC)sp=sp-1;if(h=1)/disp3();coutendl#结束#endl;h=2;if(ibufii+1.sy1!=-1)stacksp+1=0;ii=ii+3;h=1;lrparse();elsereturn;/-int main()infile.open(txtname,ios:
20、in);readch();scan();disp1();exchange();stacksp=0;cout-语法分析-endl;lrparse();infile.close();return 0;运行结果:1. 使用的语句是d=(a+b)/c;这里的 号是用来结束用的实际分析的语句是(a+b)/c上图为词法分析上图为语法分析部分2. 使用的语句是c=a+b*c;b=a-b;(演示的是顺序语句)这里的 号是用来结束用的实际分析的语句是a+b*c和a-b上图为词法分析上图为语法分析八设计体会这次课程设计我只能用有惊无险来形容。课程设计第一周的时候由于有两门考试所以一直拖到星期五晚上考完试才开始动手
21、。由于没有思路,所以就看书上的过程,这个花了星期六和星期天两天的时间(这段时间映象比较深的是对二义性文法的理解有了更深刻的认识)。但是可惜有地方没有看懂。书上定义的变量比较多前面还好对照,到了语法分析里出现四元式的地方的变量没看懂,感觉毫无头绪。这时候我有点急了,因为还有两天的时间就要交了。这是第一惊。还好睡了一觉,心定下来了。下午的时间把语法分析部分给解决了。但是,和书上的内容开始不一样了,这也就导致语法部分要自己去写了。由于书上的语法部分已读过,所以思路还是有的,然后在图书馆的时间把语法部分在纸上写好了。那是这是信心满满啊。回到宿舍后开始把写的内容进行编写。结果出了很多问题,最主要的问题是
22、忘了对临时变量进行修改的问题,还把原来的分析表给改了。当时急啊,因为已经很晚了,还想换一种方法(准备参考网上的)。这是第二惊。但是参考又要花时间,而且没有成就感,还是放弃了。然后从新开始整理原来的思路做把临时变量的问题给解决了。这时已经1点多了。然后又出现了一个问题,就是编译顺序出错的问题。但是想不出来啊(这是第三惊),索性上床睡觉去了。但在床上想了一会儿,尼玛,想出来了!然后果断下床进行编写。问题解决了。哈哈,那个激动啊。然后在调试修改下,程序基本完成。第二天上午起来把语法分析显示又细化了些。然后就开始写报告了。编写过程中的三惊还好没导致不同的结果,这就是我开始所说的有惊无险。这次课程设计最大的感受就是,人遇事不能急,要保持淡定,因为急了以后什么都做不好。头脑里装不进东西,也想不出东西。只有保持冷静才会有思路。一定得加强这方面的心理素质。只要认真做总会有收获啊!至此 敬礼- 15 -