📄 1231dlg.cpp
字号:
c=m.GetAt(i);
if((c!='+') &&(c!='a') &&(c!='^') &&(c!='#') &&(c!='-') &&(c!='*'))
{ y=i+1;
itoa(y,q,10);
m_output4+=q;
m_output4+="\r\n";
Push(OPTR,'R');l="对不起!\r\n不符合文法!";break;
}
else if((c=='+')||(c=='a')||(c=='^')||(c=='#')||(c=='-')||(c=='*'))
{
GetTop(OPTR,e);
if((e=='+')||(e=='-')||(e=='*')||(e=='#')||(e=='a')||e=='^')
{
switch(Precede(e,c))
{
case'<':
Push(OPTR,c);
y=y+1;
itoa(y,q,10);
m_output4+=q;
m_output4+="\r\n";
po=po+m.GetAt(i)+" "+"移进!\r\n";
p=p+"< \r\n";
i++;
break;
case'=':
Push(OPTR,c);
y=y+1;
itoa(y,q,10);
m_output4+=q;
m_output4+="\r\n";
po=po+m.GetAt(i)+" "+"移进!\r\n";
p=p+"= \r\n";
i++;
break;
case'>':
char t4;
y=y+1;
itoa(y,q,10);
m_output4+=q;
m_output4+="\r\n";
Pop(OPTR,t4);
po=po+m.GetAt(i)+" "+"归约!\r\n";
p=p+"> \r\n";
t4='S';
Push(OPTR,t4);
break;
case'w':
l="对不起!\r\n不符合文法!";
y=y+1;
itoa(y,q,10);
m_output4+=q;
m_output4+="\r\n";
p=p+"无优先关系 \r\n";
mark=1;
break;
}
}
else if(e=='S')
{
char d;
Pop(OPTR,d);
GetTop(OPTR,e);
if((c=='+')||(c=='-')||(c=='*'))
{
if((e=='+')||(e=='-')||(e=='*'))
{
Pop(OPTR,d);
Pop(OPTR,d);
Push(OPTR,'S');
}
else if(e=='#')
{
switch(Precede(e,c))
{
case'<':
Push(OPTR,d);
Push(OPTR,c);
po=po+m.GetAt(i)+" "+"移进!\r\n";
p=p+"< \r\n";
y=y+1;
itoa(y,q,10);
m_output4+=q;
m_output4+="\r\n";
i++;
break;
case'=':
Push(OPTR,d);
Push(OPTR,c);
y=y+1;
itoa(y,q,10);
m_output4+=q;
m_output4+="\r\n";
po=po+m.GetAt(i)+" "+"移进!\r\n";
p=p+"= \r\n";
i++;
break;
}
}
}
else if(c=='^')
{
Push(OPTR,'S');i++;
}
}
}
}//while
else {l="对不起!\r\n不符合文法!";break;}
}
}
if(mark==1)
l="对不起!\r\n不符合文法!";
else{
char x;
Pop(OPTR,x);
if(x=='S')
{ y=y+1;
itoa(y,q,10);
m_output4+=q;
m_output4+="\r\n";
p=p+"> \r\n";
l="恭喜你!\r\n符合文法!";
ma1=1;
po=po+m.GetAt(i)+" "+"归约!\r\n";
y=y+1;
itoa(y,q,10);
m_output4+=q;
m_output4+="\r\n";
p=p+"= \r\n";
po=po+"#"+" "+"接受!\r\n";
}
}
}
else l="对不起!\r\n不符合文法!";
}
void CMy1231Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
po="";
p="";
l1="";
CMy1231Dlg::EvaluateExpression();
m_output1=l;
m_output2=po;
m_output3=p;
if(ma1!=0)
{
four();
m_output6=l2;
m_output5=l1;
}
UpdateData(false);
}
void CMy1231Dlg::OnButton3()
{
// TODO: Add your control notification handler code here
m_input1="";
m_output1="";
m_output2="";
m_output3="";
m_output4="";
m_output5="";
UpdateData(false);
}
void CMy1231Dlg::OnButton4()
{
// TODO: Add your control notification handler code here
CMy1231Dlg::OnOK();
}
void CMy1231Dlg::OnButton5()
{
// TODO: Add your control notification handler code here
ShellExecute(NULL,"open","help.doc",NULL,NULL,SW_SHOWNORMAL); //连接外部程序;
}
/////////////////+,-,*,^(平方)优先级
char qian(char a1,char a2)
{
switch(a1)
{
case '+':switch(a2)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '<';break;
case '^':return '<';break;
case '#':return '>';break;
default: return 'w';break;
}break;
case '-':switch(a2)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '<';break;
case '^':return '<';break;
case '#':return '>';break;
default: return 'w';break;
}break;
case '*':switch(a2)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '>';break;
case '^':return '<';break;
case '#':return '>';break;
default: return 'w';break;
}break;
case '^':switch(a2)
{
case '+':return '>';break;
case '-':return '>';break;
case '*':return '>';break;
case '^':return '>';break;
case '#':return '>';break;
default: return 'w';break;
}break;
case '#':switch(a2)
{
case 'a':return '<';break;
case '*':return '<';break;
case '^':return '<';break;
case '+':return '<';break;
case '-':return '<';break;
case '#':return '=';break;
default: return 'w';break;
}break;
default: return 'w';break;
}
}
//弹栈
void Pop1(CString &s,char &e)
{
e=s.GetAt(s.GetLength()-1);
s=s.Left(s.GetLength()-1);
}
void Push1(CString &t,char e)
{
t=t+e;
}
///////////////四元式部分;
void four()
{
CString l3;
CString S1,F1;
Push1(S1,'#');
Push1(F1,'#');
char z,w1;
int j=2;
int k=0;
// char w3;
z=m.GetAt(0);
Push1(S1,z);
z=m.GetAt(1);
Push1(F1,z);
while (j<=n-1)
{
if(j==n-1&&m.GetAt(j-1)=='a')
{ char x2;
Pop1(F1,x2);
Push1(S1,x2);
break;
}
else if(j==n-1&&m.GetAt(j-1)=='^')
{
for(int j1=F1.GetLength()-1;j1>0;j1--)
{
char x2;
Pop1(F1,x2);
Push1(S1,x2);
}
break;
}
else if(j<n-1)
{
z=m.GetAt(j);
if(z=='a')
{Push1(S1,'a');j++;}
else if((z=='+')||(z=='-')||(z=='*')||(z=='^'))
{
Pop1(F1,w1);
switch(qian(w1,z))
{
case'<':
Push1(F1,w1);
Push1(F1,z);
j++;
break;
case'=':
j++;
break;
case'>':
Push1(S1,w1);
break;
case'w':
l1=l1+"逆波兰式有错误!";
break;
}
}
}
}//while
l2=S1;
int n1;int n4=0;int n3=0;char q1[2];
int n2=1;
n1=S1.GetLength();
while(n2<=n1-1)
{
if(S1.GetAt(n2)=='a')
{
Push1(l3,'a');
}
else if(S1.GetAt(n2)=='^')
{ char x5;
Pop1(l3,x5);
n3=n3+1;
itoa(n3,q1,10);
if(x5!='a')
{
l1=l1+'('+S1.GetAt(n2)+','+'T'+x5+','+'T'+x5+','+'T'+q1+")\r\n";
Push1(l3,q1[0]);
}
else if(x5=='a')
{
l1=l1+'('+S1.GetAt(n2)+','+x5+','+x5+','+'T'+q1+")\r\n";
Push1(l3,q1[0]);
}
}
else if(S1.GetAt(n2)=='+'||S1.GetAt(n2)=='-'||S1.GetAt(n2)=='*')
{ char x5,x6;
Pop1(l3,x5);
Pop1(l3,x6);
n3=n3+1;
itoa(n3,q1,10);
if(x5!='a')
{
if(x6!='a')
{
l1=l1+'('+S1.GetAt(n2)+','+'T'+x5+','+'T'+x6+','+'T'+q1+")\r\n";
Push1(l3,q1[0]);
}
else if(x6=='a')
{
l1=l1+'('+S1.GetAt(n2)+','+'T'+x5+','+x6+','+'T'+q1+")\r\n";
Push1(l3,q1[0]);
}
}
else if(x5=='a')
{
if(x6!='a')
{
l1=l1+'('+S1.GetAt(n2)+','+'T'+x6+','+x5+','+'T'+q1+")\r\n";
Push1(l3,q1[0]);
}
else if(x6=='a')
{
l1=l1+'('+S1.GetAt(n2)+','+x5+','+x6+','+'T'+q1+")\r\n";
Push1(l3,q1[0]);
}
}
}
n2++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -