下载此文档

词法分析器C++代码.doc


文档分类:IT计算机 | 页数:约4页 举报非法文档有奖
1/4
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/4 下载此文档
文档列表 文档介绍
该【词法分析器C++代码 】是由【1542605778】上传分享,文档一共【4】页,该文档可以免费在线阅读,需要了解更多关于【词法分析器C++代码 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。#include<>
#include<>
#defineMAX22/*分析表的最大容量*/
#defineRES_MAX10/*关键字的最大长度*/
#defineMAXBUF255/*缓冲区的大小*/
charch='';/*存放读入当前的输入字符*/
intLine_NO;/*纪录行号*/
structreserve/*关键字*/
{
charlexptr[MAXBUF];
inttoken;
};
structreservesymtable[MAX];
charstr[MAX][10]={"program","begin","end","var","integer","real","for","if","then","else","do","while","array","procedure","function","of","boolean","const","div","mod","and","or"};
voidinit()/*对关键字表进行初始化,div,mod,and,or也作为关键字处理*/
{/*最小的token是program:3,最大的token是or:24*/
intj;
for(j=0;j<MAX;j++)
{
strcpy(symtable[j].lexptr,str[j]);
symtable[j].token=j+3;
}
}
/***************对关键字进行搜索**************/
intse_res(char*is_res)
{
inti;
for(i=0;i<MAX;i++){
if((strcmp(symtable[i].lexptr,is_res))==0)break;
}
if(i<MAX)returnsymtable[i].token;
elsereturn0;
}
/*****************判断是否为字母*****************/
intIsLetter(charc)
{
if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))return1;
elsereturn0;
}
/*************判断是否为数字**************/
intIsDigit(charc){
if(c>='0'&c<='9')return1;
elsereturn0;
}
/***************分析程序**************/
voidanalyse(FILE*fpin,FILE*fpout){
chararr[MAXBUF];/*输入缓冲区,存放一个单词符号*/
intj=0;
while((ch=fgetc(fpin))!=EOF)
{
if(ch==''||ch=='\t'){}/*碰到空格、tab则跳过*/
elseif(ch=='\n'){Line_NO++;}
/*************************字符串的处理****************************/
elseif(IsLetter(ch)){
while(IsLetter(ch)|IsDigit(ch))
{
if((ch<='Z')&&(ch>='A'))
ch=ch+32;/*忽略大小写*/
arr[j]=ch;
j++;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);/*输入指针回退一个字符*/
arr[j]='\0';
j=0;
if(se_res(arr)){/*如果是关键字*/
fprintf(fpout,"%s\t\t%d\n",arr,se_res(arr));
}elsefprintf(fpout,"%s\t\t%d\n",arr,1);/*普通标识符*/
/*************************数字的处理****************************/
}elseif(IsDigit(ch)){
while(IsDigit(ch)){
arr[j]=ch;
j++;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
arr[j]='\0';
j=0;
fprintf(fpout,"%s\t\t%d\n",arr,2);/*无符号整数*/
}elseswitch(ch){
case'+':fprintf(fpout,"%s\t\t%d\n","+",41);break;
case'-':fprintf(fpout,"%s\t\t%d\n","-",42);break;
case'*':fprintf(fpout,"%s\t\t%d\n","*",43);break;
case'(':fprintf(fpout,"%s\t\t%d\n","(",25);break;
case')':fprintf(fpout,"%s\t\t%d\n",")",26);break;
case'[':fprintf(fpout,"%s\t\t%d\n","[",27);break;
case']':fprintf(fpout,"%s\t\t%d\n","]",28);break;
case';':fprintf(fpout,"%s\t\t%d\n",";",36);break;
case'=':fprintf(fpout,"%s\t\t%d\n","=",38);break;
case'.':fprintf(fpout,"%s\t\t%d\n",".",39);break;
case',':fprintf(fpout,"%s\t\t%d\n",",",40);break;
case':':{ch=fgetc(fpin);
if(ch=='=')fprintf(fpout,"%s\t\t%d\n",":=",29);
else{fprintf(fpout,"%s\t\t%d\n",":",30);fseek(fpin,-1L,SEEK_CUR);}
}break;
case'>':{ch=fgetc(fpin);
if(ch=='=')fprintf(fpout,"%s\t\t%d\n",">=",30);
else{fprintf(fpout,"%s\t\t%d\n",">",31);fseek(fpin,-1L,SEEK_CUR);}
}break;
case'<':{ch=fgetc(fpin);
if(ch=='=')fprintf(fpout,"%s\t\t%d\n","<=",34);
elseif(ch=='>')fprintf(fpout,"%s\t\t%d\n","<>",35);
else{fprintf(fpout,"%s\t\t%d\n","<",33);fseek(fpin,-1L,SEEK_CUR);}
}break;
/***************出现在{}之间的全部作为注释部分处理*******************/
case'{':{ch=fgetc(fpin);
while(ch!='}'&&ch!=EOF){ch=fgetc(fpin);}
if(ch==EOF)fprintf(fpout,"缺少一个'}'");
}break;
/***************非法字符*******************/
default:fprintf(fpout,"在第%d行无法识别的字符\t%c\n",Line_NO,ch);
}
}
}
/**********主程序中完成对输入输出文件的读写***********/
intmain()
{
charin_fn[25],out_fn[25];
FILE*fpin,*fpout;
printf("//////////////cifafenxiqi////////////////\n");
printf("inputtheinputfileexmaple::\n");
scanf("%s",in_fn);
printf("inputtheoutputfileexmaple::\n");
scanf("%s",out_fn);
fpin=fopen(in_fn,"r");
fpout=fopen(out_fn,"w");
init();
analyse(fpin,fpout);
fclose(fpin);
fclose(fpout);
//system("pause");
return0;
}

词法分析器C++代码 来自淘豆网m.daumloan.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数4
  • 收藏数0 收藏
  • 顶次数0
  • 上传人1542605778
  • 文件大小22 KB
  • 时间2023-03-09
最近更新