📄 bbbdlg.cpp
字号:
{
strcat(cstr_Buff_R_S,"\r\n");
}
strcpy(m_wrongBuffer,m_myBuffer);
strcat(cstr_Buff_R_S,m_wrongBuffer);
m_S_P_Edit.SetSel(0,-1);
m_S_P_Edit.ReplaceSel(cstr_Buff_R_S);
//--显示段结束
//
//--显示段开始 //显示 "行附近。"
m_S_P_Edit.GetWindowText(cstr_Buff_R_S,MAX*LINES);
if ( strlen(cstr_Buff_R_S)!=0 )
{
strcat(cstr_Buff_R_S,"\r\n");
}
strcpy(m_wrongBuffer,"行附近。");
strcat(cstr_Buff_R_S,m_wrongBuffer);
m_S_P_Edit.SetSel(0,-1);
m_S_P_Edit.ReplaceSel(cstr_Buff_R_S);
//--显示段结束
//
lsClose(CurEng); //关闭逻辑服务器
return;
}
}
}
//
//////////////////////////////////////
// 读出 询问 并载入逻辑服务器
//
m_G_P_Edit.GetLine(0,cstr_Buff,MAX);
//
//////////////////////////////////////
//
char temp[MAX];
char Num_temp[MAX];
if (Num_V==0)
//不带变量的目标,只用判断正误
{
strcpy(temp,"目标中没有待例化的变量");
//--显示段开始
m_R_P_Edit.GetWindowText(cstr_Buff_R_S,MAX*LINES);
if ( strlen(cstr_Buff_R_S)!=0 )
{
strcat(cstr_Buff_R_S,"\r\n");
}
strcat(cstr_Buff_R_S,temp);
m_R_P_Edit.SetSel(0,-1);
m_R_P_Edit.ReplaceSel(cstr_Buff_R_S);
//--显示段结束
strcpy(temp,"因此只检测目标的正确性");
//--显示段开始
m_R_P_Edit.GetWindowText(cstr_Buff_R_S,MAX*LINES);
if ( strlen(cstr_Buff_R_S)!=0 )
{
strcat(cstr_Buff_R_S,"\r\n");
}
strcat(cstr_Buff_R_S,temp);
m_R_P_Edit.SetSel(0,-1);
m_R_P_Edit.ReplaceSel(cstr_Buff_R_S);
//--显示段结束
tf=lsExecStr(CurEng,&t,cstr_Buff);
if(tf==TRUE)
{
strcpy(temp,"目标正确");
}
else
{
if(tf==FALSE)
{
strcpy(temp,"目标错误");
}
else
{
strcpy(temp,"与逻辑服务器连接错误");
}
}
//--显示段开始
m_R_P_Edit.GetWindowText(cstr_Buff_R_S,MAX*LINES);
if ( strlen(cstr_Buff_R_S)!=0 )
{
strcat(cstr_Buff_R_S,"\r\n");
}
strcat(cstr_Buff_R_S,temp);
m_R_P_Edit.SetSel(0,-1);
m_R_P_Edit.ReplaceSel(cstr_Buff_R_S);
//--显示段结束
}
else
//带变量的目标,要返回变量的值
{
itoa(Num_V,Num_temp,10);
strcpy(temp,"目标中有");
strcat(temp,Num_temp);
strcat(temp,"个待例化的变量!");
//--显示段开始
m_R_P_Edit.GetWindowText(cstr_Buff_R_S,MAX*LINES);
if ( strlen(cstr_Buff_R_S)!=0 )
{
strcat(cstr_Buff_R_S,"\r\n");
}
strcat(cstr_Buff_R_S,temp);
m_R_P_Edit.SetSel(0,-1);
m_R_P_Edit.ReplaceSel(cstr_Buff_R_S);
//--显示段结束
tf=lsCallStr(CurEng,&t,cstr_Buff);
int R_N=0;
while(tf)
{
R_N++;
itoa(R_N,Num_temp,10);
strcpy(temp,"第");
strcat(temp,Num_temp);
strcat(temp,"组解为:\n");
//--显示段开始
m_R_P_Edit.GetWindowText(cstr_Buff_R_S,MAX*LINES);
if ( strlen(cstr_Buff_R_S)!=0 )
{
strcat(cstr_Buff_R_S,"\r\n");
}
strcat(cstr_Buff_R_S,temp);
m_R_P_Edit.SetSel(0,-1);
m_R_P_Edit.ReplaceSel(cstr_Buff_R_S);
//--显示段结束
for(i=1;i<=Num_V;i++)
{
lsGetArg(CurEng,t, i, cSTR,cstr_Buff);
//--显示段开始
m_R_P_Edit.GetWindowText(cstr_Buff_R_S,MAX*LINES);
if ( strlen(cstr_Buff_R_S)!=0 )
{
strcat(cstr_Buff_R_S,"\r\n");
}
strcat(cstr_Buff_R_S,cstr_Buff);
m_R_P_Edit.SetSel(0,-1);
m_R_P_Edit.ReplaceSel(cstr_Buff_R_S);
//--显示段结束
}
tf=lsRedo(CurEng);
}
//////////////////////////////////////////////////////////////////
//为无解的情况作出提示
if(R_N==0)
{
//--显示段开始
m_R_P_Edit.GetWindowText(cstr_Buff_R_S,MAX*LINES);
if ( strlen(cstr_Buff_R_S)!=0 )
{
strcat(cstr_Buff_R_S,"\r\n");
}
strcat(cstr_Buff_R_S,"但该变量无解!");
m_R_P_Edit.SetSel(0,-1);
m_R_P_Edit.ReplaceSel(cstr_Buff_R_S);
//--显示段结束
}
}
/////////////////////////////////////////////////////////////////////////////
// 结论部分输出完毕,现在读出记号
//
// 原有的Flag_P中为 谓词名+(+f 故先要进行处理
delete_one(Flag_P,'f');
add_one(Flag_P,'X');
add_one(Flag_P,')');
add_one(Flag_P,'.');
// AfxMessageBox(Flag_P);
int tt;
int f_l[LINES];
for(tt=0;tt<LINES;tt++)
{
f_l[tt]=0;
}
tf=lsCallStr(CurEng,&t,Flag_P);
tt=0;
while(tf)
{
lsGetArg(CurEng,t, 1, cSTR,cstr_Buff);
//AfxMessageBox(cstr_Buff);
cut_first(cstr_Buff);
f_l[atoi(cstr_Buff)]=1;
tf=lsRedo(CurEng);
}
lsClose(CurEng); //关闭逻辑服务器
//
/////////////////////////////////////////////////////////////////////////////
// 根据读出的记号 输出搜索路径
//
char buff_flag[MAX];
//
//--显示段开始 //显示 "做出该结论所用到的规则有:"
m_S_P_Edit.GetWindowText(cstr_Buff_R_S,MAX*LINES);
if ( strlen(cstr_Buff_R_S)!=0 )
{
strcat(cstr_Buff_R_S,"\r\n");
}
strcpy(buff_flag,"做出该结论所用到的规则有:");
strcat(cstr_Buff_R_S,buff_flag);
m_S_P_Edit.SetSel(0,-1);
m_S_P_Edit.ReplaceSel(cstr_Buff_R_S);
//--显示段结束
nLineCount = m_RF_P_Edit.GetLineCount();
for (i=0;i < nLineCount;i++)
{
if(f_l[i]==1)
{
j=0;
m_RF_P_Edit.GetLine(i,cstr_Buff,MAX);
for(j=0;j<m_RF_P_Edit.LineLength(m_RF_P_Edit.LineIndex(i));j++)
{
m_myBuffer[j]=cstr_Buff[j];
}
m_myBuffer[j]='\0';
//AfxMessageBox(m_myBuffer);
//
//--显示段开始 //显示 m_myBuffer
m_S_P_Edit.GetWindowText(cstr_Buff_R_S,MAX*LINES);
if ( strlen(cstr_Buff_R_S)!=0 )
{
strcat(cstr_Buff_R_S,"\r\n");
}
strcpy(buff_flag,m_myBuffer);
strcat(cstr_Buff_R_S,buff_flag);
m_S_P_Edit.SetSel(0,-1);
m_S_P_Edit.ReplaceSel(cstr_Buff_R_S);
//--显示段结束
}
}
}
void CBBBDlg::OnButtonRfPCls()
{
// TODO: Add your control notification handler code here
m_RF_P_Edit.SetSel(0,-1);
m_RF_P_Edit.ReplaceSel("");
}
void CBBBDlg::OnButtonInRf()
{
//导入规则
//
//确认原先的规则内容为空
////////////////////////
//
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;
}
//
//////////////////////////////////////////////////////////
//
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_RF_P,MAX*LINES);
//
char *m_myBuffer;
m_myBuffer = new char[strlen(cstr_Test_RF_P)+1];
int i;
for(i=0;i<f.GetLength();i++)
{
m_myBuffer[i]=cstr_Test_RF_P[i];
}
m_myBuffer[i]='\0';
//
m_RF_P_Edit.SetSel(0,-1);
m_RF_P_Edit.ReplaceSel(m_myBuffer);
f.Close();
}
else
{
AfxMessageBox("Prolog规则文件打开失败!");
}
}
void CBBBDlg::OnButtonOutRf()
{
//导出规则
//
//确认导出的规则内容不能为空
////////////////////////
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;
}
/////////////////////////////////
//
//用对话框传入文件名
////////////////////////////////
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_RF_P_Edit.GetWindowText(cstr_Test_RF_P,MAX*LINES);
f.Write(cstr_Test_RF_P,strlen(cstr_Test_RF_P));
f.Close();
}
}
/////////////////////////////////////////////////////////////////////////
void CBBBDlg::OnButtonInG()
{
// TODO: Add your control notification handler code here
//
//确认原先的内容为空
////////////////////////
//
char cstr_Test_G_P[MAX*LINES];
m_G_P_Edit.GetWindowText(cstr_Test_G_P,MAX*LINES);
if(strlen(cstr_Test_G_P)!=0 )
{
AfxMessageBox("在导入目标之前,请先清空已有的!如果需要保存它们,请先导出到文件!");
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_G_P,MAX*LINES);
//
char *m_myBuffer;
m_myBuffer = new char[strlen(cstr_Test_G_P)+1];
int i;
for(i=0;i<f.GetLength();i++)
{
m_myBuffer[i]=cstr_Test_G_P[i];
}
m_myBuffer[i]='\0';
//
m_G_P_Edit.SetSel(0,-1);
m_G_P_Edit.ReplaceSel(m_myBuffer);
f.Close();
}
else
{
AfxMessageBox("文件打开失败!");
}
}
/////////////////////////////////////////////////////////////////////////
void CBBBDlg::OnButtonOutG()
{
// TODO: Add your control notification handler code here
//
//确认导出的内容不能为空
////////////////////////
char cstr_Test_G_P[MAX*LINES];
m_G_P_Edit.GetWindowText(cstr_Test_G_P,MAX*LINES);
if(strlen(cstr_Test_G_P)==0 )
{
AfxMessageBox("你要导出的规则与事实为空,请确认!");
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_G_P_Edit.GetWindowText(cstr_Test_G_P,MAX*LINES);
f.Write(cstr_Test_G_P,strlen(cstr_Test_G_P));
f.Close();
}
}
void CBBBDlg::OnButtonGPCls()
{
// TODO: Add your control notification handler code here
m_G_P_Edit.SetSel(0,-1);
m_G_P_Edit.ReplaceSel("");
}
void CBBBDlg::OnButtonTestGoalSyn()
{
// TODO: Add your control notification handler code here
//
//清空状态栏中的过时信息
////////////////////////
//
m_S_P_Edit.SetSel(0,-1);
m_S_P_Edit.ReplaceSel("");
//
//相关的全局变量的初始化
////////////////////////
//
Num_V=0;
Syn_Key=true;
strcpy(m_error_temp,"");
//------------------------------------
//确认目标的内容不为空
////////////////////////
//
char cstr_Test_G_P[MAX*LINES];
m_G_P_Edit.GetWindowText(cstr_Test_G_P,MAX*LINES);
if(strlen(cstr_Test_G_P)==0 )
{
AfxMessageBox("要想检测目标的语法,请先添加目标!");
return;
}
//
//////////////////////////////////////////////////////////////////////
//
//词法分析部分:
//////////////////////////////////////////////////////////////////////
CString tempName ="Test_G_Syn_In.dat";
CFile f;
if (f.Open(tempName,CFile::modeWrite | CFile::modeCreate))
{
char endline[2]={13,10};
CString blank;
m_G_P_Edit.GetWindowText(cstr_Test_G_P,MAX*LINES);
f.Write(cstr_Test_G_P,strlen(cstr_Test_G_P));
f.Close();
}
//
///////
//
FILE *f1,*f2;
if((f1=fopen("Test_G_Syn_In.dat","r"))==NULL)
{
AfxMessageBox("不能打开输入文件!Test_G_Syn_In.dat");
return;
}
if((f2=fopen("Test_G_Syn_Out.dat","w"))==NULL)
{
AfxMessageBox("不能打开输出文件!Test_G_Syn_Out.dat");
return;
}
ofstream onfile;
onfile.open("Test_G_Syn_Out.dat");
Syn_Lines=0;
while(fgets(buff,BY_MAX_BUFF_LENTH,f1)!=NULL)
{
I=0;
while(I<=strlen(buff)-1)
{
Get_A_Word(onfile);
}
}
fclose(f1);
fclose(f2);
onfile.close();
// AfxMessageBox("词法分析部分结束");
//////////////////////////////////////////////////////////////////////
//
//语法分析部分:
//////////////////////////////////////////////////////////////////////
//
//语法分析器中的输入文件流
ifstream infile("Test_G_Syn_Out.dat",ios::in|ios::nocreate);
if (!infile)
{
AfxMessageBox("不能打开输入文件!Test_G_Syn_Out.dat");
return;
}
int kk;
Code_I=0;
for(kk=1;kk<=Syn_Lines;kk++)
{
infile>>Code_F[Code_I];
infile>>buff;
Code_I++;
}
infile.close();
//
////////
//
Code_I=0;
quest();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -