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

📄 cffx.txt

📁 词法分析是编制一个读单词的过程
💻 TXT
字号:
#include "stdafx.h"
#include "ctype.h"
#include "string.h"
#include "stdio.h"  
/*定义一个全局变量,一个全局指针*/
FILE *fp;    /*fp是一个指向FILE类型结构的指针变量,可以使fp指向某一个文件
               的结构变量,从而通过该结构体变量中的文件信息访问该文件*/
int id;      /*标志变量,用来标识各类型的ID*/
/*主函数*/
void main()
{   
	/*自定义函数的声明*/
	char cbuffer;
	char alphaprocess(char buffer);
  char digitprocess(char buffer);
  char otherprocess(char buffer);
    if ((fp=fopen("example.c","r"))==NULL)   /*以只读方式打开文件"example.c",NULL在 stdio.h文件中已被定义为0*/
       printf("error");
    else                                    
       {
		cbuffer=fgetc(fp);                    /*文件不为空则从文件中取字符*/
	        while (cbuffer!=EOF)              /*EOF文件结束标志*/
	            {
	               if(cbuffer==' '||cbuffer=='\n') /*掠过空格和回车符*/
				   {
					   cbuffer=fgetc(fp);
				       id=4;
				   }
	               else
		              if(isalpha(cbuffer))    
		                 cbuffer=alphaprocess(cbuffer);   /*检查cbuffer是否为字母,是则调用alphaprocess()函数*/
		             else
		                 if (isdigit(cbuffer))
		                      cbuffer=digitprocess(cbuffer); /*检查cbuffer是否为数字0~9,是则调用digitprocess()函数*/
		                 else cbuffer=otherprocess(cbuffer); /*非上述两者则调用otherprocess()函数*/
	              }
        }
}
/*主函数结束*/
/*处理读取字符为字母的情况*/
char alphaprocess(char buffer)
{  
	int search(char searchchar[],int wordtype);   /*函数声明*/
	int atype;
    int i=-1;
	char alphatp[20];    /*字符数组存储从文件中读取的字符*/

    while((isalpha(buffer))||(isdigit(buffer))||buffer=='_'||buffer=='.')  /*标识符的组成成分*/
    {
	   alphatp[++i]=buffer;   /*将当前读取的字符存如数组*/
       buffer=fgetc(fp);      /*读取下一个字符*/
	}
     alphatp[i+1]='\0';       /*字符串以'\0'作为结束标志*/
     atype=search(alphatp,1); /*调用函数,判断当前字符串是否为关键字*/ 
     if(atype!=0)             /*是关键字则输出该关键字,编号为1,并输出该关键字在关键字表中的位子*/
	  {
		 printf("(%s, (1,%d))\n",alphatp,atype); 
		 id=1;                 /*关键字的ID为1*/
	  }
	 else
	  {
		 printf("(%s ,2)\n",alphatp);  /*为标识符时,编号为2*/
	     id=2;                         /*标识符的ID为2*/
	  } 
          return(buffer);              
}

/*判断字符串是否为关键字*/

int search(char searchchar[],int wordtype)
{
	char *key[32]={"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",
		           "volatile","while","switch","typedef","union","unsigned","void"};
	                /*设置数组指针存储c语言中的32个关键字*/
     int i;
     int p;
     switch (wordtype)
     {
       case 1:for (i=0;i<=31;i++)
		{
		  if (strcmp(key[i],searchchar)==0)  /*比较字符串,为关键字则定位该关键字的序号*/
		      { p=i+1; break; }
		  else p=0;
		}
		return(p);
      }
}
/*alphaprocess()函数结束*/
/*处理读取字符为数字时的情况*/
char digitprocess(char buffer)
{
	int i=-1;
	char digittp[20];
	while ((isdigit(buffer))||buffer=='.'||buffer=='e'||buffer=='E')//考虑数字为小数和指数时的情况
	  {
	    digittp[++i]=buffer;
	    buffer=fgetc(fp);         /*同上*/
	  }

	digittp[i+1]='\0';
	printf("(%s ,3)\n",digittp);  /*输出该数字,编号为3*/
	id=3;                         /*设置ID为3*/
	return(buffer);
}
/*digitprocess()函数结束*/
/*处理读出字符为其他字符的情况*/
char otherprocess(char buffer)
{     
	int n=0;
    char ch[20];
    ch[0]=buffer;
    ch[1]='\0';
	if(ch[0]=='%'||ch[0]=='\\')
	{ buffer=fgetc(fp);
      ch[1]=buffer;
	  ch[2]='\0';
      printf("(%s ,5)\n",ch); 
	  id=4;
      buffer=fgetc(fp);         
	  return(buffer);
	}
	if(ch[0]=='&')
	{
		buffer=fgetc(fp);
	    if(buffer!='&')
		 {
		   printf("(%s ,5)\n",ch);
	   	   id=4;
		   return(buffer);
		 }
	   if(buffer=='&')
	   {
		   ch[1]=buffer;
	       ch[2]='\0';
	       printf("(%s ,4)\n",ch);
	       id=3;
	       buffer=fgetc(fp);         
	       return(buffer);
	   }
	 
	 }
 if(ch[0]==','||ch[0]==';'||ch[0]=='{'||ch[0]=='}'||ch[0]=='('||ch[0]==')')
	{ 
		printf("(%s ,5)\n",ch);  
		buffer=fgetc(fp);         
		id=4; 
		return(buffer);
	}

    if(ch[0]=='*'||ch[0]=='/')
	 {  
		printf("(%s ,4)\n",ch);
	    buffer=fgetc(fp);          
		id=4; 
		return(buffer); 
	 }

     if(ch[0]=='='||ch[0]=='!'||ch[0]=='<'||ch[0]=='>')
	  { 
		 buffer=fgetc(fp);
	     if(buffer=='=')               /*防止'==','!=','<=','>='符号的分离*/
	     {  
			ch[1]=buffer;
		    ch[2]='\0';
		    printf("(%s ,4)\n",ch);
	     }
	     else 
		 { 
		    printf("(%s ,4)\n",ch);
			id=4;
			return(buffer); 
		 }
	        buffer=fgetc(fp); 
			id=4;
	        return(buffer);
	     }

     if(ch[0]=='+'||ch[0]=='-')
	  { 
		if(id==4)             /*如果'+','-'前ID为4的字符则可能为正负数或'++','--',否则为加减号*/
		 { 
		for(int i=1;i<10;i++)
		   {
		   buffer=fgetc(fp);
            
		   if(buffer=='+')
		     {
			  ch[1]='+';ch[2]='\0';
			  id=4;
			  goto L;
			  break;         /*跳出for循环体*/
		     }
		   if(buffer=='-')
		    {
			 ch[1]='-';
			 ch[2]='\0';
			 id=4;
			 goto L;
			 break;         /*跳出for循环体*/
		    }
           if((buffer==',')||(buffer==';')||(buffer=='+')||(buffer=='-')||(buffer==')')) 
			 break;         /*防止将+562;+562,+562+,+562-,+561)作为整体输出*/
      	   ch[i]=buffer;  
	       ch[i+1]='\0';
		 }
           printf("(%s ,3)\n",ch);  
		   id=3; 
           //buffer=fgetc(fp);
		   return(buffer);
		}
	  ch[2]='\0';
      L: printf("(%s ,4)\n",ch); 
	  buffer=fgetc(fp);
      id=4;
	  return(buffer);
	  }
}

⌨️ 快捷键说明

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