C++源代码单词扫描程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 <iostream.h>
六.#include <stdio.h>
七.#include <string.h>
八.#include <ctype.h>
九.#include <conio.h>
十.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","default"," 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)
二十六.{
二十七.case 1:for(i=0;i<35;i++)
二十八.{
二十九.if(strcmp(keyword[i],searchstr)==0)
三十.return 1;
三十一.
三十二.}
三十三.case 2:
三十四.{
三十五.for(i=0;i<=5;i++)
三十六.{
三十七.if(strcmp(operate[i],searchstr)==0)
三十八.return 1;
三十九.}
四十.break;
四十一.}
四十二.case 3: for(i=0;i<31;i++)
四十三.{
四十四.if(strcmp(symbol[i],searchstr)==0)
四十五.return 1;
四十六.}break;
四十七.case 4: for(i=0;i<=3;i++)
四十八.{
四十九.
五十.if(!strcmp(note[i],searchstr)&&i==3)
五十一.{
五十二.string(searchstr);
五十三.break;
五十四.}
五十五.else if(!strcmp(note[i],searchstr))
五十六.return 1;
五十七.
五十八.}break;
五十九.}
六十.return 0;
六十一.}
六十二.
六十三.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<<letter<<" "<<"关键字"<<endl; 七十六.}
七十七.else
七十八.{
七十九.cout<<letter<<" "<<"标识符"<<endl; 八十.}
八十一.return(ch);
八十二.}
八十三.
八十四.
八十五.char number(char ch)//数字处理
八十六.{
八十七.int i=-1;
八十八.char num[20];
八十九.while (isdigit(ch)!=0)
九十.{
九十一.num[++i]=ch;
九十二.ch=fgetc(fp);
九十三.}
九十四.if(isalpha(ch)!=0)
九十五.{
九十六.while(!isspace(ch))
九十七.{
九十八.num[++i]=ch;
九十九.ch=fgetc(fp);
一○○.}
一○一.num[i+1]='\0';
一○二.cout<<num<<""<<"错误!"<<endl;
一○三.goto loop;
一○四.}
一○五.num[i+1]='\0';
一○六.cout<<num<<" "<<"数字"<<endl;
一○七.loop: return(ch);
一○八.}
一○九.
一一○.
一一一.char other(char ch)
一一二.{
一一三.int i=-1;
一一四.char other[1000];
一一五.if (isspace(ch)) //是空格
一一六.{
一一七.ch=fgetc(fp);
一一八.goto loop;
一一九.}
一二○.while ((!isspace(ch))&&(!isalnum(ch))) //不是空格且不是字母或数字一二一.{
一二二.other[++i]=ch;
一二三.ch=fgetc(fp); //若是字母,不是空格的判断没有写出来
一二四.}
一二五.other[i+1]='\0';
一二六.if (search(other,2))
一二七.cout<<other<<" "<<"算数运算符"<<endl;
一二八.else
一二九.if (search(other,3))
一三○.cout<<other<<" "<<"特殊符号"<<endl;
一三二.if (search(other,4))
一三三.cout<<other<<" "<<"注释符"<<endl; 一三四.loop: return (ch);
一三五.}
一三六.char string(char c[])//字符串
一三七.{
一三八.int i=0 ;
一三九.//char ch;
一四○.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<<stri<<" "<<"字符串"<<endl;
一五一.return(ch);
一五二.}
一五三.int main ()
一五四.{
一五五.char str,c;
一五六.cout<<"Please enter a file name:";
一五七.char FileName[100];
一五八.cin>>FileName;
一五九.fp=fopen(FileName,"r");
一六○.
一六一.
一六二.if(fp==NULL)
一六三.{
一六四.cout<<"Unable to open file!"<<endl;
一六五.return 0;
一六六.}
一六七.else
一六八.{
一六九.cout<<"Open the file successfully!"<<endl;
一七○.cout<<fp<<endl;
一七一.str=fgetc(fp);
一七二.while (str!=EOF)
一七三.{
一七四.if (isalpha(str))
一七五.str=letter(str);
一七六.else
一七八.if (isdigit(str))
一七九.str=number(str);
一八○.else
一八一.str=other(str);
一八二.}
一八三.}
一八四.cout<<"endl"<<endl;
一八五.
一八六.}
一八七.c=getch();
一八八.return 0;
一八九.}
一九○.运行结果
1.成功运行
2.未找到文件时
一九一.参考文献《编译原理及实践》《C++程序设计》。

相关文档
最新文档