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

📄 dlgcreate.cpp

📁 词法分析程序,可以生成词典的access数据库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// struct DICTIONARY DICT_REC 的值全部赋为空
///////////////////////////////////////////////
void CDlgCreate::reset_dict_rec(struct DICTIONARY &DICT_REC)
{
	strcpy(DICT_REC.NUMBER,"");
	strcpy(DICT_REC.W_C,"");
	strcpy(DICT_REC.G_C,"");
	strcpy(DICT_REC.E_C,"");
	strcpy(DICT_REC.W_E,"");
	strcpy(DICT_REC.G_E,"");
	strcpy(DICT_REC.E_E,"");
	strcpy(DICT_REC.DEF,"");
	strcpy(DICT_REC.FIRST_SEM,"");
}


//////////////////////////////////////////////////
// 判定struct DICTIONARY DICT_REC 是否全部赋值
//////////////////////////////////////////////////
int CDlgCreate::dict_rec_getvalue(struct DICTIONARY DICT_REC)
{
	if (strcmp(DICT_REC.NUMBER,"")==0)	// 序号不能为空
		return 0;
	else if (strcmp(DICT_REC.W_C,"")==0)	// W_C不能为空
		return 0;
	else if (strcmp(DICT_REC.G_C,"")==0)	// G_C不能为空
		return 0;
	else if (strcmp(DICT_REC.W_E,"")==0)	// W_E不能为空
		return 0;
	else if (strcmp(DICT_REC.G_E,"")==0)	// G_E不能为空
		return 0;
	else if (strcmp(DICT_REC.DEF,"")==0)	// DEF不能为空
		return 0;
	return 1;
}


/////////////////////////////////////////////
//判断文件存在与否
/////////////////////////////////////////////
int CDlgCreate::exist_file(CString file_name)
{
	char name[MAX_LEN];
	strcpy(name,file_name);
	return (access(name, 0) == 0);
}


//////////////////////////////////////////////////////
// 建立表dict,存放《知网》的双语知识词典
//////////////////////////////////////////////////////
void CDlgCreate::build_dict(CString hownet_txt_file, CString hownet_database_file)
{
	// 定义存放《知网》词典各个项的最大字符数目的数组
	unsigned int max_line_len[10];

	// 取得《知网》词典词条的各个项的最大字符数
	get_field_len(hownet_txt_file,max_line_len);

	// 根据《知网》词典各个项的最大字符数
	// 建立《知网》数据库的表dict的库结构
	// 上述各个项的最大字符数对应数据库各个字段的长度
	build_hownet_dictstru(hownet_database_file,max_line_len);

	build_hownet_dict(hownet_txt_file,hownet_database_file);
}


//////////////////////////////////////////////////////
// 建立表dict,存放《知网》的双语知识词典
//////////////////////////////////////////////////////
void CDlgCreate::build_database(CString hownet_database_file)
{
	// 建立《知网》数据库的库结构
	// 只是建立一个空库

	if (exist_file(hownet_database_file))
	{
		CString msg;
		msg.Format("文件 %s 已经存在,要覆盖它吗?",hownet_database_file);
		int answer=MessageBox(msg,"覆盖已经存在的文件吗?",MB_ICONQUESTION|MB_YESNO);
		if (answer==IDYES)
		{
			if (remove(hownet_database_file) != 0)
			{
				MessageBox("不能删除该文件","提示",MB_ICONINFORMATION);
				return;
			}
		}
		else
			return;
	}

	CDaoDatabase myDatabase;
	myDatabase.Create(hownet_database_file);
	myDatabase.Close();

}


/////////////////////////////////////////////
//	选定一个文件夹,返回其名称
//////////////////////////////////////////////
void CDlgCreate::get_path(CString &my_path)
{
	BROWSEINFO bi;	//文件夹浏览结构
	char dispname[MAX_PATH],path[MAX_PATH];
	ITEMIDLIST *pidl;
	//初始化bi
	bi.hwndOwner=0;
	bi.pidlRoot=0;
	bi.pszDisplayName=dispname;
	bi.lpszTitle="请选择文件操作所在的目录:";
	bi.ulFlags=BIF_RETURNONLYFSDIRS;
	bi.lpfn=0;
	bi.lParam=0;
	bi.iImage=0;

	//弹出文件夹窗口,并选取目录
	if (pidl=SHBrowseForFolder(&bi))
	{
		SHGetPathFromIDList(pidl,path);	//取得目录信息
		my_path=path;
		UpdateData(FALSE);
	}

	if (my_path=="")
		return;
	else if (my_path.GetAt(my_path.GetLength()-1)=='\\' && 
			 my_path.GetAt(my_path.GetLength()-2)!=':')
		my_path=my_path.Left(my_path.GetLength()-1);

	return;
}


////////////////////////////////////////////////////
// 把路径名和文件名合成全路径文件名
////////////////////////////////////////////////////
void CDlgCreate::merge_path_name(CString Path, CString Name, CString &FullName)
{
	FullName=Path;
	if (Path.GetAt(Path.GetLength()-1)!='\\')
		FullName+="\\";
	FullName+=Name;
}


//////////////////////////////////////////////////////
// 建立表entity,存放《知网》的entity层次体系
//////////////////////////////////////////////////////
int CDlgCreate::build_entity(CString entity_txt_file, CString hownet_database_file, int &i_max_entity_name_len)
{

	int i_e_read_pointer;
	struct fieleds_len entity_fields_len;

	//	建立名词entity层次树
	i_e_read_pointer=-1;
	i_e_read_pointer=e_build_layer_tree(entity_txt_file,E_NODE,MAX_EVENT_NUMBER,entity_fields_len);
	if (i_e_read_pointer==-1)
		return -1;

	//输出建立的名词entity层次树到数据库中
	int i_to_database=e_put_layer_tree_to_database(hownet_database_file,E_NODE,i_e_read_pointer,entity_fields_len);
	if (i_e_read_pointer==-1)
		return -1;

	i_max_entity_name_len=entity_fields_len.len_name;

	return 0;

}


////////////////////////////////////////////////
//
//	建立名词entity义原层次结构树
//
////////////////////////////////////////////////
int CDlgCreate::e_build_layer_tree(CString FileName,entity_tree *NODE,int max_read_number,struct fieleds_len &entity_fields_len)
{	
	//定义后进先出栈
	int STACK[MAX_ENTITY_LAYER];	//里面存放的是节点在NODE[]中的位置
	//定义节点的指针(只是一些数,指示节点的位置)
	int i_read_pointer;
	//定义栈的指针
	int i_stack_pointer;


	// 初始化entity_fields_len
	entity_fields_len.len_name=0;
	entity_fields_len.len_attr=0;
	entity_fields_len.len_order=4;
	entity_fields_len.len_layer=4;
	entity_fields_len.len_parent=4;
	entity_fields_len.len_son=4;
	entity_fields_len.len_brother=4;

	//打开选定的文件
	CStdioFile inFile;
	if (!inFile.Open(FileName,CFile::modeRead))
	{
		CString TempStr;
		TempStr.Format("%s%s","无法读取文件:",FileName);
		AfxMessageBox(TempStr);
		return -1;
	}

	//一行行地读取文件直到文件结束
	i_read_pointer=0;
	i_stack_pointer=-1;

	char s[MAX_LINE_LEN];	//定义s存放读入的字符串,这里MAX_LINE_LEN是一个预先定
							//义的常量,一行的最大允许字符的个数
	while(inFile.ReadString(s,MAX_LINE_LEN))
	{
		char *p=s+strlen(s)-1;		
		while (p>s && isspace(*p))
			p--;
		if (p<=s)
			s[0]='\0';
		if (strlen(s)==0)
				continue;

			//节点赋初值
			CString entity_name="",entity_role="";
			get_name_attr(s,entity_name,entity_role);
			del_englidh_info(entity_name);
			del_englidh_info(entity_role);
			if (entity_name.GetLength()>entity_fields_len.len_name)
				entity_fields_len.len_name=entity_name.GetLength();
			if (entity_role.GetLength()>entity_fields_len.len_attr)
				entity_fields_len.len_attr=entity_role.GetLength();

			NODE[i_read_pointer].entity_name=entity_name;
			NODE[i_read_pointer].entity_attr=entity_role;
			if (NODE[i_read_pointer].entity_name=="")
				NODE[i_read_pointer].entity_name="*";
			if (NODE[i_read_pointer].entity_attr=="")
				NODE[i_read_pointer].entity_attr="*";
			NODE[i_read_pointer].order=i_read_pointer;
			NODE[i_read_pointer].son=-1;
			NODE[i_read_pointer].brother=-1;
			NODE[i_read_pointer].parent=-1;
			//确定节点的层次
			NODE[i_read_pointer].layer=get_layer(s);
			if (NODE[i_read_pointer].layer<0)
			{
				CString msg;
				msg.Format("建立层次树的时候出了问题,请检查源文件\n%s 第 %d 行",FileName,i_read_pointer+1);
				MessageBox(msg);
				return -1;
			}

			//建立动词义原层次树
			if (i_stack_pointer==-1)	//如果栈为空,刚读到的节点是根节点
			{
				NODE[i_read_pointer].layer=0;
				i_stack_pointer=0;
				STACK[i_stack_pointer]=NODE[i_read_pointer].order;
			}
			else	//刚读到的节点不是根节点,要入栈
			{
				//如果是栈顶节点的层次大于当前节点的层次
				//那么应该退栈,直到前者小与或者等于后者
				while (NODE[STACK[i_stack_pointer]].layer>NODE[i_read_pointer].layer)
				{
					i_stack_pointer--;
					if (i_stack_pointer<0)
					{
						CString msg;
						msg.Format("建立层次树的时候出了问题,请检查源文件\n%s 第 %d 行",FileName,i_read_pointer+1);
						MessageBox(msg);
						return -1;
					}
				}
				
				
				if (NODE[STACK[i_stack_pointer]].layer==NODE[i_read_pointer].layer)	
					//栈顶节点与当前节点是兄弟关系
				{

					NODE[STACK[i_stack_pointer]].brother=NODE[i_read_pointer].order;
					NODE[i_read_pointer].parent=NODE[STACK[i_stack_pointer]].parent;
					STACK[i_stack_pointer]=NODE[i_read_pointer].order;
				}
				else if (NODE[STACK[i_stack_pointer]].layer==NODE[i_read_pointer].layer-1)
					//栈顶节点与当前节点是父子关系
				{
					NODE[i_read_pointer].parent=STACK[i_stack_pointer];
					NODE[STACK[i_stack_pointer]].son=NODE[i_read_pointer].order;

					i_stack_pointer++;
					STACK[i_stack_pointer]=NODE[i_read_pointer].order;
				}
				else
				{
					CString msg;
					msg.Format("建立层次树的时候出了问题,请检查源文件\n%s 第 %d 行",FileName,i_read_pointer+1);
					MessageBox(msg);
					return -1;
				}
			}
	

			i_read_pointer++;
			if (i_read_pointer>=max_read_number)
			{
					CString msg;
					msg.Format("建立层次树的时候出了问题,源文件\n%s 行数太多,预留数组空间不足",FileName);
					MessageBox(msg);
					return -1;
			}
	}
	inFile.Close();
	return i_read_pointer;
}


///////////////////////////////////////////////
//
//	把名词entity实体层次树填入数据库的entity表
//
///////////////////////////////////////////////
int CDlgCreate::e_put_layer_tree_to_database(CString FileName_out, struct entity_tree *NODE,int i_write_pointer,struct fieleds_len entity_fields_len)
{
	// 建立表entity
	build_hownet_entitystru(FileName_out,entity_fields_len);

	// 打开数据库FileName_out
	CDaoDatabase myDatabase;
	myDatabase.Open(FileName_out);

	// 打开存放entity层次关系的表entity
	CDaoTableDef *pTable;
	pTable=new CDaoTableDef(&myDatabase);
	pTable->Open("entity");

	// 对应表dict打开记录集
	CDaoRecordset *pRec;
	pRec=new CDaoRecordset(&myDatabase);
	pRec->Open(pTable);

	//输出建立的entity层次树导数据库的表entity
	struct record
	{
		CString COrder;
		CString CName;
		CString CAttr;
		CString CLayer;
		CString CParent;
		CString CSon;
		CString CBrother;
	}REC;

	COleVariant cole_order;
	COleVariant cole_name(REC.CName,VT_BSTRT);
	COleVariant cole_attr(REC.CAttr,VT_BSTRT);
	COleVariant cole_layer;
	COleVariant cole_parent;
	COleVariant cole_son;
	COleVariant cole_brother;
	
	for (int i=0;i<i_write_pointer;i++)
	{
		pRec->AddNew();

		cole_order=(long)NODE[i].order;
		pRec->SetFieldValue("序号",cole_order);

		REC.CName.Format("%s",NODE[i].entity_name);
		cole_name.SetString(REC.CName,VT_BSTRT);
		pRec->SetFieldValue("名称",cole_name);

		REC.CAttr.Format("%s",NODE[i].entity_attr);
		cole_attr.SetString(REC.CAttr,VT_BSTRT);
		pRec->SetFieldValue("属性",cole_attr);

		cole_layer=(long)NODE[i].layer;
		pRec->SetFieldValue("层次",cole_layer);

		cole_parent=(long)NODE[i].parent;
		pRec->SetFieldValue("父亲",cole_parent);

		cole_son=(long)NODE[i].son;
		pRec->SetFieldValue("儿子",cole_son);

		
		cole_brother=(long)NODE[i].brother;
		pRec->SetFieldValue("兄弟",cole_brother);

		pRec->Update();

	}
	pRec->Close();
	delete pRec;
	pTable->Close();	
	delete pTable;
	myDatabase.Close();


/*
	//输出建立的层次树之二-----调试程序
	CString FileName_out2=FileName_out+".txt";
	CStdioFile outFile;
	if (!outFile.Open(FileName_out2,CFile::modeCreate|CFile::modeWrite))
	{
		CString TempStr;
		TempStr.Format("%s%s","无法创建文件:",FileName_out2);
		AfxMessageBox(TempStr);
		return -1;
	}
	for (int k=0;k<i_write_pointer;k++)
	{
			CString s_wr="";
			for(int j=0;j<NODE[k].layer*3+2;j++)
				s_wr+=" ";
			s_wr+=NODE[k].entity_name;
			s_wr+="    ";
			s_wr+=NODE[k].entity_attr;
			s_wr+="\n";
			outFile.WriteString(s_wr);
	}
	outFile.Close();
*/
	return 0;
}


////////////////////////////////////////////
//
//	 获得名词义原entity的名字和性质
//
////////////////////////////////////////////
void CDlgCreate::get_name_attr(char *str,CString &entity_name,CString &entity_role)
{

	entity_name=entity_role="";
	
	char *p,*q;
	char fetch_str[MAX_LINE_LEN];

	p=str;
	
	//定位到第一个英文字母
	while (*p && !(isascii(*p) && isalpha(*p)))
	{
		if (!isascii(*p))
			p++;
		p++;
	}
	if (*p=='\0')
		return;

	//开始拷贝动词义原的名字
	q=fetch_str;
	while (*p && !(isascii(*p) && isspace(*p)))
	{
		if (!isascii(*p))
			*q++=*p++;
		*q++=*p++;
	}
	*q='\0';
	entity_name=fetch_str;

	//定位到第一个"["
	while (*p && *p!='[')
	{
		if (!isascii(*p))
			p++;
		p++;
	}

	if (*p=='\0')
		return;
	p++;

	//开始拷贝名词属性
	q=fetch_str;
	while (*p && *p!=']')
	{
		if (!isascii(*p))
			*q++=*p++;
		*q++=*p++;
	}
	*q='\0';
	entity_role=fetch_str;
}


//////////////////////////////////////////////////////
//删除DEF中的英文信息
//////////////////////////////////////////////////////
void CDlgCreate::del_englidh_info(CString & def_info)
{
	char new_info[MAX_LEN],*p=new_info;
	for(int i=0;i<def_info.GetLength();i++)
	{
		char ch=def_info.GetAt(i);
		if (isascii(ch))
		{
			if (isalpha(ch) && !eq_after_it(def_info,i) || '|'==ch)
				continue;
			else
				*p++=ch;
		}
		else
		{
			*p++=ch;
			if (i<def_info.GetLength()-1)
				*p++=def_info.GetAt(++i);
		}

	}
	*p='\0';
	def_info=new_info;
}


////////////////////////////////////////////
//
//	 获得节点的层次
//
////////////////////////////////////////////
int CDlgCreate::get_layer(char *str)
{

	char *p=str;
	
	//定位到第一个英文字母

⌨️ 快捷键说明

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