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

📄 4-28(2).txt

📁 本学期做过的编译原理实验的一个词法分析器
💻 TXT
📖 第 1 页 / 共 2 页
字号:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
	    FILE *fp;
		char filename[20],ch;
		char str[2000]="\0",a[100][2000],b[100][2000],swap[80]="\0";
		int  c,d[1000],d1=0;
		char imp[58][20] = {"abstract","boolean","break","byte","case","catch","char","class",
                        "const","continue","default","do","double","else","extends","false",
                        "final","finally","float","for","goto","if","implements","import",
                        "instanceof","int","interface","long","native","new","null","package",
                        "private","protected","public","return","short","static","super","switch",
                        "synchronized","this","throw","throws","transient","true","try","void",
                        "volatile","while"
		};     
		char fu[45][10] = {"+=","&=","==","?:","--","/=",">>>=",">>>",">>=",">>",">",
			               ">=","++","<<=","<<","<=","<","%=","=",
					    	"*=","^=","!=","|=","&&","||","-=",
							"/","-","&","~","|","^","*","!","+"
		};
		int i,j=0,k=0,sum,flag = 0,rot=0,hang=0;
		int m,n,p,q=0;
		printf( "Enter  filename:" );
		scanf( "%s",filename );
		if( (fp = fopen(filename,"r"))==NULL )
		{
			  printf("file  open error.\n");
			  exit(0);
		}
		i=0;
		while( (ch = fgetc(fp))!=EOF )
        {
			  str[i++] = ch;                           //写入数组str[],sum纪录字符个数
			  putchar(ch);                                        
		}
		printf("\n");
		sum = i-1;    
		i = 0;  
		j = 0; 
yes:    while(i <= sum)
        {
			  if( str[i] ==' ')    { i++;   continue; }  
			  if( str[i]=='\n'||str[i]==10)    
			  {
				    for(j = 1;j <= rot;j++)
				    	printf("%d行,%d个位置单词\n",hang,j);
					c = hang;
					d[d1++] = rot;
         		    i++; 
					hang++;
					rot = 0;
					continue; 
			  } 
			  if( str[i]=='"' )
			  {
				     j = 0;
				     a[k][j++] = '"';
					 i++;
					 p=i;
				     for( p;str[p]!='"';p++)
					 {
						 a[k][j++] = str[p];
						 i++;
					 }
					 a[k][j] = str[p];
					 a[k][j+1] ='\0';
					 strcpy(b[k],"0x109");
					 i++;
					 k++;
					 rot++;
					 continue;
			  }
			  if( str[i]=='\'' )
			  {
				     j = 0;
				     a[k][j++] = '\'';
					 i++;
					 p=i;
				     for( p;str[p]!='\'';p++)
					 {
						 a[k][j++] = str[p];
						 i++;
					 }
					 a[k][j] = str[p];
					 a[k][j+1] ='\0';
					 strcpy(b[k],"0x106");
					 i++;
					 k++;
					 rot++;
					 continue;
			  }
			  else 
			  {     
				    q = 0;
				    for(p = i;str[p]!=' '&&str[p]!='\n'&&str[p]!='\0'&&str[p]!='"'&&str[p]!='\'';p++ )    //从空格处划开 
					{
				        swap[q++] = str[i++];
				     	flag = 1;
					}
			  }
			  if( flag == 1)        //空格
			  {
				  swap[q] = '\0';
                  for(m = 0;m < 50;m++)
				  {
						if( strcmp(swap,imp[m])==0 )             //找到关键字
						{
								 strcpy( b[k],"0x103" );
								 strcpy( a[k],swap );
								 flag = 0;
					             i++;
								 k++;
								 rot++;
								 goto yes;
						}
				  }
				  p = 0;
				  if(swap[p] =='{'||swap[p] =='}')           //单个的{ 或者 }
				  {
							a[k][0] = swap[p];  a[k][1] = '\0'; 
							strcpy(b[k],"0x121"); 	
							j=0;
							p++;
							while(swap[p]!='\0')    swap[j++] = swap[p++];
							swap[j] = '\0';
							p = 0;
							k++;
							rot++;
							if( swap[0]=='\0' )    goto yes;
							continue;
				  }
		      	 // else if( (swap[p] >=97&&swap[p]<=122)||(swap[p]>=65&&swap[p]<=90)||(str[i]>=48&&str[i]<=57)||swap[p]=='$'||swap[p]=='_') 
				 //{
					   if((swap[p] >=97&&swap[p]<=122)||(swap[p]>=65&&swap[p]<=90)||swap[p]=='$'||swap[p]=='_')
					   {
                          while((swap[p] >=97&&swap[p]<=122)||(swap[p]>=65&&swap[p]<=90)||swap[p]=='$'||swap[p]=='_'||(swap[p]>=48&&swap[p]<=57))
						  {
							 a[k][p] = swap[p];                   //标志符
					         p++;
						  }
						     a[k][p] = '\0';
							 if( strcmp(a[k],"true")==0||strcmp(a[k],"false")==0 )
							    strcpy(b[k],"0x105");                 //布尔型
						     else  strcpy( b[k],"0x104");
							 k++;
							 rot++;
						     j=0;
						     while(swap[p]!='\0')    swap[j++] = swap[p++];
						     swap[j] = '\0';
						     p = 0;
							 if( swap[0]=='\0' )       goto yes; 
					   }
						while( swap[p]!='\0' )             
						{
							   n=0;
							   for( m = 0; m < 39;m++ )           //找标志符后紧接运算符
                               {
								    while( fu[m][n]!='\0') 
									{
										if(  swap[p]==fu[m][n] )       
										{
											 n++;
										     p++;
											 continue;
										}
										else     { p = 0; n = 0;break; }
									}
									if( fu[m][n]=='\0' )
									{
										    strcpy(a[k],fu[m]); 
											j=0;
											while(swap[p]!='\0')    swap[j++] = swap[p++];
											swap[j] = '\0';
											p = 0;
                                            if (strcmp(a[k],"=")==0 )          { strcpy(b[k],"0x110"); 	k++;  rot++;} 
				                            else if (strcmp(a[k],"+=")==0 )    {strcpy(b[k],"0x110");  	k++;  rot++;}
				                            else if (strcmp(a[k],"-=")==0)     { strcpy(b[k],"0x110");	k++; rot++;}
				                            else if (strcmp(a[k],"*=")==0 )    { strcpy(b[k],"0x110");	k++; rot++;}
				                            else if (strcmp(a[k],"/=")==0 )    { strcpy(b[k],"0x110");  k++; rot++;}
				                            else if (strcmp(a[k],"%=")==0 )    {strcpy(b[k],"0x110");	k++; rot++;}
				                            else if (strcmp(a[k],"&=")==0 )    { strcpy(b[k],"0x110");	k++; rot++;}
				                            else if (strcmp(a[k],"^=")==0 )    {strcpy(b[k],"0x110");	k++; rot++;}
				                            else if (strcmp(a[k],"|=")==0 )    {strcpy(b[k],"0x110");	k++; rot++;}
				                            else if (strcmp(a[k],">>=")==0 )   { strcpy(b[k],"0x110");	k++; rot++;}
				                            else if (strcmp(a[k],"<<=")==0 )   { strcpy(b[k],"0x110");	k++; rot++;}
				                            else if (strcmp(a[k],">>>=")==0 )  {strcpy(b[k],"0x110");	k++; rot++;}
				                            else if (strcmp(a[k],"?:")==0 )    {strcpy(b[k],"0x111");	k++; rot++;}
				                            else if (strcmp(a[k],"||")==0 )    {strcpy(b[k],"0x112");	k++; rot++;}
                                            else if (strcmp(a[k],"&&")==0 )    {strcpy(b[k],"0x113");	k++; rot++;}
				                            else if (strcmp(a[k],"|")==0 )     {strcpy(b[k],"0x114");	k++; rot++;}
				                            else if (strcmp(a[k],"^")==0 )     {strcpy(b[k],"0x115");	k++; rot++;}
				                            else if (strcmp(a[k],"&")==0 )     {strcpy(b[k],"0x116");	k++; rot++;}
				                            else if (strcmp(a[k],"==")==0||strcmp(a[k],"!=")==0 )  { strcpy(b[k],"0x117");	k++; rot++;}
				                            else if (strcmp(a[k],"<")==0||strcmp(a[k],">")==0||strcmp(a[k],"<=")==0||strcmp(a[k],">=")==0 )   {strcpy(b[k],"0x118");	k++; rot++;}
				                            else if (strcmp(a[k],"<<")==0||strcmp(a[k],">>")==0||strcmp(a[k],">>>")==0 )  { strcpy(b[k],"0x119");	k++; rot++;}
				                            else if (strcmp(a[k],"+")==0||strcmp(a[k],"-")==0 )   {strcpy(b[k],"0x11a");	k++; rot++;}
				                            else if (strcmp(a[k],"*")==0||strcmp(a[k],"/")==0||strcmp(a[k],"%")==0 )   {strcpy(b[k],"0x11b");	k++; rot++;}
				                            else if (strcmp(a[k],"++")==0||strcmp(a[k],"--")==0||strcmp(a[k],"!")==0||strcmp(a[k],"~")==0 )   {strcpy(b[k],"0x11c");	k++; rot++;}
											if(swap[0]=='\0')     goto yes;
											break; 
									}
							   }
							   if(swap[p] =='('||swap[p] ==')'||swap[p] =='['||swap[p] ==']'||swap[p] =='.')    
							   {
								     a[k][0] = swap[p];  a[k][1] = '\0'; 
									 strcpy(b[k],"0x11d"); 	
									 j=0;
									 p++;
									 while(swap[p]!='\0')    swap[j++] = swap[p++];
									 swap[j] = '\0';
									 p = 0;
									 k++;
									 rot++;
									 if( swap[0]=='\0' )       goto yes; 

⌨️ 快捷键说明

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