编译原理课设7Word下载.docx
- 文档编号:15936672
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:14
- 大小:63.05KB
编译原理课设7Word下载.docx
《编译原理课设7Word下载.docx》由会员分享,可在线阅读,更多相关《编译原理课设7Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
(4)输出由文法G构造LASTVT集的算法;
(5)输出LASTVT集。
2)创新要求:
3)课程设计论文编写要求
(1)课程设计任务及要求
(2)设计思路--工作原理、功能规划
(3)详细设计---数据分析、算法思路、功能实现(含程序流程图、主要代码及注
释)、界面等。
(4)运行调试和分析讨论---给出运行屏幕截图,分析运行结果,有何改进想法等。
(5)设计体会和小结---设计遇到的问题及解决办法,通过设计学到了哪些新知识,
巩固了哪些知识,有哪些提高。
(6)报告按规定排版打印,要求装订平整,否则要求返工;
(7)课设报告的装订顺序如下:
封面---任务书---中文摘要---目录----正文---附录
(代码及相关图片)
(8)严禁抄袭,如有发现,按不及格处理。
4)课程设计评分标准:
(1)学习态度:
20分;
(2)系统设计:
(3)编程调试:
(4)回答问题:
(5)论文撰写:
20分。
5)参考文献:
(1)张素琴,吕映芝.编译原理[M].,清华大学出版社
(2)蒋立源、康慕宁等,编译原理(第2版)[M],西安:
西北工业大学出版社
6)课程设计进度安排
1.准备阶段(4学时):
选择设计题目、了解设计目的要求、查阅相关资料
2.程序模块设计分析阶段(4学时):
程序总体设计、详细设计
3.代码编写调试阶段(8学时):
程序模块代码编写、调试、测试
4.撰写论文阶段(4学时):
总结课程设计任务和设计内容,撰写课程设计论文
学生签名:
2016年6月24日
课程设计(论文)评审意见
(1)学习态度(20分):
优( )、良( )、中( )、一般( )、差( );
(2)系统设计(20分):
优()、良( )、中( )、一般( )、差( );
(3)编程调试(20分):
(4)回答问题(20分):
(5)论文撰写(20分):
评阅人:
职称:
副教授
2016年6月日
中文摘要
编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。
内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。
随之而来的还有形式语言和自动机理论和方法的研究也越来越受到人们的重视,本课程设计主要研究自动机在编译方面的使用,并将讨论重点放在算符优先分析法上,并用此理论完成算数表达式的正确和否的判断。
算符优先分析法是一种自底向上分析方法,也称移进-归约分析法,粗略地说它的实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄时,(该句柄对应某产生式的右部),就用该产生式的左部非终结符代替相应右部的文法符号串,这称为一步归约。
重复这一过程直到归约到栈中只剩文法的开始符号时则为分析成功,也就确认输入串是文法的句子。
计算非终结符的FIRSTVT集和LASTVT集是构造算符优先分析表的基础,而算符优先分析表的构造又是算符优先分析算法的基础。
因此,本程序的实现可以说是算符优先分析算法实现的基础。
目 录
一、课程设计任务及要求
课设目的
进一步培养学生编译器设计的思想,加深对编译原理和使用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格,并综合使用程序设计语言、数据结构和编译原理的知识,熟悉使用开发工具VC/JAVA/C#/.NET。
总体要求
1.思想的正确性,采用合适的数据存储结构等。
2.程序实现的正确性,程序整体结构合理、编程风格规范等。
3.程序功能的完善程度,包括功能的基本实现、基本完善、完全实现4.工作认真、独立完成课设。
基本要求
动态模拟算法的基本功能是:
1.输入一个文法G;
2.输出由文法G构造FIRSTVT集的算法;
3.输出FirstVT集;
4.输出由文法G构造LastVT集的算法;
5.输出LastVT集。
二、需求分析
本课程设计的题目为“FirstVT集和LastVT集生成算法模拟”,它是算符优先分析算法中判断三种优先关系的关键。
算法优先分析法是一种不太规范的自下向上分析方法,分析速度快,特别适用于表达式的分析。
而所谓的自底向上分析法是一种语言形式分析算法.是根据形式文法的重写规则,自叶开始逐级向上归约,直到构造出表示句子结构的整个推导树为止的一种语言形式分析算法。
三、设计思路
Firstvt集:
找Firstvt的三条规则:
如果要找A的Firstvt,A的候选式中出现:
A->
a.......,即以终结符开头,该终结符入Firstvt
B.......,即以非终结符开头,该非终结符的Firstvt入A的Firstvt
Ba.....,即先以非终结符开头,紧跟终结符,则终结符入
为了计算方便,建立一个布尔数组F[m,n](m为非终结字符的个数,n为终结字符的个数)和一个后进先出栈STACK。
将所有的非终结符排序,用iA表示非终结符A的序号,再将所有的终结符排序,用ia表示终结符a的序号。
算法的目的是要使数组的一个元素最终取值满足:
F[iA,ja]的值为真,当且仅当a属于FirstVT(A)。
至此,显然所有的非终结符的FirstVT集已完全确定。
步骤如下:
首先按规则①对每个数组元素附初值。
观察这些初值,若F[iA,ia]的值是真,则将(A,a)推入栈中,直至对所有数组的初值都按此处理完。
然后对栈做如下运算。
将栈顶项弹出,则令其变为真,且将(A,a)推进栈,如此重复直到栈弹空为止。
Lastvt集:
找Lastvt的三条规则:
如果要找A的Lastvt,A的候选式中出现:
.......a,即以终结符结尾,该终结符入Lastvt
.......B,即以非终结符结尾,该非终结符的Lastvt入A的Lastvt
.....aB,即先以非终结符结尾,前面是终结符,则终结符入Firstvt
数据结构:
布尔数组F[P,a]:
F[P,a]为真当且仅当a?
LASTVT(P)。
开始时,按上述规则
(1)对每个数组元素F[P,a]赋初值。
栈STACK:
把所有初值为真的数组元素F[P,a]的符号对(P,a)全都放入STACK中。
计算过程:
如果栈STACK不空,就将顶项逐出,记此项为(Q,a)。
对于每个形如
P→Q…
的产生式,若F[P,a]为假,则改变其值为真且将(P,a)推进STACK栈。
上述过程必须一直重复,直至栈STACK拆空为止。
四、详细设计
voidmain()//主函数
{
inti,j,k=0;
printf("
请输入文法规则数:
"
);
scanf("
%d"
&
r);
请输入文法规则:
\n"
for(i=0;
i<
r;
i++)
{
scanf("
%s"
st[i]);
//存储文法规则,初始化FIRSTVT集和LASTVT集*/
first[i][0]=0;
/*first[i][0]和last[i][0]分别表示st[i][0]非终极
符的FIRSTVT集和LASTVT集中元素的个数*/
last[i][0]=0;
}
i++)//判断文法是否合法
for(j=0;
st[i][j]!
='
\0'
;
j++)
{
if(st[i][0]<
'
A'
||st[i][0]>
Z'
)
{
printf("
不是算符文法!
exit(-1);
}
if(st[i][j]>
&
st[i][j]<
if(st[i][j+1]>
st[i][j+1]<
{
printf("
}
}
if((st[i][j]<
||st[i][j]>
)&
-'
>
|'
lable[k++]=st[i][j];
lable[k]='
#'
lable[k+1]='
table();
每个非终结符的FIRSTVT集为:
//输出每个非终结符的FIRSTVT集
printf("
%c:
"
st[i][0]);
j<
first[i][0];
printf("
%c"
first[i][j+1]);
每个非终结符的LASTVT集为:
//输出每个非终结符的LASTVT集
last[i][0];
last[i][j+1]);
算符优先分析表如下:
lable[i]!
i++)
\t%c"
lable[i]);
k+1;
%c\t"
data[i][j]);
请输入文法输入符号串以#结束:
input);
deal();
}
voidfirstvt(charc)//求FIRSTVT集的函数
inti,j,k,m,n;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理