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

📄 bbbdlg.cpp

📁 这是个源码合集
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    if(Syn_Key)
	{
      AfxMessageBox("目标部分语法正确!");
	}
    else
	{
      AfxMessageBox("目标部分有语法错误!");
	}

    char cstr_S_P_buff[MAX*LINES];
	m_S_P_Edit.GetWindowText(cstr_S_P_buff,MAX*LINES);
	if ( strlen(cstr_S_P_buff)!=0 )
     strcat(cstr_S_P_buff,"\r\n");
     strcat(cstr_S_P_buff,m_error_temp);

    m_S_P_Edit.SetSel(0,-1);
	m_S_P_Edit.ReplaceSel(cstr_S_P_buff);

	  char temp[MAX];
      char Num_temp[MAX];
      itoa(Num_V,Num_temp,10);
      strcpy(temp,"目标中有");
	  strcat(temp,Num_temp);
      strcat(temp,"个待例化的变量!");
      AfxMessageBox(temp);
}

void CBBBDlg::OnButtonInF() 
{
	// TODO: Add your control notification handler code here
	//导入事实
  //
  //确认原先的事实内容为空
  ////////////////////////
  //
	char cstr_Test_F_P[MAX*LINES];
	m_F_P_Edit.GetWindowText(cstr_Test_F_P,MAX*LINES);
	if(strlen(cstr_Test_F_P)!=0 )
	{
		AfxMessageBox("在导入事实之前,请先清空已有的!如果需要保存它们,请先导出到文件!");
		SetCursor(LoadCursor(NULL,IDC_ARROW));	
		return;
	}
  //
  //////////////////////////////////////////////////////////
  //
	static char BASED_CODE szFilterMIDI[]="Prolog事实文件(*.pro)|*.pro||";
	CFileDialog fileopenbox(TRUE,"专家系统文件",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilterMIDI);
	fileopenbox.m_ofn.lpstrTitle="导入Prolog事实文件";
	if(fileopenbox.DoModal()!=IDOK){
		return;
	}
    CString tempName = fileopenbox.GetPathName();
    CFile f;
	if (f.Open(tempName,CFile::modeRead))
	{
      f.Read(cstr_Test_F_P,MAX*LINES);
	  //
	  char *m_myBuffer;
      m_myBuffer = new char[strlen(cstr_Test_F_P)+1];
      int i;
	  for(i=0;i<f.GetLength();i++)
	  {
	   m_myBuffer[i]=cstr_Test_F_P[i];
	  }
      m_myBuffer[i]='\0';
	  //
      m_F_P_Edit.SetSel(0,-1);
      m_F_P_Edit.ReplaceSel(m_myBuffer);
	  f.Close();
	}
	else
	{
      AfxMessageBox("Prolog事实文件打开失败!");
	}
}

void CBBBDlg::OnButtonOutF() 
{
    //导出事实

	//
	//确认导出的事实内容不能为空
////////////////////////	
	char cstr_Test_F_P[MAX*LINES];
	m_F_P_Edit.GetWindowText(cstr_Test_F_P,MAX*LINES);
	if(strlen(cstr_Test_F_P)==0 )
	{
		AfxMessageBox("你要导出的事实为空,请确认!");
		SetCursor(LoadCursor(NULL,IDC_ARROW));	
		return;
	}
/////////////////////////////////

	//
    //用对话框传入文件名
////////////////////////////////
	static char BASED_CODE szFilterMIDI[]="Prolog事实文件(*.pro)|*.pro||";
	CFileDialog filesavebox(FALSE,"专家系统文件",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilterMIDI);
	filesavebox.m_ofn.lpstrTitle="导出Prolog事实文件,保存为:";
	if(filesavebox.DoModal()!=IDOK){
		return;
	}
///////////////////////////
    CString tempName = filesavebox.GetPathName();
	CFile f;

	if (f.Open(tempName,CFile::modeWrite | CFile::modeCreate))
	{
		char endline[2]={13,10};
		CString blank;
		m_F_P_Edit.GetWindowText(cstr_Test_F_P,MAX*LINES);
        f.Write(cstr_Test_F_P,strlen(cstr_Test_F_P));
		f.Close();	
	}    
}

void CBBBDlg::OnButtonFPCls() 
{
	// TODO: Add your control notification handler code here
    m_F_P_Edit.SetSel(0,-1);
	m_F_P_Edit.ReplaceSel("");
}

void CBBBDlg::OnButtonTestFactorSyn() 
{
   	// TODO: Add your control notification handler code here
		// TODO: Add your control notification handler code here
//
//清空状态栏中的过时信息
////////////////////////
//   
	m_S_P_Edit.SetSel(0,-1);
	m_S_P_Edit.ReplaceSel("");
//
//相关的全局变量的初始化
////////////////////////
// 
    int F_Lines=0;  //每次按下检测键都要从第一行重新开始检测
//------------------------------------
  //确认目标的内容不为空
  ////////////////////////
  //
	char cstr_Test_F_P[MAX*LINES];
    m_F_P_Edit.GetWindowText(cstr_Test_F_P,MAX*LINES);
	if(strlen(cstr_Test_F_P)==0 )
	{
		AfxMessageBox("要想检测事实部分的语法,请先添加事实!");
		return;
	}
  //
  //
//////////////////////////////////////////////////////////////////////
//
//词法分析部分:
//////////////////////////////////////////////////////////////////////
	//
	// 先将多行事实文本存入Test_F_Syn_In_S.dat
	//
    CString tempNameS ="Test_F_Syn_In_S.dat";
	CFile f;
	if (f.Open(tempNameS,CFile::modeWrite | CFile::modeCreate))
	{
		char endline[2]={13,10};
		CString blank;
		m_F_P_Edit.GetWindowText(cstr_Test_F_P,MAX*LINES);
        f.Write(cstr_Test_F_P,strlen(cstr_Test_F_P));
		f.Close();	
	}
//////////////////////////////////////////////////////////////////////
	//
	// 建立Test_F_Syn_Out.dat暂存处理好的逐行文本
	//
    CString tempName2 ="Test_F_Syn_Out.dat";
	if (f.Open(tempName2,CFile::modeWrite | CFile::modeCreate))
	{
		f.Close();	
	}
//////////////////////////////////////////////////////////////////////
	//
	// 再将保存多行事实的文件Test_F_Syn_In_S.dat中的事实逐行读出,每次由存到Test_G_Syn_In.dat中
	//
	FILE *fS;
	if((fS=fopen("Test_F_Syn_In_S.dat","r"))==NULL)
	{
      AfxMessageBox("不能打开输入文件!Test_F_Syn_In_S.dat");
	  return;
	}
    ofstream onfile;
    ifstream infile;

	char buff_S[BY_MAX_BUFF_LENTH];
//////////////////////////////////////////////////////////////////////
 	//
	// 逐行!对事实部分进行语法检测
	//
/////////////////while

 while(fgets(buff_S,BY_MAX_BUFF_LENTH,fS)!=NULL)
 { 
	  F_Lines++;
	  strcpy(buff,buff_S);
	  //
      ////////////////////////////////////////////////////////////////   
	  // 相关全局变量的初始化
	  //
	  Syn_Lines=0;  //对于每行的检测,
      I=0;
      Code_I=0;
      Syn_Key=true;
      strcpy(m_error_temp,"");
	  //
      ////////////////////////////////////////////////////////////////   
	  // 若当前行是以"\r\n"结尾,则去掉
	  //
      delete_one(buff,'\n');
	  delete_one(buff,'\r');
	  //
      ////////////////////////////////////////////////////////////////   
	  // 对于每一行,逐字存入输出文件
	  //
	  onfile.open("Test_F_Syn_Out.dat");
	  if (!onfile)
	  {
	    AfxMessageBox("不能打开输出文件!Test_F_Syn_Out.dat");
	    return;
	  }
      while(I<=strlen(buff)-1)
	  {
          Get_A_Word(onfile);
	  }
      onfile.close();
	  //
      ////////////////////////////////////////////////////////////////   
	  // 对于每一行,将输出文件作为输入文件,读入到编码流
	  //
	  infile.open("Test_F_Syn_Out.dat",ios::in|ios::nocreate);
	  if (!infile)
	  {
	    AfxMessageBox("不能打开输入文件!Test_F_Syn_Out.dat");
	    return;
	  }
      int kk;
	  Code_I=0;
	  char temp_buff[MAX];
      for(kk=1;kk<=Syn_Lines;kk++)
	  {  
        infile>>Code_F[Code_I];
        infile>>temp_buff;
        Code_I++;
	  }
      infile.close();
	  //
      ////////////////////////////////////////////////////////////////   
	  // 对于每一行事实,检测其语法
	  //
      Code_I=0;
      F_Factor();
	  //
      ////////////////////////////////////////////////////////////////   
	  // 做出结论 
	  //
      if(!Syn_Key)
	  {
        AfxMessageBox("事实部分有语法错误!");    
	    //
        ////////////////////////////////////////////////////////////////   
	    // 给出提示
	    //
		char cstr_S_P_buff[MAX*LINES];  
		//
		char error_lines[MAX];
		itoa(F_Lines,error_lines,10);
        //
		char temp[MAX];
		strcpy(temp,"事实部分出现了语法错误,错误在第");
		strcat(temp,error_lines);
		strcat(temp,"行!");
		//
	    m_S_P_Edit.GetWindowText(cstr_S_P_buff,MAX*LINES);
  	    if ( strlen(cstr_S_P_buff)!=0 )
        strcat(cstr_S_P_buff,"\r\n");
        strcat(cstr_S_P_buff,temp);
		//
        m_S_P_Edit.SetSel(0,-1);
	    m_S_P_Edit.ReplaceSel(cstr_S_P_buff);
		//
	    m_S_P_Edit.GetWindowText(cstr_S_P_buff,MAX*LINES);
  	    if ( strlen(cstr_S_P_buff)!=0 )
        strcat(cstr_S_P_buff,"\r\n");
        strcat(cstr_S_P_buff,m_error_temp);
		//
        m_S_P_Edit.SetSel(0,-1);
	    m_S_P_Edit.ReplaceSel(cstr_S_P_buff);
	    //
        ////////////////////////////////////////////////////////////////   
	    // 只要有一行事实有错,就,将行缓冲区清空,将总文件关闭,然后返回
	    //
		strcpy(buff_S,"");
        fclose(fS);
		return;
	  }	    
   }
/////////////////while_end
    //
    ////////////////////////////////////////////////////////////////   
    // 所有的事实行都正确,则,提示正确, 将行缓冲区清空,将总文件关闭,等待下一次
	// 
	AfxMessageBox("事实部分语法正确!");
    strcpy(buff_S,"");
    fclose(fS); 

}
	
   
     
 
          

void CBBBDlg::OnButtonTestRuleSyn() 
{
	// 规则部分语法检测
	//

//////////////////////////////////////
	// 每次点击 都要重新作一次语法分析,因此相关全局变量必须初始化
	// 特别是规则部分的语法分析,将影响标记的添加
    // 尤其是标识符表部分
	   int tt;
	   for(tt=0;tt<BY_MAX_NUM_OF_C;tt++)
	   {
	      strcpy(c[tt],"");
		  c_value[tt]=-1;
	   }	   
	   for(tt=0;tt<BY_MAX_NUM_OF_V;tt++)
	   {
	      strcpy(b[tt],"");
		  b_value[tt]=-1;
	   }
/////////////////////////////////////


//
//清空状态栏中的过时信息
////////////////////////
//   
	m_S_P_Edit.SetSel(0,-1);
	m_S_P_Edit.ReplaceSel("");
//
//相关的全局变量的初始化
////////////////////////
// 
    int F_Lines=0;  //每次按下检测键都要从第一行重新开始检测
//------------------------------------
  //确认规则部分的内容不为空
  ////////////////////////
  //
	char cstr_Test_RF_P[MAX*LINES];
    m_RF_P_Edit.GetWindowText(cstr_Test_RF_P,MAX*LINES);
	if(strlen(cstr_Test_RF_P)==0 )
	{
		AfxMessageBox("要想检测规则部分的语法,请先添加规则!");
		return;
	}
  //
  //
//////////////////////////////////////////////////////////////////////
//
//词法分析部分:
//////////////////////////////////////////////////////////////////////
	//
	// 先将多行规则文本存入Test_RF_Syn_In_S.dat
	//
    CString tempNameS ="Test_RF_Syn_In_S.dat";
	CFile f;
	if (f.Open(tempNameS,CFile::modeWrite | CFile::modeCreate))
	{
		char endline[2]={13,10};
		CString blank;
		m_RF_P_Edit.GetWindowText(cstr_Test_RF_P,MAX*LINES);
        f.Write(cstr_Test_RF_P,strlen(cstr_Test_RF_P));
		f.Close();	
	}
//////////////////////////////////////////////////////////////////////
	//
	// 建立Test_RF_Syn_Out.dat暂存处理好的逐行文本
	//
    CString tempName2 ="Test_RF_Syn_Out.dat";
	if (f.Open(tempName2,CFile::modeWrite | CFile::modeCreate))
	{
		f.Close();	
	}
//////////////////////////////////////////////////////////////////////
	//
	// 再将保存多行规则的文件Test_RF_Syn_In_S.dat中的规则逐行读出,每次由存到Test_RF_Syn_In.dat中
	//
	FILE *fS;
	if((fS=fopen("Test_RF_Syn_In_S.dat","r"))==NULL)
	{
      AfxMessageBox("不能打开输入文件!Test_RF_Syn_In_S.dat");
	  return;
	}
    ofstream onfile;
    ifstream infile;

	char buff_S[BY_MAX_BUFF_LENTH];
//////////////////////////////////////////////////////////////////////
 	//
	// 逐行!对规则部分进行语法检测
	//
/////////////////while

 while(fgets(buff_S,BY_MAX_BUFF_LENTH,fS)!=NULL)
 { 
	  F_Lines++;
	  strcpy(buff,buff_S);
	  //
      ////////////////////////////////////////////////////////////////   
	  // 相关全局变量的初始化
	  //
	  Syn_Lines=0;  //对于每行的检测,
      I=0;
      Code_I=0;
      Syn_Key=true;
      strcpy(m_error_temp,"");
	  //
      ////////////////////////////////////////////////////////////////   
	  // 若当前行是以"\r\n"结尾,则去掉
	  //
      delete_one(buff,'\n');
	  delete_one(buff,'\r');
	  //
      ////////////////////////////////////////////////////////////////   
	  // 对于每一行,逐字存入输出文件
	  //
	  onfile.open("Test_RF_Syn_Out.dat");
	  if (!onfile)
	  {
	    AfxMessageBox("不能打开输出文件!Test_RF_Syn_Out.dat");
	    return;
	  }
      while(I<=strlen(buff)-1)
	  {
          Get_A_Word(onfile);
	  }
      onfile.close();
	  //
      ////////////////////////////////////////////////////////////////   
	  // 对于每一行,将输出文件作为输入文件,读入到编码流
	  //
	  infile.open("Test_RF_Syn_Out.dat",ios::in|ios::nocreate);
	  if (!infile)
	  {
	    AfxMessageBox("不能打开输入文件!Test_RF_Syn_Out.dat");
	    return;
	  }
      int kk;
	  Code_I=0;
	  char temp_buff[MAX];
      for(kk=1;kk<=Syn_Lines;kk++)
	  {  
        infile>>Code_F[Code_I];
        infile>>temp_buff;
        Code_I++;
	  }
      infile.close();
	  //
      ////////////////////////////////////////////////////////////////   
	  // 对于每一行规则,检测其语法
	  //
      Code_I=0;
      Rule();
	  //
      ////////////////////////////////////////////////////////////////   
	  // 做出结论 
	  //
      if(!Syn_Key)
	  {
        AfxMessageBox("规则部分有语法错误!");    
	    //
        ////////////////////////////////////////////////////////////////   
	    // 给出提示
	    //
		char cstr_S_P_buff[MAX*LINES];  
		//
		char error_lines[MAX];
		itoa(F_Lines,error_lines,10);
        //
		char temp[MAX];
		strcpy(temp,"规则部分出现了语法错误,错误在第");
		strcat(temp,error_lines);
		strcat(temp,"行!");
		//
	    m_S_P_Edit.GetWindowText(cstr_S_P_buff,MAX*LINES);
  	    if ( strlen(cstr_S_P_buff)!=0 )
        strcat(cstr_S_P_buff,"\r\n");
        strcat(cstr_S_P_buff,temp);
		//
        m_S_P_Edit.SetSel(0,-1);
	    m_S_P_Edit.ReplaceSel(cstr_S_P_buff);
		//
	    m_S_P_Edit.GetWindowText(cstr_S_P_buff,MAX*LINES);
  	    if ( strlen(cstr_S_P_buff)!=0 )
        strcat(cstr_S_P_buff,"\r\n");
        strcat(cstr_S_P_buff,m_error_temp);
		//
        m_S_P_Edit.SetSel(0,-1);
	    m_S_P_Edit.ReplaceSel(cstr_S_P_buff);
	    //
        ////////////////////////////////////////////////////////////////   
	    // 只要有一行规则有错,就,将行缓冲区清空,将总文件关闭,然后返回
	    //
		strcpy(buff_S,"");
        fclose(fS);
		return;
	  }	    
   }
/////////////////while_end
    //
    ////////////////////////////////////////////////////////////////   
    // 所有的规则行都正确,则,提示正确, 将行缓冲区清空,将总文件关闭,等待下一次
	// 
	AfxMessageBox("规则部分语法正确!");
    strcpy(buff_S,"");
    fclose(fS);
}

⌨️ 快捷键说明

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