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

📄 mydialog.cpp

📁 本程序为用VC开发的词法分析程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		return 1;
	}
	if(ch_in==';')
	{
		tokenstring[num_token].knum=50;
		tokenstring[num_token].entry=-1;
		num_token++;
		return 1;

	}
	if(ch_in=='=')
	{
		tokenstring[num_token].knum=56;
		tokenstring[num_token].entry=-1;
		num_token++;
		return 1;
	}
	return 0;
}

//识别标识符
int CMyDialog::recogGID(TCHAR ch_in)
{
	TCHAR ch;
	int result;
	c_word+=ch_in;
	lcount++;
	ch=Getchar(lcount);
	while(ISDIG(ch)||ISLETTER(ch))
	{
		c_ch=ch;
		c_word+=c_ch;
		lcount++;
		ch=Getchar(lcount);
		if(ch=='~')
			goto LA1;

	}
	
	if(ISILLEGLE(ch))
	{
		lcount--;
		goto LA1;
//		etable[num_error].x=hcount;
//		etable[num_error].y=lcount;
//		etable[num_error].kerror="非法字符";
//		num_error++;
		
	}	
	if(ISEDGE(ch))
	{
		lcount--;
		goto LA1;
	}
//if word is the key word
LA1:
	if((result=ISKEYWORD(c_word))>0)

	{
		//   then token(关键字种别码,_)
		tokenstring[num_token].knum=result+1;
		tokenstring[num_token].entry=-1;
		num_token++;
		c_word="";
		return 1;
	}
	else
	{	//查添符号表
		//token(表示符种别码,entry)
		LookUp(c_word,34);
		c_word="";
		return 2;
	}
	
}

//识别注解及界限符
int CMyDialog::handleCOM(TCHAR ch_in)
{
	CString token;
	c_ch=Getchar(lcount);
	TCHAR ch,ch1;
	lcount++;
	if(c_ch!='*')
	{
		lcount--;
		tokenstring[num_token].knum=48;
		tokenstring[num_token].entry=-1;
		num_token++;
		return 1;
	}
	token="-1";
	ch=Getchar(lcount);
	lcount++;
	while(lcount<h_buffer.GetLength())
	{
		ch1=ch;
		ch=Getchar(lcount);
		lcount++;
		if(ch1=='*'&&ch=='/')
		{
			token="";
		}
	}
	if(token!="")
	{
		etable[num_error].x=hcount;
		etable[num_error].y=lcount;
		etable[num_error].kerror="注解未完";
		num_error++;
		return 0;
	}
	
	return 1;
}

//识别字符常数
int CMyDialog::recogSTR(TCHAR ch_in)
{
	lcount++;
	c_ch=Getchar(lcount);

	while(c_ch!='"')
	{
		lcount++;
		c_word+=c_ch;
		c_ch=Getchar(lcount);		
	}
	if(c_ch=='"')
	{	
		//查添符号表
		//token(表示符种别码,entry)
		LookUp(c_word,37);
		c_word="";
		return 1;
	}
	else
		return 0;
}

//识别实数
int CMyDialog::recogDIG(TCHAR ch_in)
{
	TCHAR ch;
	int flag=0;
	c_word+=ch_in;
	lcount++;
	ch=Getchar(lcount);
//	lcount++;
	if(!ISDIG(ch))
	{
		lcount--;
		LookUp(c_word,35);
		c_word="";
		return 0;
	}
	else
	{	
		c_ch=ch;
		c_word+=c_ch;
		int state=1;
		while(1)
		{
			switch(state)
			{
			case 1:
				{
					c_ch=Getchar(lcount);
					lcount++;
					if(ISDIG(c_ch))
					{
						state=1;
						c_word+=c_ch;
						break;
					}
					else if(c_ch=='.')
					{
						flag=1;
						state=2;
						c_word+=c_ch;
						break;
					}
					else
					{
						state=4;					
					}
				}
			case 2:
				{
					c_ch=Getchar(lcount);
					lcount++;
					if(c_ch=='~')
					{
						//查添符号表
						//token(表示符种别码,entry)
						if(flag==1)
						{
							LookUp(c_word,36);
						}
						else
							LookUp(c_word,35);
						c_word="";
						return 1;
					}
					if(ISDIG(c_ch))
					{
						state=3;
						c_word+=c_ch;
						break;
					}
					else 
					{
						etable[num_error].x=hcount;
						etable[num_error].y=lcount;
						etable[num_error].kerror="常数不合法";
						return 0;
					} 
				}
			case 3:
				{
					c_ch=Getchar(lcount);
					lcount;
					if(c_ch=='~')
					{
						state=4;
					}
					if(ISDIG(c_ch))
					{
						state=3;
						c_word+=c_ch;
						break;
					}
					else 
					{
						state=4;
					} 
				}
			case 4:
				{
						lcount--;
						//查添符号表
						//token(表示符种别码,entry)
						if(flag==1)
						{
							LookUp(c_word,36);
						}
						else
						{
							LookUp(c_word,35);
						}
						c_word="";
						return 1;
				}
			}

		}
	}	
}

void CMyDialog::LookUp(CString str_in, int in)
{
	int lflag=0;
    CString	lbuffer="";
	if(in==34||in==37)
	{
		for(int i=0;i<200;i++)
		{
			for(int j=signtable.addname[i];j<signtable.addname[i]+signtable.lenname[i];j++)
			{
				int t=signtable.addname[2];
				lbuffer+=signtable.signstring.GetAt(j);
			}
		
			if(str_in.Compare(lbuffer)==0)
			{
				lflag=1;
				if(in==34)
				{
					tokenstring[num_token].knum=34;
					tokenstring[num_token].entry=i;
					num_token++;
					break;
				}
				if(in==37)
				{
					tokenstring[num_token].knum=37;
					tokenstring[num_token].entry=i;
					num_token++;
					break;
				}
			}
			else
			{
				lbuffer="";
			}
		}
		if(lflag==0)            //符号表中没有
		{
			int t=str_in.GetLength();
			signtable.lenname[num_sign]=t;
			signtable.addname[num_sign]=signtable.tail;
			signtable.signstring+=str_in;
			if(in==37)
			{
				signtable.type[num_sign]=3;
				tokenstring[num_token].knum=37;
				tokenstring[num_token].entry=num_sign;
				num_token++;
			}
			else
			{
				signtable.type[num_sign]=3;
				tokenstring[num_token].knum=34;
				tokenstring[num_token].entry=num_sign;
				num_token++;
			}
			signtable.tail=signtable.tail+str_in.GetLength();
			num_sign++;			
		}		
	}
	else
	{
		for(int i=0;i<200;i++)
		{
			CString s;
			s.Format("%d",signtable.val[i]); 
			if(!s.Compare(str_in))
			{
				lflag=1;
				if(in==35)
				{
					tokenstring[num_token].knum=35;
					tokenstring[num_token].entry=i;
					num_token++;
					break;
				}
				if(in==36)
				{
					tokenstring[num_token].knum=36;
					tokenstring[num_token].entry=i;
					num_token++;
					break;
				}
			}
		}

		if(lflag==0)
		{
			if(in==35)
			{
				signtable.val[num_sign]=atoi(str_in);
				signtable.type[num_sign]=3;
				tokenstring[num_token].knum=36;
				tokenstring[num_token].entry=num_sign;
				num_sign++;
				num_token++;
			}
			if(in==36)
			{
				signtable.val[num_sign]=atoi(str_in);
				signtable.type[num_sign]=3;
				tokenstring[num_token].knum=37;
				tokenstring[num_token].entry=num_sign;
				num_sign++;
				num_token++;
			}
		}
	}
}



void CMyDialog::WriteToToken()
{
	CFile f;
	CFileException e;
	LPCTSTR Tname = "Ttable.txt";
	CString str1[200],str2[200];

	if( !f.Open( Tname, CFile::modeCreate | CFile::modeWrite, &e ) )
	{
	#ifdef _DEBUG
		afxDump << "File could not be opened " << e.m_cause << "\n";
	#endif
    }

	for(int i=0;i<num_token;i++)
	{
		str1[i].Format("%d",tokenstring[i].knum);
		str2[i].Format("%d",tokenstring[i].entry);
		str1[i]+=" ";
		str1[i]+=str2[i];
		str1[i]+=" ";
		f.Write(str1[i],str1[i].GetLength());
	}
	
	f.Close();
	
}


void CMyDialog::OnBsign() 
{
	// TODO: Add your control notification handler code here
	CString str,str1,str2,str3,str4,str5,str6;
	CString str0="\r\n";
	str+="         SIGNTABLE";
	str+=str0;
	str+="ADDNAME	LENNAME	TYPE	KIND	VAL";
	str+=str0;
	for(int i=0;i<num_sign-1;i++)
	{
		str1.Format("%d",signtable.addname[i]);
		str2.Format("%d",signtable.lenname[i]);
		str3.Format("%d",signtable.type[i]);
		str4.Format("%d",signtable.kind[i]);
		str5.Format("%d",signtable.val[i]);
		str6.Format("%d",signtable.addr[i]);
		str+=str1;
		str+="	";
		str+=str2;
		str+="	";
		str+=str3;
		str+="	";
		str+=str4;
		str+="	";
		str+=str5;
		str+="	";
		str+=str6;
		str+=str0;
	}
	str+="signtable";
	str+=str0;
	int length=signtable.signstring.GetLength();

	for(int j=0;j<length;j++)
	{
		str+=signtable.signstring.GetAt(j);
	}
	RAppendText(str);
}

void CMyDialog::OnBtoken() 
{
	// TODO: Add your control notification handler code here

	CString str1[200],str2[200],str0="\r\n",str="",tstr;
	str+="        The string of TOKEN";
	str+=str0;
	str+="knum		entry";
	str+=str0;
	for(int i=0;i<num_token-1;i++)
	{
		str1[i].Format("%d",tokenstring[i].knum);
		str2[i].Format("%d",tokenstring[i].entry);
		str1[i]+="		";
		str1[i]+=str2[i];
		str+=str1[i];
		str+=str0;		
	}

	RAppendText(str);	
}

void CMyDialog::WriteToSign()
{
	CFile f;
	CFileException e;
	LPCTSTR Sname = "Stable.txt";
	CString str1[200],str2[200],str3[200],str4[200],str5[200],str6[200];
	CString str0="\r\n";

	if( !f.Open( Sname, CFile::modeCreate | CFile::modeWrite, &e ) )
	{
	#ifdef _DEBUG
		afxDump << "File could not be opened " << e.m_cause << "\n";
	#endif
    }

	for(int i=0;i<num_token;i++)
	{
		str1[i].Format("%d",signtable.addname[i]);
		str2[i].Format("%d",signtable.lenname[i]);
		str3[i].Format("%d",signtable.type[i]);
		str4[i].Format("%d",signtable.kind[i]);
		str5[i].Format("%d",signtable.val[i]);
		str6[i].Format("%d",signtable.addr[i]);
		str1[i]+="	";
		str1[i]+=str2[i];
		str1[i]+="	";
		str1[i]+=str3[i];
		str1[i]+="	";
		str1[i]+=str4[i];
		str1[i]+="	";
		str1[i]+=str5[i];
		str1[i]+="	";
		str1[i]+=str6[i];
		str1[i]+="	";

		f.Write(str1[i],str1[i].GetLength());
	}
	
	f.Close();

}

void CMyDialog::WriteToError()
{
	CFile f;
	CFileException e;
	LPCTSTR Ename = "Etable.txt";
	CString str1[200],str2[200];
	CString str0="\r\n";

	if( !f.Open( Ename, CFile::modeCreate | CFile::modeWrite, &e ) )
	{
	#ifdef _DEBUG
		afxDump << "File could not be opened " << e.m_cause << "\n";
	#endif
    }

	for(int i=0;i<num_error;i++)
	{
		str1[i].Format("%d",etable[i].x);
		str1[i]+=" ";
		str2[i].Format("%d",etable[i].y);
		str2[i]+=" ";
		str1[i]+=str2[i];
		str1[i]+=etable[i].kerror;
		str1[i]+=" ";

		f.Write(str1[i],str1[i].GetLength());
	}
}

void CMyDialog::UAppendText(LPCSTR pText)
{
	int nLen=m_Cerror.GetWindowTextLength();
	m_Cerror.SetFocus();
//	m_Cerror.SetSel(nLen,nLen);
	m_Cerror.SetSel(0,-1);
	m_Cerror.ReplaceSel(pText);
}

int CMyDialog::ISEMPTY(TCHAR ch_in)
{
	if(ch_in==' ')
		return 1;
	else
		return 0;
}

⌨️ 快捷键说明

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