《编译原理及实践实验课程》实验一 C++源代码单词扫描程序(词法分析)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
院系:计算机学院
实验课程:编译原理及实践实验课程
实验项目:C++源代码单词扫描程序(词法分析)指导老师:XXX
开课时间:XXXX~ XXXX年度第 1学期
专业:XXXX
班级:XXXX级本X班
学生:XXX
学号:XXXXXXXX
实验一:C++源代码单词扫描程序(词法分析)
一、实验题目
C++包含了多种符号类型,主要有标识符、数(包括整数、浮点数)、关键字、注释、字符串、特殊符号、运算符号等等。通过编写一个C++源代码打你扫描程序,实现对扫描文件进行词法分析,并输出分析结果。
二、实验功能
1. C++源代码扫描程序识别C++记号
C++语言包含了几种类型的记号:标识符,关键字,数(包括整数、浮点数),字符串、注释、特殊符号(分界符)和运算符号等。
2. 打开一个C++源文件,打印出所有以上的记号
3. 要求应用程序应为Windows界面
4. 选作部分:
为了提高C++源程序的可读性,C++程序在书写过程中加入了空行、空格、缩进、注释等。假设你想牺牲可读性,以节省磁盘空间,那么你可以存贮一个删除了所有不必要空格和注释的C++源程序的压缩文本。因此,程序中还应该有这样的压缩功能。
5. 选作部分:
进一步思考或实现——如何进一步实现减小源文件大小的压缩功能。
6. 应该书写完善的软件文档。
三、实验思路
1. 通过文件流方式,实现字符的读取,因此先定义文件流名:
FILE *fp; //定义文件名,在文件流使用
2. 对于读取出来的字符,进行类型的判断,分别从以下函数实现:
(1)当读取的是字符串时,则调用字符串处理函数,声明如下:
c har string(char c[]); //字符串处理函数声明
(2)当读取的是字母时,则调用字母处理函数,声明如下:
char letter(char ch); //字母处理函数声明
(3)当读取的是数字时,则调用数字处理函数,声明如下:
char number(char ch); //数字处理函数声明
(4)当读取的既不是字符串,也不是字母,又不是数字,则调用其他处理函数,声明如下:
char other(char ch); //其他处理函数声明
3. 为了空格、换行等进行判断识别,调用了头文件为“ctype.h”中的函数isspace( )、isdigit( )、isalnum( )等。
四、源代码
1. 全局变量声明和定义
/**********全局变量的声明和定义***********/
FILE *fp; //定义文件名,在文件流使用
char string(char c[]); //定义字符串,用于字符串处理
char ch;
//定义字符数组,用于存放关键字
char *keyword[41]={"include","iostream","iostream.h","string","stdio","stdio.h","math.h", //头文件中关键字
"int","double","float","char","long","short","enum","struct", "typedef",//数据类型中的关键字
"if","else","switch","case","default","break","continue","return", //条件选择中的关键字
"do", "while","for","goto","Loop","cin","cout", "printf","sizeof", //循环中的关键字
"const","static","signed","unsigned","union","volatile","void","main"
//其他的关键字
};
//定于字符数组,用于存放运算符
char *operate[6]={"+","-","*","/","++","--"};
//定义字符数组,用于存放特殊符号
char
*symbol[31]={"%","$","^","&","_","#","<","<=","=",">",">=","<>","<<","==","!=","&&","||","!",
",",";", ":=", ".", "(", ")", "{", "}","&&","||","!","()",">>"
};
//定义字符数组,用于存放注释符号
char *note[3]={"//","/*","*/"};
2. 字符串处理函数
char string(char c[]) //字符串处理函数定义
{
int i=0 ;
char stri[100];
stri[i]=c[0];
ch=fgetc(fp);
while (ch!='"')
{
stri[++i]=ch;
ch=fgetc(fp);
}
stri[++i]=ch;
stri[++i]='\0';
cout< return (ch); } 3. 字母处理函数 char letter(char ch) //字母处理函数定义 { int i=-1; char letter[50]; while (isalnum(ch)||ch=='.') //是字母、头文件处理{ letter[++i]=ch; ch=fgetc(fp); } letter[i+1]='\0'; if (search(letter,1)) { cout< } else { cout< } return (ch); } 4. 字母处理函数