编译原理课程设计小型程序设计语言编译器的设计与实现.docx
- 文档编号:4516684
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:20
- 大小:103.34KB
编译原理课程设计小型程序设计语言编译器的设计与实现.docx
《编译原理课程设计小型程序设计语言编译器的设计与实现.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计小型程序设计语言编译器的设计与实现.docx(20页珍藏版)》请在冰豆网上搜索。
编译原理课程设计小型程序设计语言编译器的设计与实现
一.设计题目----------------------------------------------------------------1
二.主要内容----------------------------------------------------------------1
三.具体要求----------------------------------------------------------------1
四.进度安排----------------------------------------------------------------1
五.成绩评定----------------------------------------------------------------2
六.设计思路----------------------------------------------------------------2
七.源程序及运行结果----------------------------------------------------3
八.设计体会----------------------------------------------------------------15
正文
一.设计题目
小型程序设计语言编译器的设计与实现
二.主要内容
自定义一种简单的小型高机程序设计语言,采用任意一种编程语言和编程工具设计并实现其编译器,展示编译系统中词法分析和语法分析(LR分析方法)的全过程。
三.具体要求
1、对单词的构词规则有明确的定义;
2、编写的词法分析程序能够正确识别源程序中的单词符号;
3、识别出的单词以<种别码,值>的二元式形式保存在符号表中并输出;
4、构造出程序设计语言各语法单位的SLR分析表;(其他分析表亦可)
5、能够对输入的源程序做出正确的语法分析并输出清晰的结果;
6、高级语言的规模不易过大,注重编译器内核的设计,对于界面无要求;
7、课程设计报告中应对所自定义高级语言进行简单描述,对编译器的设计进行简单的需求分析,给出设计说明和程序结构框架,阐明设计思路、用到的原理和方法。
8、不可更改课程设计报告中已有的字体和格式,课程设计报告中新加入内容,汉字采用宋体五号字,英文字符和数字采用TimesNewRoman五号字。
四.进度安排
序号
内容
时间(天)
1
布置题目、查找资料
1
2
概要设计
1
3
详细设计
3
4
调试分析
1
5
测试结果
0.5
6
总结和完成设计报告
1
合计
7.5
五.成绩评定
1、考核方法:
通过现场考勤、检查源程序和批改课程设计报告相结合的方式考察学生的动手能力,独立分析解决问题的能力和创新精神,并根据学生的学习态度综合考评。
2、成绩评定:
成绩分优、良、中、及格和不及格五等。
六.设计思路
开始做的时候很纠结不知道如何开始,然后就按照书上的内容进行编程。
但书上的程序太大了,而给自己做的时间有太少了。
所以就选择参照书上的内容自己动手,词法分析的思路基本上和书上的一样对每个词进行分析编号。
但是由于书上内容复杂,所以我只做了赋值语句的顺序处理部分。
而且和书上的赋值语句相比我有加了减法和除法的功能。
并且在读取阶段,书上是按行读取(读到”\n”为一个readline),而我选择了按语句进行读取(读到”;”为一个readline)。
因为有时候一行之间会有好几个语句。
我可以把一行上的多个语句分开来,当然书上也可以只不过这一步她是在程序语句处理里面完成的。
而我只有赋值语句。
并且还要实现顺序结构所以就按照自己的思路做下去了。
然后是语法分析,由于词法分析和书上的有出路。
所以一开始我就没打算用书上的思路去做。
就按照自己的思路来解决,首先是对词法分析里的存储单词的数组进行拷贝和修改(添加了#号使其能区分出赋值语句)、然后正式的语法分析时,我是直接对拷贝后的数组进行分析的,中间出了不少错误,更关键的是语法分析时在顺序上出现了错误,这一点我无法用语言说清楚,解决顺序上的错误时我加入了add1()这个函数,同时这个函数也实现了将终结符改为非终结符的功能(也就是所谓的临时变量)。
然后就是一个语句分析完后进行下一个语句的分析。
这个就是个衔接问题,改动数组的坐标就能完成,大概的思路就是这样,中间调试时错误百出,对语法分析程序做了不少的小动作。
然后就是将语法分析结果显示出来,为了和课本的相似,用了几个条件语句做约定。
这个是第二天上午解决的,思考了一会。
当然最关键的核心技术,还是和书上的一样。
符号
种别编码
说明
Pound_sign
7
“#”
add
34
“+”
sub
35
“-”
mul
36
“*“
div
37
“/”
equal
38
“=”
lbrackets
48
“(“
rbrackets
49
“)”
tempsy
55
临时变量
ident
56
变量
intconst
57
整常数
单词符号的内部定
状
态
ACTION
GOTO
i
+
-
*
/
(
)
#
E
0
S3
S2
1
1
S4
S5
S6
S7
2
S3
S2
8
3
R6
R6
R6
R6
R6
R6
4
S3
S2
9
5
S3
S2
10
6
S3
S2
11
7
S3
S2
12
8
S4
S5
S6
S7
S13
9
R1
R1
S6
S7
R1
R1
10
R2
R2
S6
S7
R2
R2
11
R3
R3
R3
R3
R3
R3
12
R4
R4
R4
R4
R4
R4
13
R5
R5
R5
R5
R5
R5
算符运算SLR
(1)分析表
七.源程序及运行结果
#include
#include
#include
usingnamespacestd;
#definetxtname"C:
\\bianyiqi.txt"
#defineACC-2
//---------------------字符定义------------------------
#definepound_sign7//“#”
#defineadd34//“+”
#definesub35//“-”
#definemul36//“*“
#definediv37//“/”
#defineequal38//“=”
#definelbrackets48//“(“
#definerbrackets49//“)”
#definetempsy55//临时变量
#defineident56//变量
#defineintconst57//整常数
//--------------------变量申明-------------------------
charch='\0';//读取字符
intcount=0;//计buf里的单词个数
staticcharspelling[10]={""};//读取一个变量
staticcharline[255]={""};//单词字符数组
char*pline;//单词指针
intlnum=0;//行数
intnlength=0;//所产生的变量编号
staticcharntab1[100][10];//存放新的变量并进行比较
structaa
{
intsy1;
intpos;
}buf[1000],n,n1,E,sstack[100],ibuf[100];
inttt1=0;
intstack[1000];//栈
intsp=0;//栈的位置数
intii=2;//ibuf数组的位置数
intlr;//状态序列
intj=0;//ibuf总个数
inth=1;//控制”#结束#”的个数函数
ifstreaminfile;
//-----------------语法分析表---------------------------------
intaction[14][9]={{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,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}};
//------------------字符读取---------------------------
voidreadline()
{
charch1;
pline=line;
infile.get(ch1);
while(ch1!
=';')
{
*pline=ch1;
pline++;
infile.get(ch1);
}
*pline=NULL;
pline=line;
}
voidreadch()
{
if(ch==NULL)
{
readline();
lnum++;
}
ch=*pline;
pline++;
}
//-----------------变量识别-----------------------
intfind(charspel[])
{
intss1=0;
intii=0;
while((ss1==0)&&(ii { if(! strcmp(spel,ntab1[ii])) ss1=1; ii++; } if(ss1==1) returnii-1; else return-1; } voididentifier() { intiii=0,j,k=0; do { spelling[k]=ch; k++; readch(); }while(((ch>='a')&&(ch<='z'))||((ch>='0')&&(ch<='9'))); pline--; spelling[k]='\0'; buf[count].sy1=ident; j=find(spelling); if(j==-1) { buf[count].pos=tt1; strcpy(ntab1[tt1],spelling); tt1++; nlength++; } else buf[count].pos=j; count++; for(k=0;k<10;k++) spelling[k]=NULL; } //----------------数字识别------------------------ voidnumber() { intivalue=0; intdigit; do { digit=ch-'0'; ivalue=ivalue*10+digit; readch(); }while((ch>='0')&&(ch<='9')); buf[count].sy1=intconst; buf[count].pos=ivalue; count++; pline--; } //-----------------词法分析--------------------- voidscan() { while(ch! ='~') { switch(ch) { case'': break; case'a': case'b': case'c': case'd': case'e': case'f': case'g': case'h': case'i': case'j': case'k': case'l': case'm': case'n': case'o': case'p': case'q': case'r': case's': case't': case'u': case'v': case'w': case'x': case'y': case'z': identifier(); break; case'0': case'1': case'2': case'3': case'4': case'5': case'6': case'7': case'8': case'9': number(); break; case'+': buf[count].sy1=add; count++; break; case'-': buf[count].sy1=sub; count++; break; case'*': buf[count].sy1=mul; count++; break; case'/': buf[count].sy1=div; count++; break; case'=': buf[count].sy1=equal; count++; break; case'(': buf[count].sy1=lbrackets; count++; break; case')': buf[count].sy1=rbrackets; count++; break; } readch(); } buf[count].sy1=-1;//全部读完最后一个赋值为-1 } //------------------------------------------- voiddisp2(aak) { switch(k.sy1) { case34: cout<<"+"< case35: cout<<"-"< case36: cout<<"*"< case37: cout<<"/"< case38: cout<<"="< case48: cout<<"("< case49: cout<<")"< case55: cout<<"临时变量"< case56: cout<<"变量"<<'\t'< case57: cout<<"整常数"< } } voiddisp1() { inti; cout< for(i=0;i { cout< disp2(buf[i]); } cout<<"程序总共"< cout< for(i=0;i cout< } voiddisp3() { cout<<"状态: "; for(inti=0;i<=sp;i++) cout< } //----------------与分析表匹配--------------------------- intchange(intn) { switch(n) { caseident: caseintconst: return0; caseadd: return1; casesub: return2; casemul: return3; casediv: return4; caselbrackets: return5; caserbrackets: return6; casepound_sign: return7; casetempsy: return8; } } //---词法分析数组转化为语法分析数组----------- voidexchange() { inti; for(i=0;i { if(buf[i-1].sy1==ident&&buf[i].sy1==ident) { ibuf[j].sy1=pound_sign; j++; } ibuf[j].sy1=buf[i].sy1; if(buf[i].sy1==ident) ibuf[j].pos=buf[i].pos; j++; } ibuf[j].sy1=pound_sign; j++; ibuf[j].sy1=-1; for(i=0;i<=j;i++) cout< } //------------------增加临时变量------------------------ voidadd1(inti) { intk=j,n; for(n=k;n>=i;n--) ibuf[n+1].sy1=ibuf[n].sy1; ibuf[n+1].sy1=tempsy; j++; } //------------------语法分析------------------- voidlrparse() { lr=action[stack[sp]][change(ibuf[ii].sy1)]; //cout< if(ibuf[ii].sy1! =tempsy) disp3(); if(lr<14&&lr>=0) { sp++; stack[sp]=lr; if(ibuf[ii].sy1! =tempsy&&lr! =ACC) cout< //cout<<'#'< ii++; //disp3(); //cout<<'#'< lrparse(); } if(lr>100&&lr<107) { switch(lr) { case101: sp=sp-3; add1(ii); ibuf[ii].sy1=tempsy; cout< break; case102: sp=sp-3; add1(ii); cout< break; case103: sp=sp-3; add1(ii); cout< break; case104: sp=sp-3; add1(ii); cout< break; case105: sp=sp-3; add1(ii); cout< break; case106: sp=sp-1; add1(ii); cout< break; } lrparse(); } if(lr==ACC) { sp=sp-1; if(h==1) { //disp3(); cout< h=2; } if(ibuf[ii+1].sy1! =-1) { stack[sp+1]=0; ii=ii+3; h=1; lrparse(); } else return; } } //-------------------------------- intmain() { infile.open(txtname,ios: : in); readch(); scan(); disp1(); exchange(); stack[sp]=0; cout<<"------------------语法分析-------------------"< lrparse(); infile.close(); return0; } 运行结果: 1.使用的语句是d=(a+b)/c~;这里的~号是用来结束用的实际分析的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计 小型 程序设计语言 编译器 设计 实现