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

📄 词法分析.cpp

📁 建立一个词法分析器
💻 CPP
字号:
#include"stdio.h"   //strchr
#include"iostream.h"
#include"string.h"
#include"stdlib.h"
#include"ctype.h"      //isalnum,isdigit,isalpha,
#define keyword 40
#define fuhao 45
#define yunsuan 9
char yun[yunsuan]="+-*/=><!";
#define fenge 8
char fen[fenge]=",.;{}()";
char *a[keyword]={"auto","break","case","char","class","const","continue","default","delete","do","double","else","enum","extern","float","for","friend","if","inline","int","long","new","operator","private","protected","public","register","return","short","sizeof","static","struct","switch","template","this","typedef","union","virtual","void","while"};
char *b[fuhao]={"+","-","*","/","%","++","--",">",">=","<","<=","==","!=","&&","||","!","<<",">>","~","|","^","&","=","+=","-=","*=","/=","%=",">>=","<<=","&=","^=","|=",",","->",".","[","]","(",")","::","{","}","#",";"};
char ch;
int i,k;
char buff[20];
void zhuan(char a[],int n);
void output(int ,char*);
void zhuyao(FILE *fp)
{ int j;
  ch=fgetc(fp);
  while(ch==' '||ch=='\n'||ch=='\t')
   {ch=fgetc(fp);}
 if(isalpha(ch))                               /*输入的是字母,进行 标识符处理*/
 {
	 buff[0]=ch;
	 i=1;
	 ch=fgetc(fp);
	 while(isalnum(ch))  //如果本函数的变元为字母或数字,它将返回非零值,否则返回零值。   
		                /*如果是字母数字则组合,否则结束*/
	 {
		 buff[i]=ch;
		 i++;
		 ch=fgetc(fp);                 //从流中读取字符      
	 }
     buff[i]='\0';                                  /*查找保留字*/
     fseek(fp,-1,1);
     j=0;
     while((j<keyword)&&strcmp(buff,a[j]))
		 j++;
	 if(j>=keyword)
		 output(300,buff);
	 else
		 output(100+j+1,buff);
 }
 else
	 if(isdigit(ch))
	 {
		 buff[0]=ch;
		 ch=fgetc(fp);
		 i=1;
		 while(isdigit(ch))      // 判断字符c是否为数字       /*如果是数字则整合数字*/
		 {
			 buff[i]=ch;
			 i++;
			 ch=fgetc(fp);
		 }

         buff[i]='\0';                                   /*整数整合结束*/
         cout<<"<    "<<400<<"   "<<","<<"   ";
		 zhuan(buff,i);
		 fseek(fp,-1,1);
	 }
	 else 
		 if(strchr(fen,ch)>0)                           /*分隔符号*/
		 {
			 buff[0]=ch;
			 ch=fgetc(fp);
             buff[1]='\0';
             fseek(fp,-1,1);
             k=0;
             while((k<fuhao)&&strcmp(buff,b[k]))
				 k++;
             if(k<fuhao)
				 output(200+k+1,buff);
		 }
		 else
			 if(strchr(yun,ch)>0)                         /*运算符号*/
			 {
				 buff[0]=ch;
			     ch=fgetc(fp);
				 if(buff[0]=='/'&&ch=='*')
				 {
					 while(ch!='/')
					 {
						ch=fgetc(fp);				 
					  }
				 }
				 else
					 if(buff[0]=='/'&&ch=='/')
					 {
						 while(ch!='\n')
						 {
						   ch=fgetc(fp);				 
						 }
					 }
					 else
					 {
						 i=1;
			             while(strchr(yun,ch)>0)
						 {
				            buff[i]=ch;
	                        i++;
	                        ch=fgetc(fp);
						 }
                         buff[i]='\0';
                         fseek(fp,-1,1);
                         k=0;
                         while((k<fuhao)&&strcmp(buff,b[k]))
				             k++;
                         if(k<fuhao)
					         output(200+k+1,buff);
					 }
			 }
			 else
			 {
				 buff[0]=ch;
			     buff[1]='\0';
			     ch=fgetc(fp); //从流中读取字符
			     fseek(fp,-1,1);//重定位流上的文件指针
			 }
}
void zhuan(char a[],int n)                                   /*二进制转换函数*/
{
	long data=0,t=1;
	int i,j=0;
	int c[20];
	for(i=n-1;i>=0;--i){
		data+=(a[i]-'0')*t;
		t*=10;
	}
	if(data==0)
		cout<<"0";
	else{
		while(data){
		    c[j++]=data%2;
		    data/=2;
		}
		cout<<"";
	for(i=j-1;i>=0;--i)
		cout<<c[i];
	cout<<""<<">"<<endl;
	}
}
void output(int n,char *m)                            /*输出格式*/
  { printf("<    %-2d   ,  %s>\n",n,m);}
void main()                                           /*主函数*/
{FILE *fp;
 char filename[20],sh;
 printf("Type the file name which you want to open:");
 scanf("%s",&filename);
 fp=fopen(filename,"r");                             /*以只读方式打开指定文件*/
 if((fp=fopen(filename,"r"))==NULL)                  /*文件不存在输出错误*/
     {printf("File does not exist!");exit(-1);}
cout<<"文件中内容如下:"<<endl;
 while(!feof(fp)){
	 sh=fgetc(fp);//从流中读取字符
	 cout<<sh;
 }
 cout<<endl;
 rewind(fp);   // 将文件指针重新指向一个流的开头
 cout<<"分析情况(注释符已经剔除)如下:"<<endl;
 while(ch!=EOF) 
	 zhuyao(fp);
 fclose(fp);     //关闭一个流
}

⌨️ 快捷键说明

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