⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpp11.cpp

📁 编译原理实验、编译原理课程设计 vc++实现
💻 CPP
字号:
#include<iostream.h> 
#include<fstream.h> 
#include<stdlib.h> 
#include<stdio.h> 
#include<string.h> 
#include<conio.h> 
#include<process.h> /*头文件*/ 

void init(); 
char *DchangeB(char *buf); 
int search(char *buf,int type,int command); 
void intdeal(char *buffer); 
void chardeal(char *buffer); 
void errordeal(char error,int lineno); 
void scanner(); 

void init() 
{ char *key[]={"","auto","break","case","char","const","continue","default","do","double", 
"else","enum","extern","float","for","goto","if","int","long","register", 
"return","short","signed","sizeof","static","struct","switch","typedef", 
"union","unsigned","void","volatile","while"}; /*C语言所有关键字/ 
char *limit[]={" ","(",")","[","]","->",".","!","++","--","&","~", 
"*","/","%","+","-","<<",">>","<","<=",">",">=","==","!=","&&","||", 
"=","+=","-=","*=","/=",",",";","{","}","#","_","'"};/*运算、限界符*/ 
fstream outfile; 
int i,j; 
char *c; 
outfile.open("key.txt",ios::out); 
for(i=0;i<32;i++) 
outfile<<key[i]<<endl; 
outfile.close(); 
outfile.open("Limit.txt",ios::out); 
for(j=0;j<38;j++) 
outfile<<limit[j]<<endl; 
c=""; 
outfile<<c; 
outfile.close(); 
outfile.open("bsf.txt",ios::out); 
outfile.close(); 
outfile.open("cs.txt",ios::out); 
outfile.close(); 
outfile.open("output.txt",ios::out); 
outfile.close(); 
} 

char *DchangeB(char *buf) 
{ 

int temp[20]; 
char *binary; 
int value=0,i=0,j; 
for(i=0;buf[i]!='\0';i++) 
value=value*10+(buf[i]-48); /*将字符转化为十进制数*/ 
if(value==0) 
{ 
binary=new char[2]; 
binary[0]='0'; 
binary[1]='\0'; 
return(binary); 
} 
i=0; 
while(value!=0) 
{ 
temp[i++]=value%2; 
value/=2; 
} 
temp[i]='\0'; 
binary=new char[i+1]; 
for(j=0;j<=i-1;j++) 
binary[j]=(char)(temp[i-j-1]+48); 
binary[i]='\0'; 
return(binary); /*十进制转化为二进制*/ 

} 

int search(char *buf,int type,int command) 
{ int number=0; 
fstream outfile; 
char ch; 
char temp[30]; 
int i=0; 
switch(type) 
{ 
case 1: outfile.open("key.txt",ios::in);break; 
case 2: outfile.open("bsf.txt",ios::in);break; 
case 3: outfile.open("cs.txt",ios::in);break; 
case 4: outfile.open("limit.txt",ios::in);break; 
} 
outfile.get(ch); 
while(ch!=EOF){ 
while(ch!='\n') 
{ 
temp[i++]=ch; 
outfile.get(ch); 
} 
temp[i]='\0'; 
i=0; 
number++; 
if(strcmp(temp,buf)==0) 
{ 
outfile.close(); 
return number; /*若找到,返回在相应表中的序号*/ 
} 
else 
outfile.get(ch); 
} //结束外层while循环 
if(command==1) 
{ 
outfile.close( ); 
return 0; /*找不到,当只需查表,返回0,否则还需造表*/ 

} 
switch(type); 
{ 
case 1: outfile.open("key.txt",ios::in);break; 
case 2: outfile.open("bsf.txt",ios::in);break; 
case 3: outfile.open("cs.txt",ios::in);break; 
case 4: outfile.open("limit.txt",ios::in);break; 
} 
outfile;<<buf; 
outfile;.close(); 
return number+1; 
;} 


void intdeal(char *buffer);{ 

fstream outfile; 
int result; 
result=search(buffer,1,1); /*先查关键字表*/ 
outfile.open("output.txt",ios::app); 
if(result!=0) 
outfile<<buffer<<result<<endl; /*若找到,写入输出文件*/ 
else 
{ 
result=search(buffer,2,2); /*若找不到,则非关键字,查标识符表,还找不到则造入标识符表*/ 
outfile<<buffer<<result<<endl; 
} /*写入输出文件*/ 
outfile.close(); 
} 

void chardeal(char *buffer) 
{ fstream outfile; 
int result; 
result=search(buffer,1,1); /*先查关键字表*/ 
outfile.open("output.txt",ios::app); 
if(result!=0) 
outfile<<buffer<<result<<endl; /*若找到,写入输出文件*/ 
else 
{ 
result=search(buffer,2,2); /*若找不到,则非关键字,查标识符表,还找不到则造入标识符表*/ 
outfile<<buffer<<result<<endl; 
} /*写入输出文件*/ 
outfile.close(); 
} 

void errordeal(char error,int lineno) 
{ cout<<"\nerror: "<<error<<" ,line"<<lineno; 
} 

void scanner() 
{ fstream infile,outfile; 
char filename[20]; 
char ch; 
int err=0; 
int i=0,line=1; 
int count,result,errorno=0; 
char array[30]; 
char *word; 
printf("\n please input the file scanner name:"); 
scanf("%s",filename); 
err=1; 
infile.open(filename,ios::nocreate|ios::in); 
while(! infile) 
{ 
cout<<"cannot open file"<<endl; 
printf("please input the file name again:\n"); 
scanf("%s",filename); 
infile.open(filename,ios::nocreate|ios::in); 
err++; 
if(err==3) 
{cout<<"SORROY YOU CAN'T VUEW THE PRGARME\n"; 
cout<<"TANKE YOU VIEW"<<endl; 
exit(0);} 
} 
infile.get(ch); 
while(ch!=EOF) 
{ /*按字符依次扫描源程序,直至结束*/ 
i=0; 
if(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_')) 
{ /*以字母开头*/ 
while(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_')||((ch>='0')&&(ch<='9'))) 
{ 
array[i++]=ch; 
infile.get(ch); 
} 
word=new char[i+1]; 
memcpy(word,array,i); 
word[i]='\0'; 
intdeal(word); 
if(ch!=EOF) 
infile.seekg(-1,ios::cur); 
} 
else if(ch>='0'&&ch<='9') 
{ /*以数字开头*/ 
while(ch>='0'&&ch<='9') 
{ 
array[i++]=ch; 
infile.get(ch); 
} 
word=new char[i+1]; 
memcpy(word,array,i); 
word[i]='\0'; 
intdeal(word); 
if(ch!=EOF) 
infile.seekg(-1,ios::cur); 
} 
else if((ch==' ')||(ch=='\t')) 
; /*消除空格符和水平制表符*/ 
else if(ch=='\n') 
line++; /*消除回车并记录行数*/ 
else if(ch=='/') 
{ /*消除注释*/ 
infile.get(ch); 
if(ch=='=') 
{ /*判断是否为‘/=’符号*/ 
outfile.open("output.txt",ios::noreplace|ios::app); 
outfile<<"/=\t\t\t4\t\t\t32\n"; 
outfile.close(); 
} 
else if(ch!='*') 
{ /*若为除号,写入输出文件*/ 
outfile.open("output.txt",ios::noreplace|ios::app); 
outfile<<"/\t\t\t4\t\t\t13\n"; 
outfile.close(); 
outfile.seekg(-1,ios::cur); 
} 
else if(ch=='*') 
{ /*若为注释的开始,消除包含在里面的所有字符*/ 
count=0; 
infile.get(ch); 
while(count!=2) 
{ /*当扫描到‘*’且紧接着下一个字符为‘/’才是注释的结束*/ 
count=0; 
while(ch!='*') 
infile.get(ch); 
count++; 
infile.get(ch); 
if(ch=='/') 
count++; 
else 
infile.get(ch); 
} 
} 
} 
else if(ch=='"') 
{ /*消除包含在双引号中的字符串常量*/ 
outfile.open("output.txt",ios::noreplace|ios::app); 
outfile<<ch<<"\t\t\t4\t\t\t37\n"; 
outfile.close(); 
while(ch!='"') 
infile.get(ch); 
infile<<ch<<"\t\t\t4\t\t\t37\n"; 
infile.close(); 
} 
else 
{ /*首字符为其它字符,即运算限界符或非法字符*/ 
array[0]=ch; 
infile.get(ch); /*再读入下一个字符,判断是否为双字符运算、限界符*/ 
if(ch!=EOF) 
{ /*若该字符非文件结束符*/ 
array[1]=ch; 
word=new char[3]; 
memcpy(word,array,2); 
word[2]='\0'; 
result=search(word,4,1); /*先检索是否为双字符运算、限界符*/ 
if(result==0) 
{ /*若不是*/ 
word=new char[2]; 
memcpy(word,array,1); 
word[1]='\0'; 
result=search(word,4,1); /*检索是否为单字符运算、限界符*/ 
if(result==0) 
{ /*若还不是,则为非法字符*/ 
errordeal(array[0],line); 
errorno++; 
infile.seekg(-1,ios::cur); 
} 
else 
{ /*若为单字符运算、限界符,写入输出文件并将扫描文件指针回退一个字符*/ 
outfile.open("output.txt",ios::noreplace|ios::app); 
outfile<<word<<"\t\t\t4\t\t\t"<<result<<"\t"<<endl; 
outfile.close(); 
infile.seekg(-1,ios::cur); 
} 
} 
else 
{ /*若为双字符运算、限界符,写入输出文件*/ 
outfile.open("output.txt",ios::noreplace|ios::app); 
outfile<<word<<"\t\t\t4\t\t\t"<<result<<endl;; 
outfile.close( ); 
} 
} 
else 
{ /*若读入的下一个字符为文件结束符*/ 
word=new char[2]; 
memcpy(word,array,1); 
word[1]='\0'; 
result=search(word,4,1); /*只考虑是否为单字符运算、限界符*/ 
if(result==0) /*若不是,转出错处理*/ 
errordeal(array[0],line); 
else 
{ /*若是,写输出文件*/ 
outfile.open("output.txt",ios::noreplace|ios::app); 
outfile<<word<<"\t\t\t4\t\t\t"<<result<<"\t"<<endl; 
outfile.close(); 
} 
} 
} 
infile.get(ch); 
} 
infile.close(); 
cout<<"\nThere are "<<errorno<<" error(s).\n"; /*报告错误字符个数*/ 
} 
void main() 
{ char yn; 

do{ 
init(); /*初始化*/ 
scanner();/*扫描源程序*/ 

printf("Are You continue(y/n)\n"); //判断是否继续? 
yn=getch(); 
}while(yn=='y'||yn=='Y'); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -