📄 bbbdlg.cpp
字号:
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 + -