- #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');
- }
编译原理词法分析器(C源代码)
最新推荐文章于 2023-01-01 10:45:18 发布