编译原理词法分析实验一词法分析扫描器的设计实现.docx
- 文档编号:6176161
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:19
- 大小:88.26KB
编译原理词法分析实验一词法分析扫描器的设计实现.docx
《编译原理词法分析实验一词法分析扫描器的设计实现.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析实验一词法分析扫描器的设计实现.docx(19页珍藏版)》请在冰豆网上搜索。
编译原理词法分析实验一词法分析扫描器的设计实现
编译原理程序设计实验报告
——实验题目
班级:
计算机1306姓名:
学号:
289
实验目标:
词法分析扫描器的设计实现
实验内容:
1.概要设计
1)主函数:
每次从文件中读取一个字符,不是#,继续判断其是否是0~9数字,是进入isnumber()函数,否继续判断其是否是a~z或A~Z,是进入isalpha()函数,否继续判断是否是空格或换行符,是继续读下一个字符,否进入isother()函数。
2)Isnumber():
读字符,将数字(包括小数点)全部接收,并存入常数表。
3)Isalpha():
读字符,将a~z或A~Z(包括下划线)全部接收,与关键字表比较,匹配,输出序号,否则存入标识符表。
4)Isother():
读字符,将符号都接受,与界符表比较,匹配输出序号,遇到”或’分别存入字符表和字符串表。
2.流程图
T
F
T
F
T
F
F
3.关键函数
voidIsNumber();//读的是数字
voidIsAlpha();//读的是关键字和标示符
intIsOther();//读字符、字符串、界符
源程序代码:
(加入注释)
#include
#include
#include
#include
usingnamespacestd;
/***********定义结构体***********/
typedefstructToken
{
charname[20];
intstate;//状态,为0是标识符,为1是字符,为2是字符串,为3是数字,为4是关键字,为5是界符
}Token;
typedefstructSTR//
{
charname[20];
intcode;
}STR;
STRiT[10];
STRcT[20];
STRsT[20];
STRCT[20];
STRKT[10]={{"int",4},{"main",5},{"void",6},{"if",7},{"else",8},{"char",9}};
STRPT[30]={{">=",10},{"<=",11},{"==",12},{"=",13},{">",14},{"<",15},{"+",16},{"-",17},{"*",18},{"/",19},
{"{",20},{"}",21},{",",22},{";",23},{"(",24},{")",25},
{"[",26},{"]",27}};
/***********全局变量声明*********/
TokenCurrentToken;//正在读的token
Tokentoken[200];
FILE*fp;//源文件指针
charch;//读取字符
intstate=0;//0表示标识符,1表示字符,2表示字符串
intiT_i=0;//iT结构体数组下标
intcT_i=0;
intsT_i=0;
intCT_i=0;
intindex=0;//token的下标
/***函数声明***/
voidIsNumber();//读的是数字
voidIsAlpha();//读的是字母,关键字和标示符
intIsOther();//,;+-
/******************主函数**********************/
intmain()
{
inti=0;
if((fp=fopen("source.txt","r"))==NULL)
{
cout<<"cannotopenthesourcefile!
\n"< exit (1); } ch=fgetc(fp);//文件中读一个字符 while(ch! ='#') { for(i=0;i<20;i++) CurrentToken.name[i]='\0';//将单词缓冲区初始化 if((ch>='0')&&(ch<='9'))//数字 IsNumber(); elseif(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))||(ch=='_'))//关键字和标识符 { IsAlpha(); } elseif(ch==''||ch=='\n') { ch=fgetc(fp); } else IsOther(); } cout< for(i=0;i<=index;i++) { cout< } cout< cout<<"finish"< return0; } /************数字处理****************/ voidIsNumber() { intk=0; while(((ch>='0')&&(ch<='9'))) { CurrentToken.name[k++]=ch;//将数字放入单词缓冲区 ch=fgetc(fp); } boolflag=1; if(ch=='.') { CurrentToken.name[k++]=ch; ch=fgetc(fp); if(((ch<'0')||(ch>'9'))) { CurrentToken.name[k++]=ch; flag=0; } else { while(((ch>='0')&&(ch<='9'))) { CurrentToken.name[k++]=ch;//将数字放入单词缓冲区 ch=fgetc(fp); } } } if(flag==1) { strcpy(CT[CT_i++].name,CurrentToken.name); strcpy(token[index].name,CurrentToken.name); token[index++].state=3; //cout< cout<<"<03>"; } else cout< } /************是否为关键字****************/ voidIsAlpha() { inti=0; if(state==0) { boolflag=0; while(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))||ch=='_')//将完整的单词放入单词缓冲区 { CurrentToken.name[i++]=ch; ch=fgetc(fp); } flag=0;//判断是否是关键字 for(i=0;i<7;i++) { if(strcmp(CurrentToken.name,KT[i].name)==0) { flag=1; //printf("%s<%02d>\n",CurrentToken.name,KT[i].code); strcpy(token[index].name,CurrentToken.name); token[index++].state=4; printf("<%02d>",KT[i].code); break; } } if(flag! =1) { while(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))||ch=='_'||((ch>='0')&&(ch<='9'))) { CurrentToken.name[i++]=ch; ch=fgetc(fp); } //printf("%s<00>\n",CurrentToken.name); printf("<00>"); strcpy(token[index].name,CurrentToken.name); token[index++].state=0; inttag=0; for(intj=0;j { if(strcmp(CurrentToken.name,iT[j].name)==0) { tag=1; break; } } if(tag==0) { strcpy(iT[iT_i].name,CurrentToken.name); iT[iT_i++].code=0; } } } } /***************其它************/ intIsOther() { inti; for(i=0;i<20;i++) { CurrentToken.name[i]='\0';//将缓冲区初始化 } boolflag=0; switch(ch) { case'>': { CurrentToken.name[0]='>'; flag=1; ch=fgetc(fp); if(ch=='=') { CurrentToken.name[1]='='; ch=fgetc(fp); break; } else { break; } } case'<': { CurrentToken.name[0]='<'; flag=1; ch=fgetc(fp); if(ch=='=') { CurrentToken.name[1]='='; ch=fgetc(fp); break; } else { break; } } case'=': { CurrentToken.name[0]='='; flag=1; ch=fgetc(fp); if(ch=='=') { CurrentToken.name[1]='='; ch=fgetc(fp); break; } else { break; } } case'+': { CurrentToken.name[0]='+'; break; } case'-': { CurrentToken.name[0]='-'; break; } case'*': { CurrentToken.name[0]='*'; break; } case'/': { CurrentToken.name[0]='/'; break; } case'{': { CurrentToken.name[0]='{'; break; } case'}': { CurrentToken.name[0]='}'; break; } case',': { CurrentToken.name[0]=','; break; } case';': { CurrentToken.name[0]=';'; break; } case'(': { CurrentToken.name[0]='('; break; } case')': { CurrentToken.name[0]=')'; break; } case'[': { CurrentToken.name[0]='['; break; } case']': { CurrentToken.name[0]=']'; break; } case'\'': { CurrentToken.name[0]='\''; ch=fgetc(fp); if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { CurrentToken.name[1]=ch; ch=fgetc(fp); if(ch=='\'') { CurrentToken.name[2]='\''; cout<<"<01>"; strcpy(token[index].name,CurrentToken.name); token[index++].state=1; inttag=0; for(intj=0;j<=cT_i;j++) { if(strcmp(cT[cT_i].name,CurrentToken.name)==0) tag=1; } if(tag==0) { strcpy(cT[cT_i++].name,CurrentToken.name); } ch=fgetc(fp); return0; } else { cout<<"error1"; exit (1); } } else { cout<<"error2"; exit (1); } } case'\"': { intj=1; CurrentToken.name[0]='\"'; ch=fgetc(fp); while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { CurrentToken.name[j++]=ch; ch=fgetc(fp); } if(ch=='\"') { CurrentToken.name[j++]='\"'; cout<<"<02>"; strcpy(token[index].name,CurrentToken.name); token[index++].state=1; inttag=0; for(intj=0;j<=sT_i;j++) { if(strcmp(sT[sT_i].name,CurrentToken.name)==0) tag=1; }if(tag==0) { strcpy(sT[sT_i++].name,CurrentToken.name);} ch=fgetc(fp); return0; } else { cout<<"error3"; exit (1); } } } if(CurrentToken.name[0]! ='\0') { for(i=0;i<20;i++) if(strcmp(CurrentToken.name,PT[i].name)==0) { //printf("%s<%d>\n",CurrentToken.name,PT[i].code); printf("<%d>",PT[i].code); strcpy(token[index].name,CurrentToken.name); token[index++].state=PT[i].code; break; } } if(flag! =1) ch=fgetc(fp); //while(ch==''||ch=='\n')ch=fgetc(fp); return0; } 程序运行结果: (截屏) 输入: Source.txt文本 intmain(void) { inta=1,d=2,c; if(a<=d) { c=a; a=d; d=c; } charch[10]="ok"; charx,y='a'; c=a+d; } } # 输出: 目录 第一章项目总论-1- §1.1项目简介-1- §1.2可行性研究的范围-2- §1.3编制依据-2- 第二章项目建设背景及必要性-3- §2.1橡胶密封件项目提出的背景-3- §2.2国家产业政策-6- §2.3项目建设的必要性-8- 第三章项目优势-11- §3.1市场优势-11- §3.2技术优势-16- §3.3组织优势-17- §3.4政策优势: 关中—天水经济区发展规划-17- §3.5区域投资环境优势-17- 第四章产品介绍与技术介绍-20- §4.1橡胶密封件产品介绍-20- §4.2产品标准-21- §4.3产品特征及材质-21- §4.4产品方案-26- §4.5产品技术来源-27- 第五章项目产品发展预测-28- §5.1产品行业关联环境分析-28- §5.2行业竞争格局与竞争行为-33- §5.3竞争力要素分析-39- §5.4项目发展预测-41- §5.5竞争结构分析及预测-43- 第六章项目产品规划-47- §6.1项目产品产能规划方案-47- §6.2产品工艺规划方案-47- §6.3项目产品营销规划方案-51- 第七章项目建设规划-58- §7.1项目建设总规-58- §7.2项目项目建设环境保护方案-61- §7.3项目建设节能方案-65- §7.4项目建设消防方案-66- §7.5项目建设生产劳动安全方案-69- 第八章项目组织实施情况-73- §8.1项目组织-73- §8.2项目劳动定员和人员培训-74- §8.3项目管理与实施进度安排-77- §8.4工程招标-80- 第九章项目财务评价分析-82- §9.1项目总投资及资金筹措-82- §9.2项目财务评价依据及相关说明-83- §9.3项目总成本费用估算-84- §9.4销售收入、销售税金及附加和增值税估算-84- §9.5利润分配估算-85- §9.6借款偿还计划-85- §9.7现金流估算-85- §9.8不确定性分析-86- §9.9风险分析-88- 第十章项目经济、社会效益评价-90- §10.1经济效益评价-90- §10.2社会效益评价-90- 第十一章可行性研究结论与建议-91- §11.1研究结论-91- §11.2建议-91-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析 实验 扫描器 设计 实现