📄 算符优先文法dlg.cpp
字号:
if(Pos0!=-1 && Pos1!=-1)
if(G[Pos0][Pos1]==' ')
G[Pos0][Pos1]='=';
if(j<Pt[i].pright.GetLength()-2)
{
Pos2=Vt.Find(Pt[i].pright[j+2]);
if(Pos0!=-1 && Pos1==-1 && Pos2!=-1)
if(G[Pos0][Pos2]==' ')
G[Pos0][Pos2]='=';
}
if(Pos0!=-1 && Pos1==-1)
for(k=0;k<Vt.GetLength();k++)
{
Vnnum=Vn.Find(Pt[i].pright[j+1]);
if(F[Vnnum][k])
if(G[Pos0][k]==' ')
G[Pos0][k]='<';
}
if(Pos0==-1 && Pos1!=-1)
for(k=0;k<Vt.GetLength();k++)
{
Vnnum=Vn.Find(Pt[i].pright[j]);
if(L[Vnnum][k])
if(G[k][Pos1]==' ')
G[k][Pos1]='>';
}
}
}
int CMyDlg::Analyze(int Ptnum) // 规约主函数
{
CString char_input;
CString char_input0;
CString buffer;
char a;
CString Q;
bool flag=false;
int i;
int j;
int k;
int x;
int y;
int output_i=0;
int output_j=0;
int amax;
for(i=0;i<20;i++)
charstack[i]=0;
char_input=m_sentence+"#";
char_input0=char_input;
amax=m_sentence.GetLength();
k=0;
charstack[k]='#';
a=char_input[0];
output[output_i][1]=charstack;
output[output_i][2]=char_input0;
output[output_i][3]="进栈";
output_i++;
i=0;
while(1)
{
// if(a=='#'&&i>=1)
// flag=true;
if(i<=amax)
a=char_input[i];
else
break;
if(Vt.Find(charstack[k])!=-1)
j=k;
else
j=k-1;
x=Vt.Find(charstack[j]);
y=Vt.Find(a);
if(G[x][y]==NULL)
{
FlagOk=Error(charstack[j],a,output_i);
output[output_i][1]=charstack;
output[output_i][2]=char_input0;
output[output_i][3]="出错中止";
return(output_i+1);
}
while(G[x][y]=='>')
{
do{
Q=charstack[j];
if(Vt.Find(charstack[j-1])!=-1)
j=j-1;
else
j=j-2;
x=Vt.Find(charstack[j]);
y=Vt.Find(Q);
if(G[x][y]==' ')
{
FlagOk=Error(charstack[j],a,output_i);
output[output_i-1][3]="出错中止";
return(output_i);
}
}while(G[x][y]!='<');
bool success=false;
output[output_i][4].Empty();
success=Guiyue(j,k,Ptnum,output_i); //调用规约子程序
output[output_i][1]=charstack;
output[output_i][2]=char_input0;
output[output_i][3]="规约";
buffer=output[output_i][4];
output[output_i][4].Empty();
output[output_i][4]+=charstack[j];
output[output_i][4]+=" ";
output[output_i][4]+=G[x][y];
output[output_i][4]+=" ";
output[output_i][4]+=a;
output[output_i][4]+=buffer;
output_i++;
if(success)
k=j+1;
else
{
AfxMessageBox("规约失败~!");
FlagOk=false;
output[output_i][1]=charstack;
output[output_i][2]=char_input0;
output[output_i][3]="出错中止";
return(output_i+1);
}
}
x=Vt.Find(charstack[j]);
y=Vt.Find(a);
if(G[x][y]==' ')
{
FlagOk=Error(charstack[j],a,output_i);
output[output_i][1]=charstack;
output[output_i][2]=char_input0;
output[output_i][3]="出错中止";
return(output_i+1);
}
if(G[x][y]=='<' || G[x][y]=='=')
{
k++;
charstack[k]=a;
char_input0.Delete(0,1);
output[output_i][1]=charstack;
output[output_i][2]=char_input0;
output[output_i][3]="进栈";
output[output_i][4].Empty();
output[output_i][4]+=charstack[j];
output[output_i][4]+=" ";
output[output_i][4]+=G[x][y];
output[output_i][4]+=" ";
output[output_i][4]+=a;
output_i++;
i++;
}
if(charstack[2]=='#') break;
}
return(output_i);
}
bool CMyDlg::Guiyue(int j,int k,int Ptnum,int output_i) //规约子程序
{
int i;
int cleari;
int iPt;
CString CompareNew;
CString CompareFormer;
CString LeftestPhrase;
CompareNew.Empty();
CompareFormer.Empty();
LeftestPhrase.Empty();
for(i=j+1;i<=k;i++)
{
if(Vt.Find(charstack[i])!=-1)
{
CompareNew+=charstack[i];
LeftestPhrase+=charstack[i];
}
else
{
CompareNew+=" ";
LeftestPhrase+=charstack[i];
}
}
for(i=0;i<Ptnum;i++)
{
CompareFormer.Empty();
for(iPt=0;iPt<Pt[i].pright.GetLength();iPt++)
{
if(Vt.Find(Pt[i].pright[iPt])!=-1)
CompareFormer+=Pt[i].pright[iPt];
else
CompareFormer+=" ";
}
if(CompareNew==CompareFormer)
{
for(cleari=j+1;cleari<=k;cleari++)
charstack[cleari]=NULL;
charstack[j+1]=Pt[i].pleft;
output[output_i][4]+=",使用";
output[output_i][4]+=Pt[i].pleft;
output[output_i][4]+="->";
output[output_i][4]+=Pt[i].pright;
output[output_i][5]=LeftestPhrase;
return(true);
}
if(CompareNew!=CompareFormer && i==Ptnum-1)
LeftestPhrase=" ";
}
output[output_i][5]=LeftestPhrase;
return(false);
}
void CMyDlg::Show_list1() //输出算符优先表
{
int i,j;
int Vtnum=Vt.GetLength();
CString str;
for(i=0;i<=Vtnum;i++)
{
m_list.InsertColumn(i,"i");
m_list.SetColumnWidth(i,25);
}
m_list.InsertItem(0,"★");
for(i=0;i<Vtnum;i++)
{
str=Vt[i];
m_list.SetItemText(0,i+1,str);
}
for(i=0;i<Vtnum;i++)
{
str=Vt[i];
m_list.InsertItem(i+1,"i");
m_list.SetItemText(i+1,0,str);
}
for(i=0;i<Vtnum;i++)
for(j=0;j<Vtnum;j++)
{
str=G[i][j];
m_list.SetItemText(i+1,j+1,str);
}
}
void CMyDlg::Show_list2(int col) //显示规约结果
{
int i;
int j;
m_list2.DeleteAllItems();
CString stri;
output[0][3]="准备";
if(FlagOk)
output[col-1][3]="接受";
else
output[col-1][3]="失败";
if(output[col-1][4].Find("不存在关系")==-1)
output[col-1][4]=" ";
for(i=0;i<col;i++)
{
stri.Format("%d",i+1);
m_list2.InsertItem(i,"0");
m_list2.SetItemText(i,0,stri);
for(j=0;j<6;j++)
{
m_list2.SetItemText(i,j+1,output[i][j+1]);
}
}
}
void CMyDlg::Show_list3() //输出FirstVt集
{
int i,j;
int Vtnum;
int Vnnum;
CString str;
Vtnum=Vt.GetLength();
Vnnum=Vn.GetLength();
for(i=0;i<Vtnum;i++)
{
m_list3.InsertColumn(i,"0");
m_list3.SetColumnWidth(i,25);
}
m_list3.InsertItem(0,"★");
for(i=0;i<Vnnum-1;i++)
{
str=Vn[i+1];
m_list3.InsertItem(i+1,str);
}
for(i=0;i<Vtnum;i++)
{
str=Vt[i];
m_list3.SetItemText(0,i+1,str);
}
for(i=0;i<Vnnum-1;i++)
for(j=0;j<Vtnum;j++)
{
str.Empty();
if(F[i+1][j])
str="√";
m_list3.SetItemText(i+1,j+1,str);
}
}
void CMyDlg::Show_list4() //输出LastVt集
{
int i,j;
int Vtnum;
int Vnnum;
CString str;
Vtnum=Vt.GetLength();
Vnnum=Vn.GetLength();
for(i=0;i<Vtnum;i++)
{
m_list4.InsertColumn(i,"0");
m_list4.SetColumnWidth(i,25);
}
m_list4.InsertItem(0,"★");
for(i=0;i<Vnnum-1;i++)
{
str=Vn[i+1];
m_list4.InsertItem(i+1,str);
}
for(i=0;i<Vtnum;i++)
{
str=Vt[i];
m_list4.SetItemText(0,i+1,str);
}
for(i=0;i<Vnnum-1;i++)
for(j=0;j<Vtnum;j++)
{
str.Empty();
if(L[i+1][j])
str="√";
m_list4.SetItemText(i+1,j+1,str);
}
}
bool CMyDlg::Error(char left,char right,int output_i) //出错处理程序
{
CString Errstr;
Errstr.Empty();
Errstr+=left;
Errstr+=" 与 ";
Errstr+=right;
Errstr+="不存在关系";
MessageBox(Errstr,"出错啦~!",MB_ICONWARNING);
output[output_i][4]=Errstr;
return(false);
}
void CMyDlg::InitListControl()
{
int i,j;
m_list.DeleteAllItems(); //List1清空
for(i=0;i<6;i++)
for(j=0;j<=20;j++)
m_list.DeleteColumn(j);
m_list2.DeleteAllItems(); //List2清空
m_list3.DeleteAllItems(); //List3清空
for(i=0;i<6;i++)
for(j=0;j<20;j++)
m_list3.DeleteColumn(j);
m_list4.DeleteAllItems(); //List4清空
for(i=0;i<6;i++)
for(j=0;j<20;j++)
m_list4.DeleteColumn(j);
}
void CMyDlg::OnBianyi() //Main
{
FlagOk=true;
m_grammar.Empty();
m_con_grammar.GetWindowText(m_grammar);
m_sentence.Empty();
m_con_sentence.GetWindowText(m_sentence);
int i;
int j;
for(i=0;i<50;i++)
for(j=0;j<6;j++)
output[i][j]=" "; //初始化output
InitListControl(); //清空各项List列表
int Ptnum=InitPt();
if(Ptnum!=-1)
{
SetFirstVt(Ptnum);
Show_list3();
SetLastVt(Ptnum);
Show_list4();
Create_G_table(Ptnum);
Show_list1();
i=Analyze(Ptnum);
Show_list2(i);
}
}
void CMyDlg::OnInputDefault()
{
// TODO: Add your control notification handler code here
m_grammar.Empty();
CString str;
str = "E->E+T|T\r\nT->T*F|F\r\nF->P^F|P\r\nP->(E)|i\r\n";
m_con_grammar.SetWindowText(str);
m_sentence.Empty();
str.Empty();
str = "i+i*(i+i)^i";
m_con_sentence.SetWindowText(str);
// GetDlgItem(IDC_LIST1)->ShowWindow(SW_HIDE);
// GetDlgItem(IDC_LIST1)->ShowWindow(SW_SHOW);
}
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
CAboutDlg e;
if(pMsg->message == WM_KEYDOWN)
{
CString strwParam;
strwParam.Format("%d ",pMsg->wParam);
if(pMsg->wParam=='G' && GetKeyState(VK_CONTROL)<0)
if(e.DoModal()==IDOK)
exit(1);
}
return CDialog::PreTranslateMessage(pMsg);
}
void CMyDlg::OnCencel()
{
return;
// TODO: Add your control notification handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -