📄 ll1_parsingdlg.cpp
字号:
m_pro.DeleteAllItems();
while(m_pro.DeleteColumn(0));
GetDlgItem(IDC_EDIT6)->EnableWindow(0);
lx=-1;
ly=-2;
s_c=0;
if(m_G!="")
{
memcpy(exp,m_G,m_G.GetLength());
gram.initial();
gram.save_grammar(exp);
if(gram.tag[1]==1)
m_tag="文法格式不合法!\r\n";
else if(gram.tag[2]==1)
m_tag="文法右部中含有字符'#'!\r\n";
else if(gram.tag[3]==1)
m_tag="右部含有错误非终结符!\r\n";
else if(gram.tag[5]==1)
m_tag="有select集为空的规则!\r\n";
else
{
dlgc.m_change=gram.change();
GetDlgItem(IDC_BUTTON9)->EnableWindow(1);
for(k=0;k<gram.fw;k++)
{
sign=0;
for(i=0;i<gram.n;i++)
{
if(gram.G[i][0].letter==gram.follow[k][0])
{
if(sign==0)
{
sign=1;
m_grammar+=gram.follow[k][0];
m_grammar+="->";
}
for(j=1;j<=gram.G[i][0].tag;j++)
m_grammar+=gram.G[i][j].letter;
m_grammar+='|';
}
}
m_grammar=m_grammar.Left(m_grammar.GetLength()-1);
m_grammar+="\r\n";
}
((CEdit*)GetDlgItem(IDC_EDIT5))->SetReadOnly(1);
GetDlgItem(IDC_BUTTON8)->EnableWindow(0);
GetDlgItem(IDC_BUTTON5)->EnableWindow(0);
}
UpdateData(0);
}
}
void Cll1_parsingDlg::OnButton7()
{
CString exp,tt;
int i=0,j=0,sign=0,pos=0;
int x=-1,y=-1,li;
CSize s(0,30);
CSize si;
UpdateData(1);
if(s_c==0)
{
s_top1=0;
s_top2=0;
s_c=0;
s_error=0;
for(i=0;i<L_STR;i++)
s_t[i]=0;
for(i=0;i<LEN;i++)
{
s_exp1[i]=0;
s_exp2[i]=0;
}
if(m_exp!="")
{
strcpy(s_t,m_exp);
for(j=1,i=m_exp.GetLength()-1;i>=0;i--,j++)
s_exp1[j]=s_t[i];
s_exp1[0]='#';
s_top1=j-1;
s_exp2[0]='#';
s_exp2[1]=gram.begin_ch;
s_top2=1;
m_pro.DeleteAllItems();
while(m_pro.DeleteColumn(0));
m_pro.InsertColumn(1,"步骤",LVCFMT_CENTER,40,-1);
m_pro.InsertColumn(2,"分析栈",LVCFMT_LEFT,145,-1);
m_pro.InsertColumn(3,"剩余输入串",LVCFMT_RIGHT,145,-1);
m_pro.InsertColumn(4,"推导所用产生式或匹配",LVCFMT_CENTER,140,-1);
}
}
if(s_top1>=0 || s_top2>=0)
{
tt=m_list.GetItemText(lx,ly+1);
if(tt!="")
{
tt=tt.Right(tt.GetLength()-1);
m_list.SetItemText(lx,ly+1,tt);
lx=-1;
ly=-2;
}
s_c++;
tt.Format("%d",s_c);
pos=m_pro.InsertItem(m_pro.GetItemCount(),tt);
tt="";
for(i=0;i<=s_top2;i++)
tt+=s_exp2[i];
m_pro.SetItemText(pos,1,tt);
tt="";
for(i=s_top1;i>=0;i--)
tt+=s_exp1[i];
m_pro.SetItemText(pos,2,tt);
tt="";
if(s_top1<0 ||s_top2<0)
{
exp="匹配出错";
s_error=1;
}
else if(gram.vt[s_exp2[s_top2]]!=0)
{
if(s_exp2[s_top2]==s_exp1[s_top1])
{
exp="\'";
exp+=s_exp2[s_top2];
exp+="\'";
exp+="匹配";
s_top1--;
s_top2--;
if(s_top1<0&&s_top2<0)
{
exp="接受";
GetDlgItem(IDC_BUTTON7)->EnableWindow(0);
}
}
else
{
exp="匹配出错";
s_error=1;
}
}
else
{
si.cx=-10000;
si.cy=-10000;
m_list.Scroll(si);
for(li=0;li<256;li++)
{
if(gram.vn[li]==2)x++;
if(li==s_exp2[s_top2])
break;
}
for(li=0;li<256;li++)
{
if(gram.vt[li]==2)y++;
if(li==s_exp1[s_top1])
break;
}
tt.Format("%c",7);
tt+=m_list.GetItemText(x,y+1);
m_list.SetItemText(x,y+1,tt);
lx=x;
ly=y;
si.cx=(ly-3)*55;
si.cy=(lx-3)*30;
m_list.Scroll(si);
sign=0;
for(i=0;i<gram.n;i++)
{
if(gram.select[i][0]==s_exp2[s_top2])
for(j=1;j<=gram.count_select[i];j++)
if(gram.select[i][j]==s_exp1[s_top1])
{
sign=1;
break;
}
if(sign==1)break;
}
if(sign==1)
{
//================================================
s_top2--;
for(j=gram.G[i][0].tag;j>=1;j--)
{
if(gram.G[i][j].letter!='@')
s_exp2[++s_top2]=gram.G[i][j].letter;
}
exp=gram.G[i][0].letter;
exp+="->";
for(j=1;j<=gram.G[i][0].tag;j++)
exp+=gram.G[i][j].letter;
}
else
{
exp="匹配出错";
s_error=1;
}
}
m_pro.SetItemText(pos,3,exp);
if(s_error==1)
{
GetDlgItem(IDC_BUTTON7)->EnableWindow(0);
}
}
if(s_c>=15)
m_pro.Scroll(s);
UpdateData(0);
}
void Cll1_parsingDlg::OnChangeEdit6()
{
CString tt=m_list.GetItemText(lx,ly+1);
if(tt!="")
{
tt=tt.Right(tt.GetLength()-1);
m_list.SetItemText(lx,ly+1,tt);
lx=-1;
ly=-2;
}
s_c=0;
GetDlgItem(IDC_BUTTON7)->EnableWindow(1);
m_pro.DeleteAllItems();
while(m_pro.DeleteColumn(0));
}
void Cll1_parsingDlg::OnChangeEdit1()
{
gram.initial();
UpdateData(1);
GetDlgItem(IDC_BUTTON5)->EnableWindow(0);
dlg.m_first="";
dlg.m_follow="";
dlg.m_select="";
dlgc.m_change="";
m_exp="";
m_process="";
m_grammar="";
m_tag="";
m_list.DeleteAllItems();
while(m_list.DeleteColumn(0));
m_pro.DeleteAllItems();
while(m_pro.DeleteColumn(0));
// ((CEdit*)GetDlgItem(IDC_EDIT5))->SetReadOnly(1);
GetDlgItem(IDC_EDIT6)->EnableWindow(0);
GetDlgItem(IDC_BUTTON3)->EnableWindow(0);
GetDlgItem(IDC_BUTTON7)->EnableWindow(0);
GetDlgItem(IDC_BUTTON8)->EnableWindow(0);
GetDlgItem(IDC_BUTTON9)->EnableWindow(0);
UpdateData(0);
}
void Cll1_parsingDlg::OnButton8()
{
UpdateData(1);
CString str,ss;
char exp[L_STR]={0};
int k,j,i,s,t,c,pos;
if(m_G!="")
{
memcpy(exp,m_G,m_G.GetLength());
gram.initial();
gram.save_grammar(exp);
for(i=0;i<DEN;i++)
{
ss=gram.creat_s();
if(ss==""||ss.GetLength()>100)
{
i--;
continue;
}
rexp[i]=ss;
}
}
for(i=0;i<L_STR;i++)
exp[i]=0;
if(m_grammar!="")
{
memcpy(exp,m_grammar,m_grammar.GetLength());
gram.initial();
gram.save_grammar(exp);
gram.get_first();
gram.get_follow();
gram.get_select();
dlg.m_follow="";
dlg.m_select="";
dlg.m_first="";
m_tag="";
m_list.DeleteAllItems();
while(m_list.DeleteColumn(0));
m_pro.DeleteAllItems();
while(m_pro.DeleteColumn(0));
if(gram.tag[1]==1)
m_tag="文法格式不合法!\r\n";
else if(gram.tag[2]==1)
m_tag="文法右部中含有字符'#'!\r\n";
else if(gram.tag[3]==1)
m_tag="右部含有错误非终结符!\r\n";
else if(gram.tag[5]==1)
m_tag="有select集为空的规则!\r\n";
else
{
GetDlgItem(IDC_BUTTON5)->EnableWindow(1);
for(k=0;k<gram.fw;k++)
{
dlg.m_follow+="follow(";
dlg.m_follow+=gram.follow[k][0];
dlg.m_follow+=") = { ";
for(j=1;j<=gram.count_follow[k];j++)
{
dlg.m_follow+=gram.follow[k][j];
if(j!=gram.count_follow[k])
dlg.m_follow+=',';
}
dlg.m_follow+=" }\r\n";
}
for(k=0;k<gram.n;k++)
{
dlg.m_first+="first(";
dlg.m_first+=gram.first[k][0];
dlg.m_first+="->";
for(j=1;j<=gram.G[k][0].tag;j++)
dlg.m_first+=gram.G[k][j].letter;
dlg.m_first+=") = { ";
for(j=1;j<=gram.count_first[k];j++)
{
dlg.m_first+=gram.first[k][j];
if(j!=gram.count_first[k])
dlg.m_first+=',';
}
dlg.m_first+=" }\r\n";
}
for(k=0;k<gram.n;k++)
{
dlg.m_select+="select(";
dlg.m_select+=gram.select[k][0];
dlg.m_select+="->";
for(j=1;j<=gram.G[k][0].tag;j++)
dlg.m_select+=gram.G[k][j].letter;
dlg.m_select+=") = { ";
for(j=1;j<=gram.count_select[k];j++)
{
dlg.m_select+=gram.select[k][j];
if(j!=gram.count_select[k])
dlg.m_select+=',';
}
dlg.m_select+=" }\r\n";
}
if(gram.tag[0]==1)
m_tag="文法不是LL(1)文法!\r\n";
else
{
m_tag="文法是LL(1)文法!\r\n";
m_list.InsertColumn(0,"VN",LVCFMT_CENTER,30,-1);
k=1;
for(j=0;j<256;j++)
{
if(gram.vt[j]==2)
{
m_list.InsertColumn(k,(char*)&j,LVCFMT_CENTER,55,-1);
k++;
}
}
for(j=0;j<256;j++)
{
if(gram.vn[j]==2)
{
pos=m_list.InsertItem(m_list.GetItemCount(),(char*)&j);
for(i=0;i<gram.n;i++)
{
if(gram.select[i][0]==(char)j)
{
k=0;
for(s=0;s<256;s++)
if(gram.vt[s]==2)
{
for(t=1;t<=gram.count_select[i];t++)
{
if(gram.select[i][t]==(char)s)
{
str=gram.G[i][0].letter;
str+="->";
for(c=1;c<=gram.G[i][0].tag;c++)
str+=gram.G[i][c].letter;
}
}
k++;
if(str!="")
{
m_list.SetItemText(pos,k,str);
str="";
}
}
}
}
}
}
}
}
if(gram.tag[1]==1||gram.tag[2]==1||gram.tag[3]==1)
GetDlgItem(IDC_BUTTON5)->EnableWindow(0);
//----------------------------------------------------
if(gram.tag[0]==0&&gram.tag[1]==0&&gram.tag[2]==0&&gram.tag[3]==0&&gram.tag[5]==0)
{
char t[L_STR]={0},exp1[LEN]={0},exp2[LEN]={0};
int top1=0,top2=0,c=0,error=0,sign=0;
char r[DEN]={0};
CString tt;
for(c=0;c<DEN;c++)
{
strcpy(t,rexp[c]);
for(j=1,i=rexp[c].GetLength()-1;i>=0;i--,j++)
exp1[j]=t[i];
exp1[0]='#';
top1=j-1;
exp2[0]='#';
exp2[1]=gram.begin_ch;
top2=1;
if(c==0)
{
m_pro.DeleteAllItems();
while(m_pro.DeleteColumn(0));
m_pro.InsertColumn(1,"序号",LVCFMT_CENTER,50,-1);
m_pro.InsertColumn(2,"测试字符串",LVCFMT_CENTER,330,-1);
m_pro.InsertColumn(3,"测试结果",LVCFMT_CENTER,70,-1);
}
tt.Format("%d",c+1);
pos=m_pro.InsertItem(m_pro.GetItemCount(),tt);
tt="";
m_pro.SetItemText(pos,1,rexp[c]);
error=0;
while(top1>=0 || top2>=0)
{
if(top1<0 ||top2<0)
{
error=1;
}
else if(gram.vt[exp2[top2]]!=0)
{
if(exp2[top2]==exp1[top1])
{
top1--;
top2--;
if(top1<0&&top2<0)
{
r[c]='1';
break;
}
}
else
{
error=1;
}
}
else
{
sign=0;
for(i=0;i<gram.n;i++)
{
if(gram.select[i][0]==exp2[top2])
for(j=1;j<=gram.count_select[i];j++)
if(gram.select[i][j]==exp1[top1])
{
sign=1;
break;
}
if(sign==1)break;
}
if(sign==1)
{
top2--;
for(j=gram.G[i][0].tag;j>=1;j--)
{
if(gram.G[i][j].letter!='@')
exp2[++top2]=gram.G[i][j].letter;
}
}
else
{
error=1;
}
}
if(error==1)
{
r[c]='0';
break;
}
}
if(r[c]=='1')
m_pro.SetItemText(pos,2,"接受");
else
m_pro.SetItemText(pos,2,"不接受");
}
for(c=0;c<DEN;c++)
if(r[c]!='1')
break;
if(c>=DEN)
m_tag="文法转换正确!";
else
m_tag="文法转换错误!";
}
}
GetDlgItem(IDC_EDIT6)->EnableWindow(0);
GetDlgItem(IDC_BUTTON3)->EnableWindow(0);
GetDlgItem(IDC_BUTTON7)->EnableWindow(0);
UpdateData(0);
}
void Cll1_parsingDlg::OnButton9()
{
dlgc.DoModal();
}
void Cll1_parsingDlg::OnClickList2(NMHDR* pNMHDR, LRESULT* pResult)
{
UpdateData(1);
CString exp1,exp2,tt;
char c1,c2,ct[2]={0};
int li,x,y;
CSize si;
int p=m_pro.GetSelectionMark();
exp1=m_pro.GetItemText(p,2);
exp2=m_pro.GetItemText(p,1);
memcpy(ct,exp1.Left(1),1);
c1=ct[0];
memcpy(ct,exp2.Right(1),1);
c2=ct[0];
tt=m_list.GetItemText(lx,ly+1);
if(tt!="")
{
tt=tt.Right(tt.GetLength()-1);
m_list.SetItemText(lx,ly+1,tt);
lx=-1;
ly=-2;
}
if(gram.vn[c2]==2&&gram.vt[c1]==2)
{
si.cx=-10000;
si.cy=-10000;
m_list.Scroll(si);
x=-1;
y=-1;
for(li=0;li<256;li++)
{
if(gram.vn[li]==2)x++;
if(li==c2)
break;
}
for(li=0;li<256;li++)
{
if(gram.vt[li]==2)y++;
if(li==c1)
break;
}
tt.Format("%c",7);
tt+=m_list.GetItemText(x,y+1);
m_list.SetItemText(x,y+1,tt);
lx=x;
ly=y;
si.cx=(ly-3)*55;
si.cy=(lx-3)*30;
m_list.Scroll(si);
}
*pResult = 0;
UpdateData(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -