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

📄 accidanalyse.h

📁 C写的词法分析器
💻 H
📖 第 1 页 / 共 2 页
字号:

                     /*************************************/
                     /********** 全局变量声明**************/
                     /*************************************/

 
char  CBuffer [10000] ;                                   //存储从磁盘读入的源程序的每行源程序                                                                 
int   IBufIndex ;                                         //记录输入存储缓冲区的位置(即CBuffer的数组下标)

struct  TokenAttribute                                   //用于表示记号的属性
{  
   char     ID[20] ;                                     //记号值
   char     CToken_Type[4]  ;                            //记号的属性值
};

//****************************转义类字符表***********************************//
TokenAttribute  TransChar[8]={{"\\a","1"},{"\\b","2"},{"\\t","3"},{"\\r","4"},{"\\v","5"},{"\\f","6"},{"\\n","7"}};
//****************************关键字表***************************************//
TokenAttribute  Keyword[33]={{"auto","101"},{"break","102"},{"case","103"},{"char","104"},
								{"const","105"},{"continue","106"},{"default","107"},{"double","108"},
								{"do","109"},{"else","110"},{"enum","111"},{"extern","112"},{"float","113"},
								{"for","114"},{"goto","115"},{"if","116"},{"int","117"},{"long","118"},
								{"registe","119"},{"return","120"},{"short","121"},{"signed","122"},
								{"sizeof","123"},{"static","124"},{"struct","125"},{"switch","126"},
								{"typedef","127"},{"union","128"},{"unsigned","129"},{"void","130"},
								{"volatile","131"}, {"while","132"}};
TokenAttribute  ConstNumb[20];                           //定义数据常量表
int  ConstIndex=1;                                       //定义数据数据常量表的位置(即下标)
struct  StrAttribute                                     //定义字符串表
{  
   char     ID[100] ;                                    //字符串值
   char      CToken_Type[4] ;                            //字符串属性值
}ConstStr[20];
int ConStrIndex=0;                                       //字符串常量的位置(即下标)
struct  TokenAttribute ConstChar[100];                   //定义字符常量表
int     ConCharIndex=0;                                     //字符常量表下标     
//****************************运算符表**************************************//
TokenAttribute Operator[43]={{"(","300"}, {")","301"},{"[","302"},{"]","303"}
                             ,{"--","304"},{"-=","305"},{"->","306"},{"-","307"}
							 ,{"++","308"},{"+=","309"},{"+","310"}
							 ,{"<<","311"},{"<=","312"},{"<<=","313"},{"<","314"}
							 ,{">>","315"},{">=","316"},{">>=","317"},{">","318"}
							 ,{"==","319"},{"=","320"}
							 ,{"&&","321"},{"&=","322"},{"&","323"}
							 ,{"||","324"},{"|","325"}
							 ,{"!=","326"},{"!","327"}
							 ,{"^=","328"},{"^","329"}
							 ,{"*=","330"},{"*","331"}
							 ,{"/=","332"},{"/","333"}
							 ,{"%=","334"},{"%","335"}
							 ,{",","336"},{".","337"}
							 ,{"?","338"},{":","339"},{"~","340"}};
TokenAttribute Identifier[200];                            //标识符列表
int  IdIndex=0;                                            //标识符表的下标
FILE  *fp2;                                                //定义写盘的文件指针
                 //*************************************//
				 //***********函数定义******************//
				 //*************************************//

void  WriteDisk(TokenAttribute STokenAttribute[],int TokenIndex)                                        //功  能:输出并写盘
{
    int i=0;
	
	if((fp2=fopen("Test1.txt","a"))==NULL)                                                           //打开续写的文件
                  printf("cannot open file\n");
     else 
		 {
		     while(STokenAttribute[TokenIndex].ID[i]!='\0')
			      fputc(STokenAttribute[TokenIndex].ID[i++],fp2);
             fputc(' ',fp2);
			 for(i=0;i<3;i++)
                  fputc(STokenAttribute[TokenIndex].CToken_Type[i],fp2);
			 fputc(' ',fp2);
			 fputc('\n',fp2);
             fclose(fp2);
		 }
}

                 //***********函数名:DigitRecognise()  ****************//
				 //***********功  能:识别数字常量并建表****************//
				 //************被调用:main()           ****************//
                 //*************调用: WriteDisk();     ****************//
void DigitRecognise()
{
	 
	 int i=0;
	 if((CBuffer[IBufIndex]=='.'&&(CBuffer[IBufIndex+1]>='0'&&CBuffer[IBufIndex+1]<='9'))||(CBuffer[IBufIndex+1]=='.'&&(CBuffer[IBufIndex]>='0'&&CBuffer[IBufIndex]<='9')))
	 {
		   printf("所分析的数据类型是:Floating point numbers");
		   strcpy(ConstNumb[ConstIndex].CToken_Type,"200");
           while((CBuffer[IBufIndex]>='0'&&CBuffer[IBufIndex]<='9')||CBuffer[IBufIndex]=='.'||CBuffer[IBufIndex]=='e'||CBuffer[IBufIndex]>='E')
             {
			    ConstNumb[ConstIndex].ID[i]=CBuffer[IBufIndex++];
			    i++;
			 }
	}
	 else if(CBuffer[IBufIndex]=='0'&&(CBuffer[IBufIndex+1]=='x'||CBuffer[IBufIndex+1]=='X'))
	 {    
		 printf("所分析的数据类型是:Hex");
		  strcpy(ConstNumb[ConstIndex].CToken_Type,"203");
		    IBufIndex+=2;
         while(CBuffer[IBufIndex]>='0'&&CBuffer[IBufIndex]<='9') 
		 {
			 ConstNumb[ConstIndex].ID[i]=CBuffer[IBufIndex++];
		     i++;
		 }
       }
	else if(CBuffer[IBufIndex]=='o'||CBuffer[IBufIndex]=='O')
	{
		printf("所分析的数据类型是:Octal");
	    strcpy(ConstNumb[ConstIndex].CToken_Type,"202");                                   //标记是八进制数字 
	    IBufIndex++;
        while(CBuffer[IBufIndex]>='0'&&CBuffer[IBufIndex]<='7')    
		{ 
			ConstNumb[ConstIndex].ID[i]=CBuffer[IBufIndex++];
			i++;
		}
	}
    else if (CBuffer[IBufIndex]>='0'&&CBuffer[IBufIndex]<='9')
	{   
			printf("所分析的数据类型是:Decimalist");
		strcpy(ConstNumb[ConstIndex].CToken_Type,"201");
       while(CBuffer[IBufIndex]>='0'&&CBuffer[IBufIndex]<='9')   
	   {
		   ConstNumb[ConstIndex].ID[i]=CBuffer[IBufIndex++];
		   i++;
	   }
    } 
	//IBufIndex++;
	ConstNumb[ConstIndex].ID[i]='\0';
    WriteDisk( ConstNumb,ConstIndex);
    printf("\n所分析的数据值是:%s 数据类型编号:%s\n", ConstNumb[ConstIndex++].ID,ConstNumb[ConstIndex].CToken_Type);
	
}

                 //***********函数名:BlackRecognise()  ****************//
				 //***********功  能:识别空白字符      ****************//
				 //************被调用:main()           ****************//
void BlackRecognise()
{
    
	if(CBuffer[IBufIndex]==10||CBuffer[IBufIndex]==12||CBuffer[IBufIndex]==13||CBuffer[IBufIndex]==' ')
	{
       while(CBuffer[IBufIndex]==10||CBuffer[IBufIndex]==12||CBuffer[IBufIndex]==13||CBuffer[IBufIndex]==' ')
	                     IBufIndex++;
    }
    else if(CBuffer[IBufIndex]=='/'&&CBuffer[IBufIndex+1]=='/')
	{     
		printf("所识别的对象是注释:");
		IBufIndex+=2;
	   while(CBuffer[IBufIndex]!=10)
	     printf("%c",CBuffer[IBufIndex++]);
	   IBufIndex++;
	   printf("\n");
	}
	else 
	{
		printf("所识别的对象是注释:");
		IBufIndex=IBufIndex+2;
	    while(CBuffer[IBufIndex]!='*'&&CBuffer[IBufIndex+1]!='/')
        	printf("%c",CBuffer[IBufIndex++]);
      IBufIndex=IBufIndex+2;
	  printf("\n");
	  IBufIndex++;
	}
}


                 //***********函数名:SymbolRecognise ()****************//
				 //***********功  能:识别关键字和标识符****************//
				 //************被调用:main()           ****************//
                //*************调用: WriteDisk();     ****************//
void SymbolRecognise ()
{   
	 int i=0;
	char CSymbol[30]={'0'};                              //用于存储分析的标识符
	int flag=-1;
	strcpy(Identifier[IdIndex].CToken_Type,"500");                //给用户自定义的标识符类型号赋值
   while(CBuffer[IBufIndex]>='a'&& CBuffer[IBufIndex]<='z' || CBuffer[IBufIndex]>='A' && CBuffer[IBufIndex]<='Z' || CBuffer[IBufIndex]=='_' || CBuffer[IBufIndex]>='0'&&CBuffer[IBufIndex]<='9')
   {   
	  CSymbol[i]=CBuffer[IBufIndex++];
	  i++;
	}
   CSymbol[i]='\0';  //
   for(i=0 ; i<=32;i++)
	{
		if(strcmp(CSymbol,Keyword[i].ID)==0)
            flag=i;
   }
	if(flag>=0)
	 {
		WriteDisk( Keyword,flag);
        printf("所分析的关键字是:%s 关键字编号是:%s\n",Keyword[flag].ID, Keyword[flag].CToken_Type);
	}
    else 
	{   
		 for(i=0;i<=IdIndex;i++)
		  {
			if(strcmp(Identifier[i].ID,CSymbol)==0 )
			{
				WriteDisk(Identifier,i);
				flag=i;
			   printf("所分析的标识符是:%s 标识符编号是:%s\n",Identifier[i].ID, Identifier[i].CToken_Type);
			}
		  }
		
		if(flag<0)	
			{
			  strcpy(Identifier[IdIndex].ID,CSymbol);                        //保存用户自定义标识符(注:它的下标号刚好是对编号对500进行求余)
              WriteDisk(Identifier,IdIndex);
			  printf("所分析的标识符是:%s 标识符编号是:%s\n",Identifier[IdIndex].ID, Identifier[IdIndex++].CToken_Type);
			}
	}
}


                 //***********函数名:OperatorRecoginse()****************//
				 //***********功  能:识别关键字运算符*******************//
				 //************被调用:main()           ****************//
                 //*************调用: WriteDisk();     ****************//
void OperatorRecoginse(char CTemp)
{
	//运算符判断;
	char Temp[4];
	int  i=0;
	switch(CTemp)
	{
		case '(':
			 Temp[i++]='(';
             break;
		case ')':
             Temp[i++]=')';
             break;
        case '[':
             Temp[i++]='[';
             break;
		case ']':
			Temp[i++]=']';
			break;
        case '-':
			   Temp[i++]='-';
             if(CBuffer[IBufIndex+1]=='-')
             {
				 Temp[i++]='-';
				 IBufIndex++;
                 break;
			 }
             else if(CBuffer[IBufIndex+1]=='=')
             {
                 Temp[i++]='=';
				 IBufIndex++;
                  break;
			 }
			 else if(CBuffer[IBufIndex+1]=='>')
			 {

⌨️ 快捷键说明

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