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

📄 source.txt

📁 一个自己编写的词法分析小程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
                    Out(PLUS,string);
				  if(oldch=='-')
					Out(SBB,string);
				  if(oldch=='/')
                    Out(DEVIDE,string);
				  if(oldch=='*')
					Out(MULI,string);
				  i--;                     //单回退
			  }
              ////////////双运算符//////
			  if(IsOperation(ch))                 
			  {
				  string[k++]=ch;

				  if((oldch=='+')&&(ch=='+'))
				  {
 					  Out(ADDADD,string);
				  }
				  if((oldch=='-')&&(ch=='-'))
				  {
 					  Out(SBBSBB,string);
				  }
                  if((oldch=='*')&&(ch=='*'))
				  {
 					  Out(DBP,string);
				  }
				  if((oldch=='*')&&(ch=='/'))
				  {
 					  Out(ZHUSHI,string);
				  }
			      if((oldch=='/')&&(ch=='*'))
				  {
 					 Out(ZHUSHI,string);
				  }
			  }

              //////算术赋值运算符///////
			  if(IsLogic(ch))
			  {
				 string[k++]=ch;             //读进

                 if((oldch=='+')&&(ch=='='))
				 {
 					 Out(ADDEQU,string);
				 }
		         if((oldch=='-')&&(ch=='='))
				 {
 					 Out(SBBEQU,string);
				 }
			     if((oldch=='*')&&(ch=='='))
				 {
 					 Out(MULEQU,string);
                 }
		         if((oldch=='/')&&(ch=='='))
				 {
 					 Out(DEVEQU,string);
				 }
			  }
			  
			  for(k=0;k<=49;k++)      //清空string,存入\0,字符串的结束
			  {
		         string[k]='\0';
			  } 
		      k=0;                  //k回退	 
		  }
         ////////////////////////////////////////
         ///////////////////如果是界符/////////////
		  if(IsBorder(ch))                   
		  {
             char oldch;
			//读进
    		oldch=string[k++]=ch;
   
			  if(oldch==34)                       //读字双引号内符串
			  {   
				  ch=buffer[++i];
				  while(ch!=34)
				  {
					  string[k++]=buffer[i++];
					  ch=buffer[i];
				  }
                  string[k++]=ch;//buffer[i++];         //读后面的双引号
				  ch=buffer[i];
    			  Out(STRING,string);
			  }
			  if(oldch=='{')
				  Out(LEFTBIG,string);
			  if(oldch=='}')
                  Out(RIGHTBIG,string);
			  if(oldch=='[')
			      Out(LEFTMID,string);
              if(oldch==']')
			      Out(RIGHTMID,string);
              if(oldch=='(')
			      Out(LEFTSMAL,string);
              if(oldch==')')
			      Out(RIGHTSMAL,string);
              if(oldch==',')
			      Out(DOUHAO,string);
              if(oldch==';')
			      Out(FENHAO,string);
			  if(oldch==39)
			      Out(DYHAO,string);
 			  
			  for(k=0;k<=49;k++)      //清空string,存入\0,字符串的结束
			  {
		          string[k]='\0';
			  } 
		      k=0;                  //k回退	 
		  }
          //////////////////////////////////////////
          //////////////////特殊运算符//////////////
          if(IsSpecial(ch))                      
		  {
			  char oldch;
			  char ooldch;                       //用来判断是否位与
			  ooldch=buffer[i-1];
			  oldch=string[k++]=buffer[i++];
			  ch=buffer[i];
              
			  /////////////单目////////////////
			  if(!(IsSpecial(ch)||IsLogic(ch)))             
			  {
              if(oldch=='!')                 //判断是取反还是不等 
				   Out(NOT,string);
			  if(oldch=='#')
				  Out(JINGHAO,string);
			  if(oldch=='.')
				  Out(DOT,string);
 			  if(oldch==':')
 				  Out(MAOHAO,string);
 			  if(oldch=='?')
 				  Out(WENHAO,string);
 			  if(oldch=='%')                 //判断是输出格式还是取余运算
				  Out(PENCENT,string);
 			  if(oldch=='^')
 				  Out(XOR,string);
 			  if(oldch=='&')                 
 					  Out(ADDRESS,string);
 			  if(oldch=='|')
 				  Out(BYTEOR,string);
			  i--;              //单回退
			  }
              
	          ////////////逻辑或,逻辑与////////////
			  if(IsSpecial(ch)||IsLogic(ch))
			  {  
				  string[k++]=ch;              //读进

				  if((oldch=='&')&&(ch=='&'))
				  {
 					  Out(AND,string);
				  }
                  if((oldch=='&')&&(ch=='='))
				  {
 					  Out(AND,string);
				  }
				  if((oldch=='|')&&(ch=='|'))
				  {
 					  Out(OR,string);
				  }
			      if((oldch=='!')&&(ch=='='))
				  {
 					  Out(UNEQUL,string);
				  }
			  }
			  for(k=0;k<=49;k++)      //清空string,存入\0,字符串的结束
			  {
		          string[k]='\0';
			  } 
		      k=0;                  //k回退	 
		  }
          ///////////////////////////////////////////////
          //////////////////逻辑运算符<,>,==/////////////
		  if(IsLogic(ch))                   
		  {
			  char oldch;
			  char ooldch;
			  ooldch=buffer[i-1];
			  oldch=string[k++]=buffer[i++];
			  ch=buffer[i];
              
			  if(!IsLogic(ch))
			  {
				  if(oldch=='>')
					  Out(BIG,string);
				  if(oldch=='<')
					  Out(SMALL,string);
				  if(oldch=='=')                   //判断是否是算术赋值符
					  if(!(IsOperation(ooldch)))
					     Out(VALUE,string);
			      i--;                       //单回退
			  }
              
			  /////////////双目运算////////////
			  if(IsLogic(ch))
			  {
				  string[k++]=ch;      //读进

				  if((oldch=='>')&&(ch=='='))
				  {
 					  Out(BIGEQU,string);
                  }
				  if((oldch=='>')&&(ch=='>'))
				  {
 					  Out(RIGHTMOVE,string);
                  }
				  if((oldch=='<')&&(ch=='='))
				  {
 					  Out(SMALLEQU,string);
                  }
				  if((oldch=='<')&&(ch=='<'))
				  {
 					  Out(LEFTMOVE,string);
                  }
				if((oldch=='=')&&(ch=='='))
				  {
 					  Out(EQUAL,string);
                  }
			  }//////位移运算////
		  }////逻辑运算符////
	    	 
		  for(k=0;k<49;k++)         //清准备接收下一个字符串
			    string[k]='\0';
           k=0;
        }////处理一行////
    }/////扫描文件//
}

///////////////////////
//函数名:IsLetter
//功能:判断是否为字母
//参数说明:ch 字母
///////////////////////
bool IsLetter(char ch)
{
	if((ch>=65&&ch<=90)||(ch>=97&&ch<=122))
		return true;
	else
		return false;
}

///////////////////////
//函数名:IsNumber
//功能:判断是否为数字
//参数说明:ch 字母
///////////////////////
bool IsNumber(char ch)
{
	if(ch>=48&&ch<=57)
		return true;
	else 
		return false;
}

/////////////////////////
//函数名:IsOperation
//功能:判断是否为操作符
//参数说明:ch 字母
/////////////////////////
bool IsOperation(char ch)
{
	if(ch==42||ch==43||ch==45||ch==47)
		return true;
	else 
		return false;
}

///////////////////////
//函数名:IsBorder
//功能:判断是否为界符
//参数说明:ch 字母
//////////////////////
bool IsBorder(char ch)
{
	if(ch==34||ch==39||ch==40||ch==41||ch==91||ch==93||ch==59||ch==123||ch==125||ch==44)
        return true;
	else 
		return false;
}

////////////////////////////
//函数名:IsLogic
//功能:判断是否为逻辑运算符
//参数说明:ch 字母
////////////////////////////
bool IsLogic(char ch)
{
	if(ch==60||ch==61||ch==62)
        return true;
	else 
		return false;
}

/////////////////////////////
//函数名:IsSpecial
//功能:判断是否为特殊运算符
//参数说明:ch 字母
/////////////////////////////
bool IsSpecial(char ch)
{
	if(ch==33||ch==35||ch==37||ch==38||ch==58||ch==63||ch==46||ch==94||ch==124)
        return true;
	else 
		return false;
}

//////////////////////////
//函数名:IsKeyword
//功能:判断是否为保留字
//参数说明:ch 字符串
//////////////////////////
bool IsKeyWord(char* ch)
{
	int i;
	bool flag;

	flag=false;

	for(i=0;i<=31;i++)
		if(!strcmp(ch,keyword[i]))
		{
			flag=true;
		    break;
		}
	if(flag)
		return true;
	else
		return false;
}

//////////////////////////
//函数名:IsMacro
//功能:判断是否为宏定义
//参数说明:ch 字符串指针
///////////////////////////
bool IsMacro(char* ch)
{
	int i;
	bool flag;

	flag=false;

	for(i=0;i<=4;i++)
		if(!strcmp(ch,Macro[i]))
		{
			flag=true;
		    break;
		}
	
	if(flag)
		return true;
	else
		return false;
}

////////////////////////////////////////////////////////
//函数名:Out
//功能:输出字符串
//参数说明:Identifier,字符串类型,str,待输出字符串
////////////////////////////////////////////////////////
void Out(int Identifier,char *str)
{
	LV_ITEM lvi;
	lvi.mask = LVIF_TEXT;
	lvi.iItem = iIndex;
	lvi.iSubItem = 0;
	lvi.pszText = str;
	ListView_InsertItem(hwndListView,&lvi);
	
	switch(Identifier)			//根据不同类型,在类型栏中输出对应文本
	{
	case KEYWORD:
		ListView_SetItemText(hwndListView,iIndex,1,"关键字");
		break;
	case MACRO:
		ListView_SetItemText(hwndListView,iIndex,1,"宏定义");
		break;	
    case BORDER:
		ListView_SetItemText(hwndListView,iIndex,1,"界符");
		break;
	case NUMBER:
		ListView_SetItemText(hwndListView,iIndex,1,"数值");
		break;
	case LOGIC:
		ListView_SetItemText(hwndListView,iIndex,1,"逻辑运算符");
		break;
	case OPERATION:
		ListView_SetItemText(hwndListView,iIndex,1,"算术运算符");
	case STRING:
		ListView_SetItemText(hwndListView,iIndex,1,"字符串");
		break;
    case PLUS:
		ListView_SetItemText(hwndListView,iIndex,1,"加操作符");
		break;
    case SBB:
		ListView_SetItemText(hwndListView,iIndex,1,"减操作符");
		break;
    case MULI:
		ListView_SetItemText(hwndListView,iIndex,1,"星号");
		break;
    case DEVIDE:
		ListView_SetItemText(hwndListView,iIndex,1,"整除操作符");
		break;
	case ERRORSTRING:
		ListView_SetItemText(hwndListView,iIndex,1,"错误类型,请改正!");
		break;
	case DOUBLEYH:
		ListView_SetItemText(hwndListView,iIndex,1,"双引号");
		break;
	case LEFTBIG:
		ListView_SetItemText(hwndListView,iIndex,1,"左大扩号");
		break;
	case RIGHTBIG:
		ListView_SetItemText(hwndListView,iIndex,1,"右大扩号");
		break;
	case LEFTMID:
		ListView_SetItemText(hwndListView,iIndex,1,"左中扩号");
		break;
	case RIGHTMID:
		ListView_SetItemText(hwndListView,iIndex,1,"右中扩号");
		break;
	case LEFTSMAL:
		ListView_SetItemText(hwndListView,iIndex,1,"左小扩号");
		break;
	case RIGHTSMAL:
		ListView_SetItemText(hwndListView,iIndex,1,"右小扩号");
		break;
	case DOUHAO:
		ListView_SetItemText(hwndListView,iIndex,1,"逗号");
		break;
	case FENHAO:
		ListView_SetItemText(hwndListView,iIndex,1,"分号");
		break;
	case ADDEQU:
		ListView_SetItemText(hwndListView,iIndex,1,"加法赋值运算符");
		break;
	case SBBEQU:
		ListView_SetItemText(hwndListView,iIndex,1,"减法赋值运算符");
		break;
	case MULEQU:
		ListView_SetItemText(hwndListView,iIndex,1,"乘法赋值运算符");
		break;
	case DEVEQU:
		ListView_SetItemText(hwndListView,iIndex,1,"除法赋值运算符");
		break;
	case AND:
		ListView_SetItemText(hwndListView,iIndex,1,"与运算符");
		break;
	case OR:
		ListView_SetItemText(hwndListView,iIndex,1,"或运算符");
		break;
	case NOT:
		ListView_SetItemText(hwndListView,iIndex,1,"取反运算符");
		break;
	case UNEQUL:
		ListView_SetItemText(hwndListView,iIndex,1,"逻辑运算符-不等");
		break;
	case BYTEOR:
		ListView_SetItemText(hwndListView,iIndex,1,"位或运算符");
		break;
	case BYTEAND:
		ListView_SetItemText(hwndListView,iIndex,1,"位与运算符");
		break;
	case PENCENT:
		ListView_SetItemText(hwndListView,iIndex,1,"百分号");
		break;
	case XOR:
		ListView_SetItemText(hwndListView,iIndex,1,"位异或运算符");
		break;
   	case MAOHAO:
		ListView_SetItemText(hwndListView,iIndex,1,"冒号");
		break;
	case WENHAO:
		ListView_SetItemText(hwndListView,iIndex,1,"问号");
		break;
	case JINGHAO:
		ListView_SetItemText(hwndListView,iIndex,1,"井号");
		break;
	case DOT:
		ListView_SetItemText(hwndListView,iIndex,1,"结构成员运算符");
		break;
	case BIG:
		ListView_SetItemText(hwndListView,iIndex,1,"大于号");
		break;
	case SMALL:
		ListView_SetItemText(hwndListView,iIndex,1,"小于号");
		break;
	case BIGEQU:
		ListView_SetItemText(hwndListView,iIndex,1,"大于等于");
		break;
	case SMALLEQU:
		ListView_SetItemText(hwndListView,iIndex,1,"小于等于");
		break;
	case EQUAL:
		ListView_SetItemText(hwndListView,iIndex,1,"逻辑等于号");
		break;
	case LEFTMOVE:
		ListView_SetItemText(hwndListView,iIndex,1,"左移");
		break;
	case RIGHTMOVE:
		ListView_SetItemText(hwndListView,iIndex,1,"右移");
		break;		
	case VALUE:
		ListView_SetItemText(hwndListView,iIndex,1,"赋值运算符");
		break;		
	case ADDADD:
		ListView_SetItemText(hwndListView,iIndex,1,"自加运算符");
		break;		
	case SBBSBB:
		ListView_SetItemText(hwndListView,iIndex,1,"自减运算符");
		break;
	case DYHAO:
		ListView_SetItemText(hwndListView,iIndex,1,"单引号");
		break;
	case ZHUSHI:
		ListView_SetItemText(hwndListView,iIndex,1,"注释符号");
		break;
	case FLAG:
		ListView_SetItemText(hwndListView,iIndex,1,"标识符");
		break;	
	case ADDRESS:
		ListView_SetItemText(hwndListView,iIndex,1,"特殊操作符&");
		break;
	case DBP:
		ListView_SetItemText(hwndListView,iIndex,1,"二维指针");
		break;
      }
	iIndex++;
}

⌨️ 快捷键说明

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