《编译原理课程设计报告》.docx
- 文档编号:2831706
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:16
- 大小:68.52KB
《编译原理课程设计报告》.docx
《《编译原理课程设计报告》.docx》由会员分享,可在线阅读,更多相关《《编译原理课程设计报告》.docx(16页珍藏版)》请在冰豆网上搜索。
《编译原理课程设计报告》
目录
一、课程设计的目的………………………………………………………………2
二、课程设计的要求………………………………………………………………2
三、课程设计报告内容……………………………………………………………2
四、实验运行环境…………………………………………………………………2
五、实验设计步骤…………………………………………………………………2
六、变化后的正规文法………………………………………………………………2
七、状态图………………………………………………………………3
八、基本测试数据…………………………………………………………4
九.词法分析程序的数据结构与算法………………………………………………4
十、实验结果截图……………………………………………………………………12
十一、设计结果及体会………………………………………………………………12
十二、参考文献………………………………………………………………………12
一、课程设计的目的
加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。
二、课程设计要求
1.根据以下的正规式,编制正规文法,画出状态图;
标识符 <字母>(<字母>|<数字字符>)*
十进制数
(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*(ε|.)(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*
八进制数 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*(ε|.)(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*
十六进制数 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*(ε|.)
(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*
运算符和分隔符 + - * / > < = ( ) ;
关键字 if then else while do
2.根据状态图,设计词法分析函数intscan(),完成以下功能:
1)从键盘读入数据,分析出一个单词。
2)返回单词种别(用整数表示),
3)返回单词属性(不同的属性可以放在不同的全局变量中)。
3.编写测试程序,反复调用函数scan(),输出单词种别和属性。
三、课程设计报告内容
编制一个能够分析三种数、标识符、主要运算符和主要关键字的词法分析程序。
四、实验运行环境
PC微机
DOS操作系统或Windows操作系统
TurboC程序集成环境或VisualC++程序集成环境
五、实验设计步骤
1.根据状态图,设计词法分析算法
2.采用C语言,设计函数scan(),实现该算法
3.编制测试程序(主函数main)。
4.调试程序:
输入一组单词,检查输出结果。
六、变化后的正规文法:
<标识符>-><字母>(<字母>|<数字字符>)*
<十进制数>-><数字字符>
<八进制数>->0
<十六进制数>->0x
<运算符和分隔符>->+|-|*|/|>|<|=|(|)|;
<关键字>->if|then|else|while|do
<字母>->a|b|c|d|e|f|g|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|
R|S|T|U|V|W|X|Y|Z
<数字字符>->(0|1|2|3|4|5|6|7|8|9)<数字字符>|ε
七、状态图
图-1-
空白
0-9/a-z/A-Z
A-Z/a-z其它
0-9
1-9其它
0-9
非数字
0-7
00-7非0-7且…
00-7
x/X
非0-7
1-9/A-F/a-f
非(1-9/A-F/a-f)
+1-1…1
10-9/A-F/a-f
If/
while/非(1-9/A-F/a-f)
then/else/do
八、基本测试数据
输入数据例:
058+data>0x2f00then;
正确结果:
这些单词的单词种别及其属性
INT100
INT1058
+_
IDNdata
>_
INT1647
INT80
Then-
;-
九、词法分析程序的数据结构与算法
词法分析的算法思想主要是根据状态图来实现,由前面的状态图来进行结构的设计,具
体细节请参见“图1”的图示。
主要的数据结构如下所示:
unionchars{//联合,可存储字符串,整型和浮点型
charpro_char[15];
intpro_number;
floatreal;
};
structdata{//将每个单元用一个结构来存储
charkind[7];//类型即种别
intid;//所属的具体类型即种别号
unioncharspro;//属性值
};
种别与种别号的对应关系如下表所示:
种别种别号
INT101
INT82
INT163
标识符4
分隔符5
关键字6
出错7
REAL108
REAL89
REAL1610
完整代码如下:
#include
#include
unionchars{//联合,可存储字符串,整型和浮点型
charpro_char[15];
intpro_number;
floatreal;
};
structdata{//将每个单元用一个结构来存储,其内容包括:
类型,所属的具体类型,以及属性值
charkind[7];
intid;
unioncharspro;
};
intscan(char*a);//对每个用空格打断的单元进行进一步的分析,对其进行进一步的分类
voidPrints(chara[15],intid,inta_long);//将分析后的每个token输出
voidsave(char*a,intid,intx);//将分析后的结果保存到一个结构数组中
charnowChar[15];//临时的存储单元,用来存储被空格打断以后单元
charkinds[11][8]={"","INT10","INT8","INT16","IDN","","","","REAL10","REAL8","REAL16"};
//单词的不同种别
structdatalink[100];//用来存放词法分析以后的结果的结构数组
intlink_long=0;//全局变量
intscan(char*a)
{
intid;
inta_long=0;
intdoc=0;
while(*a!
=NULL){
nowChar[0]='\0';
a_long=0;
doc=0;
//对数值的判断及处理
if('0'<=*a&&*a<='9'){//如果第一个字符为数值
nowChar[a_long]=*a;
*a++;
a_long++;
//对十六进制的判断及处理
if(nowChar[0]=='0'&&(*a=='x'||*a=='X')){//如果第一个字符为0且第二个字符为x,则为十六进制数
nowChar[a_long]=*a;
*a++;
a_long++;
while(*a!
=NULL&&(('0'<=*a&&*a<='9')||('a'<=*a&&*a<='f')||('A'<=*a&&*a<='F')||*a=='.')){
nowChar[a_long]=*a;//一直将此十六进制数完全读入,若为浮点型的,则加以标记
if(*a=='.')
doc=1;
*a++;
a_long++;
}
nowChar[a_long]='\0';//判断输入的十六进制数是否合法
if(a_long==2){//输入的只有0x,则输入错误
Prints(nowChar,7,a_long);
return0;
}
if(doc)//输入的十六进制数是浮点型的
Prints(nowChar,10,a_long);//则将其具体的类型属性定为10
else//输入的十六进制数是整型的
Prints(nowChar,3,a_long);//则将其具体的类型属性定义为3
continue;
}
//对八进制的判断及处理
if(nowChar[0]=='0'&&'0'<=*a&&*a<='7'){//如果第一个字符为0且第二个字符为0~7,则为八进制数
nowChar[a_long]=*a;
*a++;
a_long++;
while(*a!
=NULL&&(('0'<=*a&&*a<='7')||*a=='.')){
nowChar[a_long]=*a;//一直将此八进制数完全读入,若为浮点型的,则加以标记
if(*a=='.')
doc=1;
*a++;
a_long++;
}
nowChar[a_long]='\0';
if(doc)//输入的八进制数是浮点型的
Prints(nowChar,9,a_long);//则将其具体的类型属性定为9
else//输入的十六进制数是整型的
Prints(nowChar,2,a_long);//则将其具体的类型属性定义为2
continue;
}
//对十进制数的判断及处理
else{
while(*a!
=NULL&&(('0'<=*a&&*a<='9')||*a=='.')){
nowChar[a_long]=*a;//一直将此十进制数完全读入,若为浮点型的,则加以标记
if(*a=='.')
doc=1;
*a++;
a_long++;
}
nowChar[a_long]='\0';
if(doc)//输入的十进制数是浮点型的
Prints(nowChar,8,a_long);//则将其具体的类型属性定为8
else//输入的十进制数是整型的
Prints(nowChar,1,a_long);//则将其具体的类型属性定义为1
continue;
}
}//完成了对数值的判断及处理
//对字符的判断及处理
else{
nowChar[a_long]=*a;
*a++;
a_long++;
//判断输入的字符是否为运算符或其他的分隔符
switch(nowChar[0])
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理课程设计报告 编译 原理 课程设计 报告