C++源代码单词扫描程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
院系:计算机学院
实验课程:编译原理实验
实验项目:C++源代码单词扫描程序(词法分析)
指导老师:黄煜廉
一.实验项目
C++源代码单词扫描程序(词法分析)
二.实验要求
1.C++源代码扫描程序识别C++记号。C++语言包含了几种类型的记号:标识符,关键字,数(包括整数、浮点数),字符串、注释、特殊符号(分界符)和运算符号等。
2.打开一个C++源文件,打印出所有以上的记号。
3.要求应用程序应为Windows界面。
4.选作部分:为了提高C++源程序的可读性,C++程序在书写过程中加入了空行、空格、缩进、注释等。假设你想牺牲可读性,以节省磁盘空间,那么你可以存贮
一个删除了所有不必要空格和注释的C++源程序的压缩文本。因此,程序中还应该有这样的压缩功能。
5.选作部分:进一步思考或实现——如何进一步实现减小源文件大小的压缩功能。
6.应该书写完善的软件文档。
三.需求分析
1.根据所需的功能程序应分为分析关键字、分析标识符、分析数字、分析串、分析注释、分析特殊字符和过滤多余字符几部分。
2.关键字有iostream.h.main.while.goto include for break case if struct class等。
3.过滤字符要考虑到空格和换行。
四.实验代码
五.#include
六.#include
七.#include
八.#include
九.#include
十.FILE*fp;
十一.char string(char c[]);//字符串处理
十二.char ch;
十三.char*operate[6]={"+","-","*","/","++","--"};
十四.char*note[4]={"//","/*","*/","\""};
十五.char
*symbol[31]={"%","$","^","&","_","#","<","<=","=",">",">=","<>","<<","==","!="," &&","||","!",
十六.",",";",":=",".","(",")","{","}","&&","||","!","()",">>"};
十七.char
*keyword[35]={"iostream.h","include","break","case","char","const","continue","def ault","do","double",
十八."else","enum","cin","float","for","goto","if","int","long","cout",
十九."return","short","signed","sizeof","static","struct","switch","typedef","printf",二十."union","unsigned","void","volatile","while","main"};
二十一.
二十二.int search(char searchstr[],int type)//符号匹配查找
二十三.{
二十四.int i;
二十五.switch(type)
二十六.{
二十七.case1:for(i=0;i<35;i++)
二十八.{
二十九.if(strcmp(keyword[i],searchstr)==0)
三十.return1;
三十一.
三十二.}
三十四.{
三十五.for(i=0;i<=5;i++)
三十六.{
三十七.if(strcmp(operate[i],searchstr)==0)三十八.return1;
三十九.}
四十.break;
四十一.}
四十二.case3:for(i=0;i<31;i++)
四十三.{
四十四.if(strcmp(symbol[i],searchstr)==0)
四十五.return1;
四十六.}break;
四十七.case4:for(i=0;i<=3;i++)
四十八.{
四十九.
五十.if(!strcmp(note[i],searchstr)&&i==3)
五十一.{
五十二.string(searchstr);
五十三.break;
五十四.}
五十五.else if(!strcmp(note[i],searchstr))
五十六.return1;
五十七.
五十八.}break;
五十九.}
六十.return0;
六十一.}
六十二.
六十三.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<