源程序的预处理及词法分析程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//词法分析
#include
#include
#include
#include
using namespace std;
void chu_li_1(FILE *p,FILE *q) //处理空格
{
charch;
if((p=fopen("输出文件.txt","r+"))==NULL) //shili3.txt为中转文件{
cout<<"输出文件打开错误"< } if((q=fopen("中转文件.txt","w+"))==NULL) //保存处理后程序的文件{ cout<<"中转文件打开错误"< } while(!feof(p)) { ch=fgetc(p); if(ch!=32) fputc(ch,q); //保留一个空格 else if(ch==32) //将多个空格删除 { fputc(ch,q); while(1&&(ch!=EOF)) { ch=fgetc(p); if(ch!=32) //空格结束 { fputc(ch,q); break; } } } } fclose(p); fclose(q); } void chu_li_2(FILE *p,FILE *q) //处理换行 { charch; if((p=fopen("中转文件.txt","r+"))==NULL) { cout<<"中转文件打开错误"< } if((q=fopen("输出文件.txt","w+"))==NULL) { cout<<"输出文件打开错误"< } while((ch=fgetc(p))!=EOF) { if(ch!='\n') //忽略换行符 fputc(ch,q); } fclose(p); fclose(q); } void chu_li_3(FILE *p,FILE *q) //处理注释 { charch; if((p=fopen("输入文件.txt","r+"))==NULL) //程序输入文件{ if((p=fopen("输入文件.txt","w+"))==NULL) //程序输入文件 { cout<<"输入文件打开错误"< } } if((q=fopen("中转文件.txt","w+"))==NULL) { cout<<"中转文件打开错误"< } while((ch=fgetc(p))!=EOF) { if(ch==47) //程序中发现字符'/' { ch=fgetc(p); if(ch==42) //判断字符后'/'是否有字符'*' { while(1) { ch=fgetc(p); //忽略注释内容 if(ch==42) //直到有'*'出现 { ch=fgetc(p); if(ch==47) //判断结束 break; } } } else if(ch==47) //判断以"//"开头形式的注释 { while((ch!='\n')&&((ch=fgetc(p))!=EOF)) ch=fgetc(p); } else { fputc('/',q); //将不属于注释标示符的字符'/'写入文件 fputc(ch,q); // } } else fputc(ch,q); } fclose(p); fclose(q); } void Y_C_L(FILE *p,FILE *q) //预处理函数 { chu_li_3(p,q); //处理注释 chu_li_2(p,q); // 处理换行 chu_li_1(p,q); //处理空格 } voidFen_xi() { FILE *p,*q; charch; intm,n=0; char letter[20000]="\0"; char *rwtab[44]={"#","main","if","then","while","do","static", "int"," double","struct","break","else","long","switch", "case","typedef","char","return","const","float","short", "continue","for","void","sizeof","ID","NUM","+","-","*","/", ":",":=","<","<>","<=",">",">=","=","default","include",";","(", ")"}; if((p=fopen("中转文件.txt","r+"))==NULL)