编译原理课设.docx
- 文档编号:3572602
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:26
- 大小:342.10KB
编译原理课设.docx
《编译原理课设.docx》由会员分享,可在线阅读,更多相关《编译原理课设.docx(26页珍藏版)》请在冰豆网上搜索。
编译原理课设
课程设计报告CourseProjectReport
报告编号ReportNo:
撰写日期Date:
2015-06-29
“编译原理”课程设计报告
ReportonProjectofCourse“PrinciplesofCompilation”
姓名
(计算机科学与技术专业2012年级班学号)
实验课程:
“编译原理”课程设计(CourseCode0601045)
ProjectofCourse“PrinciplesofCompilation”
主讲教师:
余宇峰YufengYu
所属课程:
编译原理(CourseCode0601077)
PrinciplesofCompilation
主讲教师:
李士进LiShijin
学分数:
3+1Credits
开设学院:
计算机与信息学院CollegeofComputers&Information
开设时间:
2015学年第二学期2ndSemester,2015
成绩Grade:
河海大学
目录
1引言3
2实验内容3
基本实验部分3
单元1:
词法分析程序设计3
开放实验部分(可选)11
单元2:
基于预测分析方法的表达式语法分析器11
3总结与体会24
致谢:
25
附录:
25
“编译原理”课程设计报告
ReportonProjectofCourse“PrinciplesofCompilation”
姓名
(计算机科学与技术专业2012年级2班学号)
Email:
954881730@
1引言
编译原理是将高级程序设计语言翻译成低级语言的软件,包括的过程有词法分析、语法分析、语义分析、中间代码生成、代码生成和目标代码生成。
词法分析和语法分析是编译过程的第一个和第二个阶段,是编译的基础。
词法分析是将字符序列转换为单词序列的过程,语法分析是在词法分析的基础上将单词序列组合成各类语法短语,目的是为了掌握自顶向下的分析方法以及LL
(1)文法中堆栈的实现过程。
2实验内容
基本实验部分
单元1:
词法分析程序设计
【实验1.1】实验目的
1、理解词法分析在编译程序中的作用;
2、加深对有穷自动机模型的理解;
3、掌握词法分析程序的实现方法和技术。
【实验1.2】设计思想
词法分析在程序中的实现主要包括三个模块,第一个模块是扫描ID,关键字包含在其中;第二个模块是扫描NUM;第三个模块是扫描符号。
对每个单词进行扫描时,先判定是不是ID或者关键字,若是,则置ID或关键字的类别码;若不是再判定是不是NUM,若是,则置NUM的类别码;若不是再判定是不是符号,若是,则置符号的类别码。
当不满足以上条件,则置种别码为-1并输出ERROR。
全局变量:
charchter[200];//待扫描的字符串
chartoken[10];//令牌,存放单词自身的字符串
charch;//用于扫描的每个字符
intsyn;//单词种别码
intsum=0;//整形常数
函数模块:
voidscan()//扫描
{
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//扫描ID
{
for(n=0;n<6;n++)//扫描关键字
{
if(strcmp(token,keyword[n])==0)
{
}
}
}
elseif((ch>='0'&&ch<='9'))//扫描NUM
{
}
elseswitch(ch)//扫描符号
{
}
}
详细的流程图如下图所示:
【注:
因为流程图过大,所以流程图采用VISIO绘制,图片过大导致下图不清晰,故附上一份词法分析流程图的vsd文件和一份jpg文件,望老师谅解】
图1词法分析程序流程图
【实验1.3】主要源代码
该程序的主要部分如下:
voidscan()
//扫描,对字符串进行逐一扫描
{
for(n=0;n<9;n++)
//先将令牌清空
token[n]=NULL;
ch=chter[p++];
while(ch=='')
//当扫描到空格时,空格有分隔两个单词的作用
{
ch=chter[p];
p++;
}
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
//当扫描到单词首字符为字母时
{
m=0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
//首字符后的字符为字母后数字
{
token[m++]=ch;
ch=chter[p++];
}
token[m++]='\0';
p--;
syn=10;
for(n=0;n<6;n++)
//因为扫描到的ID有可能有关键字的情况,所以要进行关键字判定
{
if(strcmp(token,keyword[n])==0)
{
syn=n+1;
break;
}
}
}
elseif((ch>='0'&&ch<='9'))
//当扫描到单词首字符为数字时
{
sum=0;
while((ch>='0'&&ch<='9'))
//首字符后的字符也为数字时
{
sum=sum*10+ch-'0';
ch=chter[p++];
}
p--;
syn=11;
if(sum>32767)
//定义的整数不能超过int类型的范围,否则种别码为-1
syn=-1;
}
elseswitch(ch)
//当扫描到的单词首字符为以下列出的符号时
{
case'+':
syn=13;
token[0]=ch;
break;
case'-':
syn=14;
token[0]=ch;
break;
case'*':
syn=15;
token[0]=ch;
break;
case'/':
syn=16;
token[0]=ch;
break;
case':
':
m=0;
token[m++]=ch;
ch=chter[p++];
if(ch=='=')
//首字符为:
第二个字符为=时
{
syn=18;
token[m++]=ch;
}
else
{
syn=17;
p--;
}
break;
case'<':
m=0;
token[m++]=ch;
ch=chter[p++];
if(ch=='>')
//首字符为<第二个字符为>时
{
syn=21;
token[m++]=ch;
}
elseif(ch=='=')
//首字符为<第二个字符为=时
{
syn=22;
token[m++]=ch;
}
else
{
syn=20;
p--;
}
break;
case'>':
m=0;
token[m++]=ch;
ch=chter[p++];
if(ch=='=')
//首字符为>第二个字符为=时
{
syn=24;
token[m++]=ch;
}
else
{
syn=23;
p--;
}
break;
case'=':
syn=25;
token[0]=ch;
break;
case';':
syn=26;
token[0]=ch;
break;
case'(':
syn=27;
token[0]=ch;
break;
case')':
syn=28;
token[0]=ch;
break;
case'#':
syn=0;
token[0]=ch;
break;
default:
syn=-1;
break;
}
}
【实验1.4】调试与测试数据
输入字符不在分析范围中的错误界面:
错误分析:
“32769”超出了int类型,“?
”不在分析符号中
程序错误导致的出错:
出错原因以及解决:
最开始编写程序时,在扫描数字部分没有进行sum置0的操作,导致后面的整数包含了前面扫描过的整数,在我的思考和同学的帮助下解决了这个BUG。
另外我在编程中还出现了很多的错误,就不再一一列举,后来均在书籍和同学指导下解决了错误。
以下为正确执行情况下的界面:
开始界面:
输入界面:
输出界面:
开放实验部分(可选)
单元2:
基于预测分析方法的表达式语法分析器
【实验4.1】实验目的
了解预测分析器的基本构成及用自顶向下的预测法对表达式进行语法分析的方法,掌握预测语法分析程序的手工构造方法。
【实验4.2】设计思想
已知文法G[S]:
S→AT
A→BU
T→+AT|$
U→*BU|$
B→(S)|m
根据LL
(1)文法的判定条件:
对每个非终结符A的两个不同的产生式,A→α,A→β,满足SELECT(A→α)∩SELECT(A→β)=Ø,其中α、β不同时能⇒*ε,那么这个文法就是LL
(1)文法。
由此我们可以通过计算SELECT集来判断,其步骤为:
1、计算FIRST集;
2、计算FOLLOW集;
3、计算SELECT集;
4、判断文法G[S]是否为LL
(1)文法。
非终结符
FIRST集
FOLLOW集
S
A
B
U
T
{(,m}
{(,m}
{(,m}
{*,$}
{+,$}
{),#}
{+,),#}
{+,*,),#}
{+,),#}
{),#}
表1FIRST集和FOLLOW集
根据FIRST集和FOLLOW集,可求出相同左部的SELECT交集:
SELECT(T→+AT)∩SELECT(T→$)={+}∩{),#}=Ø
SELECT(U→*BT)∩SELECT(U→$)={*}∩{+,),#}=Ø
SELECT(B→(S))∩SELECT(B→m)={(}∩{m}=Ø
所以该文法是LL
(1)文法
预测分析方法是自顶向下分析的一种方法,而预测分析表是预测分析程序的重要组成部分。
对每个终结符或#用a表示,若a∈SELECT(A→α),则把A→α放入M[A,a]中。
把所有无定义的M[A,a]标上出错标记(可用空白表示),由此得到的G[S]的预测分析表为:
+
*
(
)
m
#
S
→AT
→AT
A
→BU
→BU
B
→(S)
→m
U
→$
→*BU
→$
→$
T
→+AT
→$
→$
表1预测分析表
语法分析在程序中的实现主要包括8个部分:
1、当栈顶元素为非#的终结符+、*、(、)或m时,若输入串和栈顶元素相同,输入串推进一位且栈顶元素出栈,为其他终结符时显示“ERROR”;
2、当栈顶元素为S时,若输入串为m,栈顶元素出栈且TA进栈,若输入串为(,栈顶元素出栈且TA进栈,若为其他输入串,显示“ERROR”;
3、当栈顶元素为A时,若输入串为m,栈顶元素出栈且UB进栈,若输入串为(,栈顶元素出栈且UB进栈,若为其他输入串,显示“ERROR”;
4、当栈顶元素为B时,若输入串为m,栈顶元素出栈且m进栈,若输入串为(,栈顶元素出栈且)B(进栈,若为其他输入串,显示“ERROR”;
5、当栈顶元素为U时,若输入串为+、)或#,栈顶元素出栈,若输入串为*,栈顶元素出栈且UB*进栈,若为其他输入串,显示“ERROR”;
6、当栈顶元素为T时,若输入串为+,栈顶元素出栈且TA+进栈,若输入串为)或#,栈顶元素出栈,若为其他输入串,显示“ERROR”;
7、当栈顶元素为#时,显示接受;
8、若栈顶元素不满足以上条件时,显示“ERROR”。
全局变量:
charcss[50];//推导所用产生式或匹配
chars[80];//输入的字符串
intl;//输入字符串的长度
structstart//表达式文法的预测分析表
{//建立预测分析表
chara1[10];//+
chara2[10];//*
chara3[10];//m
chara4[10];//(
chara5[10];//)
chara6[10];//#
};
structstartS={"E","E","TA","TA","E","E"};
structstartA={"E","E","UB","UB","E","E"};
structstartB={"E","E","m",")s(","E","E"};
structstartU={"","UB*","E","E","",""};
structstartT={"TA+","E","E","E","",""};
函数模块:
boolpipei(int&b)//匹配
{
if(d=='+'||d=='*'||d=='m'||d=='('||d==')')//栈顶元素为+、*、m、(或)
{
}
elseif(d=='S')//栈顶元素为S
{
}
elseif(d=='A')//栈顶元素为A
{
}
elseif(d=='B')//栈顶元素为B
{
}
elseif(d=='U')//栈顶元素为U
{
}
elseif(d=='T')//栈顶元素为T
{
}
elseif(d=='#')//栈顶元素为#
{
}
Else//栈顶元素不满足以上条件时
{
}
}
详细的流程图如下图所示:
【注:
因为流程图过大,所以流程图采用VISIO绘制,图片过大导致下图不清晰,故附上一份词法分析流程图的vsd文件和一份jpg文件,望老师谅解】
图2语法分析程序流程图
【实验4.3】主要源代码
该程序的主要部分如下:
boolpipei(int&b)
//匹配,对输入串进行逐一匹配
{
chard;
//定义栈顶元素
d=sc.top();
if(d=='+'||d=='*'||d=='m'||d=='('||d==')')
//当栈顶元素为+、*、m、(或)时
{
if(s[b]==d)
//若输入串与栈顶元素相同
{
css[0]=s[b];
strcpy(css+1,"匹配");
b++;
//字符串向前推进
sc.pop();
//栈顶元素出栈
returntrue;
}
else
{
cout<<"ERROR"< returnfalse; } } elseif(d=='S') //当栈顶元素为S时 { if(s[b]=='m') //若输入串为m { strcpy(css,"S->AT"); sc.pop(); //栈顶元素出栈 for(inti=0;i { sc.push(S.a3[i]); //TA进栈 } returntrue; } elseif(s[b]=='(') //若输入串为( { strcpy(css,"S->AT"); sc.pop(); //栈顶元素出栈 for(inti=0;i { sc.push(S.a4[i]); //TA进栈 } returntrue; } else { cout<<"ERROR"< returnfalse; } } elseif(d=='A') //当栈顶元素为A时 { if(s[b]=='m') //若输入串为m { strcpy(css,"A->BU"); sc.pop(); //栈顶元素出栈 for(inti=0;i { sc.push(A.a3[i]); //UB入栈 } returntrue; } elseif(s[b]=='(') //若输入串为( { strcpy(css,"A->BU"); sc.pop(); //栈顶元素出栈 for(inti=0;i { sc.push(A.a4[i]); //UB入栈 } returntrue; } else { cout<<"ERROR"< returnfalse; } } elseif(d=='B') //当栈顶元素为B时 { if(s[b]=='m') //若输入串为m { sc.pop(); //栈顶元素出栈 for(inti=0;i { sc.push(B.a3[i]); //m入栈 } strcpy(css,"B->m"); returntrue; } elseif(s[b]=='(') //若输入串为( { sc.pop(); //栈顶元素出栈 for(inti=0;i { sc.push(B.a4[i]); //)S(入栈 } strcpy(css,"B->(S)"); returntrue; } else { cout<<"ERROR"< returnfalse; } } elseif(d=='U') //当栈顶元素为U时 { if(s[b]=='+') //若输入串为+ { sc.pop(); //栈顶元素出栈 strcpy(css,"S->$"); returntrue; } elseif(s[b]=='*') //若输入串为* { sc.pop(); //栈顶元素出栈 for(inti=0;i { sc.push(U.a2[i]); //UB*入栈 } strcpy(css,"S->*BU"); returntrue; } elseif(s[b]=='#') //若输入串为# { sc.pop(); //栈顶元素出栈 strcpy(css,"U->$"); returntrue; } elseif(s[b]==')') //若输入串为) { sc.pop(); //栈顶元素出栈 strcpy(css,"U->$"); returntrue; } else { cout<<"ERROR"< returnfalse; } } elseif(d=='T') //当栈顶元素为T时 { if(s[b]=='+') //若输入串为+ { sc.pop(); //栈顶元素出栈 for(inti=0;i { sc.push(T.a1[i]); //TA+入栈 } strcpy(css,"T->+AT"); returntrue; } elseif(s[b]=='#') //若输入串为# { sc.pop(); //栈顶元素出栈 strcpy(css,"T->$"); returntrue; } elseif(s[b]==')') //若输入串为) { sc.pop(); //栈顶元素出栈 strcpy(css,"T->$"); returntrue; } else { cout<<"ERROR"< returnfalse; } } elseif(d=='#') //当栈顶元素为#时 { cout<<"接受"; returnfalse; } else //当栈顶元素不满足以上条件时 { cout<<"ERROR"< returnfalse; } } 【实验4.4】调试与测试数据 输入字符不在分析范围中的错误界面: 错误分析: 输入串a不在题目的终结符集中 以下为正确执行情况下的界面: 开始界面: 输入界面: 输出界面: 3总结与体会 在这次《编译原理》课程设计实践课,我遇到很多的问题,例如C语言中某个函数的如何编写,某些符号如何使用等等。 面对这些问题,我们首先通过询问其他同学或者通过书籍,网络查找等方法解决问题,直到把问题解决。 在完成课程设计的时候,我对于编译原理有了很多的认识,同时个人编程能力也得到了很大提升。 在整个课程设计过程中,我逐渐对于程序设计过程,以及编写程序的模块思想和对类和数据结构有了全新的认识,对文法、词法分析和语法分析的知识点加深了很多,同时我们对于计算机的这门学科,编译原理的课程设计以及程序编写产生更多的兴趣和激情。 致谢: 首先,感谢余宇峰老师细心地指导、提供给我的支持和给予这个锻炼的平台,其次,感谢课程设计中帮助我的同学,谢谢大家。 附录: 1.第一题源程序: bianyi1.cpp 2.词法分析流程图vsd文件: bianyi1.vsd 3.词法分析流程图jpg文件: bianyi1.jpg 4.第四题源程序: bianyi2.cpp 5.语法分析流程图vsd文件: bianyi4.vsd 6.语法分析流程图jpg文件: bianyi4.jpg
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理