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

📄

📁 这是我们学习编译原理时做的一个程序. 是一个简单的词法分析程序.将一个文本文件时的推导规则进行.
💻
字号:
#include<stdio.h>
#include<string.h> 

//定义关键字结构
typedef struct 
{
	int type;
	int order;
	char str[7];
}keyword;

//定义标志符的结构
typedef struct
{
	int type;
 	char str[7];
}signstr;

//定义常量的结构
typedef struct 
{
	int type;
	char str[15];
}intconst;

//定义界符的结构
typedef struct 
{
	int type;
	int order; 
	char str[3];
}operater;

//定义界符的结构
typedef struct 
{
	int type;
	int order; 
	char str[3];
}board;

//预置关键字
struct 
{
	int order;
	char a[10];
}initkey[13]={{1,"int"},{2,"char"},{3,"float"},{4,"main"},{5,"while"},{6,"break"},{7,"if"},{8,"else"},{9,"for"},{10,"until"},{11,"printf"},{12,"scanf"},{13,"end"}};

//预置运算符
struct 
{
	int order;
	char b[3];
}initoperater[27]={{15,"+"},{16,"-"},{17,"*"},{18,"/"},{19,"%"},{20,"?"},{21,":"},{22,">"},{23,"<"},{24,"=="},{25,">="},{26,"<="},{27,"="},{28,"++"},{29,"--"},{30,"("},{31,")"},{32,"["},{33,"]"},{34,"{"},{35,"}"},{36,","},{37,";"},{38,"\\"},{39,"\""},{40,"\'"}};

//函数声明
void lexical();  
void isWord();
void isNumber();
void other();

//////////////////
keyword keygroup[100];
signstr signgroup[100];
intconst constgroup[100];
operater operatergroup[100];
board boardgroup[100];
char ch;
int key_number=0,sign_number=0,con_number=0,ope_number=0,board_number=0;
FILE * fp;

//主函数
main()
{
	int i;
	if((fp=fopen("program.txt","r"))==0)
	{
		printf("can not open the file!\n");
	
	}
	else{ 
		lexical();}
//fp=fopen("program.txt","r");
printf("\n");
printf("\t\t\t词法分析器\n");
printf("\n");
printf("---------------------------------------------------------------------\n");

   while(!feof(fp))
	   {
        ch=fgetc(fp);
         putchar(ch);
       }
fclose(fp);
putchar(10);
printf("---------------------------------------------------------------------\n");
printf("关键字\n");
printf(" 分类\t\t\t编号\t\t\t字符串\n");

for(i=0;i<key_number;i++)
	{
	printf("%d\t\t\t%d\t\t\t%s\n",keygroup[i].type,keygroup[i].order,keygroup[i].str);
    }
printf("---------------------------------------------------------------------\n");
printf("标志符\n");
printf(" 分类\t\t\t\t\t\t字符串\n");
for(i=0;i<sign_number;i++)
   {
	printf("%d\t\t\t\t\t\t%s\n",signgroup[i].type,signgroup[i].str);
   }
printf("---------------------------------------------------------------------\n");
printf("常数\n");
printf(" 分类\t\t\t\t\t\t常数\n");


for(i=0;i<con_number;i++)
	{
	  printf("%d\t\t\t\t\t\t%s\n",constgroup[i].type,constgroup[i].str);
    }
printf("---------------------------------------------------------------------\n");
printf("运算符\n");
printf(" 分类\t\t\t编号\t\t\t符号串\n");

for(i=0;i<ope_number;i++)
	{
	printf("%d\t\t\t%d\t\t\t%s\n",operatergroup[i].type,operatergroup[i].order,operatergroup[i].str);
	}
printf("---------------------------------------------------------------------\n");
printf("界限符\n");
printf(" 分类\t\t\t编号\t\t\t符号串\n");

for(i=0;i<board_number;i++)
	 {
		printf("%d\t\t\t%d\t\t\t%s\n",boardgroup[i].type,boardgroup[i].order,boardgroup[i].str);
	}
printf("---------------------------------------------------------------------\n");
}  



                 
/////////////////////////////////////////////////////////////////////////////////
void lexical()   
{  ch=fgetc(fp);   
   while(!feof(fp))
  { 
	 while((ch==32)||(ch==10)) 
	    ch=fgetc(fp);            //去掉空格和分号
	 if(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z')))
	    isWord();
	 else
	 {
	   if((ch>='0')&&(ch<='9'))
	     isNumber();
	   else
	     other();	 
	 }
                                       
  }
}
/////////////////////////////////////////////////////////////////////////////////
void isWord()
{    
  char zmb[10];  //存字符串   
  int i=0;
  int j=0;
  int you=0;    
  int biaoyou=0;
  zmb[i]=ch;
  i++; 
  ch=fgetc(fp); 
  while(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||((ch>='0')&&(ch<='9')))
  {   
	  zmb[i]=ch;
	  i++;
      ch=fgetc(fp);
  }
 
    zmb[i]='\0';   
  for(j=0;j<13;j++)
	     if(strcmp(zmb,initkey[j].a)==0)
		  {//printf("1,%s\n",zmb);
		  keygroup[key_number].type=1;
		  keygroup[key_number].order=initkey[j].order;
		  strcpy(keygroup[key_number].str,initkey[j].a);
		  key_number++;
		  biaoyou=1;  
		  break;}
	 
	 if(biaoyou==0)  
		   { for( i=0;i<sign_number;i++)
              if(strcmp(zmb,signgroup[i].str)==0)
				{  you=1;
				 break;}
		      if(you==0)
			  {strcpy(signgroup[sign_number].str,zmb); 
			     signgroup[sign_number].type=2;
				 sign_number++;
			  }
		  }

    you=0;    
    biaoyou=0;
}    
/////////////////////////////////////////////////////////////////////////////////
void isNumber()
{   
  char csb[10]; 
  int i=0;
  csb[i]=ch;
  i++;
  ch=fgetc(fp);
  while(((ch>='0')&&(ch<='9'))||(ch=='.'))      
   {  csb[i]=ch;
      i++;
      ch=fgetc(fp);
   }
  csb[i]='\0';
  strcpy(constgroup[con_number].str,csb);
  constgroup[con_number].type=3;
  con_number++;
}
/////////////////////////////////////////////////////////////////////////////////
void other()  
{ 
  int i=0;
  char fh[3];
  fh[0]=ch;
  if(fh[0]=='<'||fh[0]=='>'||fh[0]=='='||fh[0]=='!')
	 {ch=fgetc(fp);
	  if(ch=='=')
		{
		 fh[1]=ch;
	     fh[2]='\0';
         ch=fgetc(fp);
		}
	  else
		  fh[1]='\0';
	  }   	 
   else if(fh[0]=='+'||fh[0]=='-')
		{   ch=fgetc(fp);
          //printf("%c\n",ch);   
         if(ch=='+'||ch=='-')
		  {
			fh[1]=ch;
	        fh[2]='\0';
			ch=fgetc(fp);
		  }
		 else
          fh[1]='\0';

		}
   else
   {
		  fh[1]='\0';
		   ch=fgetc(fp);
		 }     
	     
 for(i=0;i<25;i++)
	 if(strcmp(initoperater[i].b,fh)==0)
	 {    if(initoperater[i].order>=30)
		  {
			boardgroup[board_number].type=5;
			boardgroup[board_number].order=initoperater[i].order;
			strcpy(boardgroup[board_number].str,fh);
			board_number++;
			//printf("4,%d,%s",initoperater[i].order,initoperater[i].b);
		  }
	      else	 
		  { operatergroup[ope_number].type=4;
		    operatergroup[ope_number].order=initoperater[i].order;
            strcpy(operatergroup[ope_number].str,fh);
			ope_number++;
		  }
	 break;
	 }
} 

⌨️ 快捷键说明

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