词法分析报告器地构造南邮编译原理实验一报告材料.docx
《词法分析报告器地构造南邮编译原理实验一报告材料.docx》由会员分享,可在线阅读,更多相关《词法分析报告器地构造南邮编译原理实验一报告材料.docx(14页珍藏版)》请在冰豆网上搜索。
词法分析报告器地构造南邮编译原理实验一报告材料
实验报告
(2015/2016学年第二学期)
课程名称
编译原理
实验名称
词法分析器的构造
实验时间
2016
年
4
月
29
日
指导单位
计算机软件教学中心
指导教师
学生姓名
wujun
班级学号
学院(系)
计算机学院、软件学院
专业
计算机科学
与技术
实验报告
实验名称
词法分析器的构造
指导教师
实验类型
设计
实验学时
4
实验时间
2016.4.29
一、实验目的和要求
1、实验目的:
设计、编制、调试一个词法分析程序,对单词进行识别和编码,加深对词法分析原理的理解。
2、实验要求:
1)、允许用户自己输入源程序并保存为文件;
2)、系统能够输出经过预处理后的源程序(去掉注释、换行、空格等);
3)、能够将该源程序中所有的单词根据其所属类型(整数、保留字、运算符、标识符等。
定义的类C语言中的标识符只能以字母或下划线开头)进行归类显示,例如:
识别保留字:
if、int、for、while、do、return、break、continue等,其他的都识别为标识符;常数为无符号整形数;运算符包括:
+、-、*、/、=、>、<、>=、<=、!
=等;分隔符包括:
、;、{、}、(、)等;
4)、实现文件的读取操作,而不是将文本以字符串形式预存于程序中。
文本内容为待分析的类C语言程序。
二、实验环境(实验设备)
硬件:
计算机
软件:
VisualC++6.0
二、实验原理及内容
1、实验内容:
设计并实现一个词法分析器,实现对指定位置的类C语言源程序文本文件的读取,并能够对该源程序中的所有单词进行分类,指出其所属类型,实现简单的词法分析操作。
例如下面为一段C语言源程序:
main(){
int a,b;
a=10;
b=a+20;
}
要求输出如下:
(2,’main’)
(5,’(’)
(5,’)’)
(5,’)’)
(5,’)’)
(5,’)’)
(5,’{’)
(1,’int’)
(2,’a’)
(5,’,’)
(2,’b’)
(5,’;’)
(2,’a’)
(4,’=’)
(3,’10’)
(5,’;’)
(2,’b’)
(4,’=’)
(2,’a’)
(4,’+’)
(3,’20’)
(5,’;’)
(5,’}’)
2、实验原理状态转换图
3、实验代码:
实验代码:
#include
#include
#include
#include
#include
#include
structChar{//创建一个结构用于存贮关键字
chara[15];
};
typedefstructCharCH;
//定义关键字
CHkeyWord[67]={"auto","break","case","cout","cin","char","const","continue","default",
"do","double","else","enum","endl","extern","float","for","goto","if","main",
"include","int","long","register","return","short","signed","sizeof","static",
"string","struct","switch","typedef","union","unsigned","void","stdio","while",
"cin","cout","catch","calss","ctype","stdlib","fstream","export","iostream",
"false","friend","inline","mutable","namespace","new","operator","private",
"protected","public","static_cast","template","this","throw","true","try",
"typename","using","virtual","asm"};
//检测是否为数字,是返回true,否则返回false
boolIsDigit(charA){
if(A>='0'&&A<='9')
returntrue;
else
returnfalse;
}
//检测是否为字符,是则返回true,否则返回false
boolIsLetter(charch){
if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))
returntrue;
returnfalse;
}
//检测是否为分隔符,是则返回true,否则返回false
boolIsSeparator(charch){
if(ch=='('||ch==')'||ch=='{'||ch=='}'||ch==';'||ch==','||ch=='.'||
ch==':
'||ch=='\''||ch=='\"'||ch=='['||ch==']'||ch=='#'||ch=='_')
returntrue;
returnfalse;
}
//检测是否为关键字,是则返回true,否则返回false
boolIsKeyWord(char*a){
inti=0;
for(i;i<67;i++)
if(strcmp(a,keyWord[i].a)==0){
returntrue;
}
returnfalse;
}
//预处理去掉注释、换行、空格等
voidScanner(chars[],chara[]){
inti=0,j=0,k=strlen(s);
for(i;iif(s[i]=='/'&&s[i+1]=='/'){
do{
i++;
}while(s[i]!
='\n');
i--;
}
elseif(s[i]=='/'&&s[i+1]=='*'){
do{
i++;
}while(s[i]!
='/'||s[i-1]!
='*');
continue;
}
elseif(s[i]=='\t'||s[i]=='\n'||s[i]=='?
')
a[j++]='';
else
a[j++]=s[i];
}
cout<<"\n系统经过预处理后的输出(去掉注释和换行):
"<cout<cout<<"系统经过预处理后的输出(去掉注释、换行、空格等):
"<for(i=0;iif(a[i]=='')
continue;
else
cout<}
cout<}
voidHandle(chars[]){//词法分析
charch;
for(intj=0;jcharword[20]={'\0'};
inti=0;
ch=s[j];
if(ch=='')
continue;
elseif(IsLetter(ch)){
do{
word[i++]=ch;
ch=s[++j];
}while(IsLetter(ch)||IsDigit(ch)||ch=='_');
j--;
word[i]='\0';
if(IsKeyWord(word))
cout<<"(1,'"<else
cout<<"(2,'"<}
elseif(IsDigit(ch)){
do{
word[i++]=ch;
ch=s[++j];
}while(IsDigit(ch));
j--;
word[i]='\0';
cout<<"(3,'"<}
elseif(IsSeparator(ch)){
word[0]=ch;
cout<<"(5,'"<}
else{
word[0]=ch;
if(word[0]=='+'||word[0]=='-'||word[0]=='>'||word[0]=='<'||
word[0]=='&'||word[0]=='|'){
if(s[j+1]==word[0]||s[j+1]=='='){
word[1]=s[++j];
cout<<"(4,'"<}
else
cout<<"(4,'"<}
elseif(word[0]=='='||word[0]=='*'||word[0]=='/'||
word[0]=='!
'||word[0]=='%'||word[0]=='^'){
if(s[j+1]=='='){
word[1]=s[++j];
cout<<"(4,'"<}
else
cout<<"(4,'"<}
elseif(word[0]=='\\'){
if(s[j+1]=='n'||s[j+1]=='t'||
s[j+1]=='\\'||s[j+1]=='0'){
word[1]=s[++j];
cout<<"(4,'"<}
else
cout<<"(4,'"<}
else
cout<<"(无法识别字符,'"<}
}
cout<<"\n";
}
intmain(){
inti;
charb=32,ch;
FILE*fp;
do{
i=0;
chars[10000];
chara[10000]={'\0'};
fp=fopen("code.txt","rb+");
if(fp==NULL){
cout<<"Cannotcreatefile"<exit(0);
}
fseek(fp,0,2);
cout<<"Pleaseinputyoucode(endwithtwo'?
'):
"<do{
ch=getchar();
s[i++]=ch;
if(ch=='\n'||ch=='\t')
for(intj=0;j<4;j++)
fputc(b,fp);
fputc(ch,fp);
}while(s[i-1]!
='?
'||s[i-2]!
='?
');
s[i]='\0';
Scanner(s,a);
cout<<"词法分析如下:
"<Handle(a);
fclose(fp);
}while(true);
return0;
}
4、实验测试和截图
(1)、测试一截图
输入代码:
输出结果:
(2)测试二截图
输入代码:
输出结果:
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
在本实验中,我进一步学习了如何运用输入输出流,对文件进行读写操作。
了解了什么是词法分析,熟悉了词法分析器的构造,更加深入了对词法分析原理的理解。
程序将字符分为五类:
保留字、标识符、整数、运算符、分隔符,对使用者输入的程序代码进行识别、分析和编码,简单分析了词法。
实验过程中开始时由于对换行符(\n)、制表符(\t)、和注释等处理不好导致实验失败,后来预处理时讲它们全部换成空格符和把注释去掉才成功。
五、指导教师评语
成绩
批阅人
日期