⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4rdview.cpp

📁 编译原理实验
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				case 12:
				case 13:
				case 14:
					MessageBox("error!\n表达式输入有错,=+,-=,*=,/=前面只能为变量,不能为常量!");
					m_cal=false;
					return;
				}
				p->code=8;
				q.Delete(p->left);
				q.Delete(p->right);
				p->left=NULL;
				p->right=NULL;
				sl.Pop();		//弹出栈顶元素
				Invalidate();
				if(sl.IsEmpty())	//运算完毕
				{
					m_result=true;
					Invalidate();
					m_cal=false;
					MessageBox("完毕!","编译原理");
				}
				return;
			}//if
			else
				if(p->left->code==7||p->right->code==7)
				{
					if(p->left->code==7&&table[p->left->entry].evaluated==false)
					{
						CIn dlg;
						string="请输入标识符"+(CString)table[p->left->entry].name+"的值";
						if(dlg.DoModal()==IDOK)
						{
							table[p->left->entry].value=dlg.m_var;
							table[p->left->entry].evaluated=true;
						}
						m_id=true;	//显示标识符的值
						Invalidate();
					}//if
					else
						if(p->right->code==7&&table[p->right->entry].evaluated==false)
						{
							CIn dlg;
							string="请输入标识符"+(CString)table[p->right->entry].name+"的值";
							if(dlg.DoModal()==IDOK)
							{
								table[p->right->entry].value=dlg.m_var;
								table[p->right->entry].evaluated=true;
							}

							m_id=true;	//显示标识符的值
							Invalidate();
						}//if
				}//if
		}//if first2==true
		else	//按了第一下以后
		{
			p=sl.GetTop();
			if(p->left->code==8&&p->right->code==8)//左右子树都为数字立即运算
			{
				switch((int)p->code){
				case 1:
					p->value=p->left->value+p->right->value;
					break;
				case 2:
					p->value=p->left->value-p->right->value;
					break;
				case 3:
					p->value=p->left->value*p->right->value;
					break;
				case 4:
					if(p->right->value>-0.00001&&p->right->value<0.00001)
					{
						MessageBox("错误:除法时除数为0!");
						isok=false;
						m_cal=false;
						return;
					}
					p->value=p->left->value/p->right->value;
					break;
				case 9:
					if(p->right->value>-0.00001&&p->right->value<0.00001)
					{
						MessageBox("错误:整除时除数为0!");
						isok=false;
						m_cal=false;
						return;
					}
					if(p->left->value>=p->right->value)
						p->value=(int)p->left->value/(int)p->right->value;
					else
						p->value=0;
					break;
				case 10:
					if(p->right->value>-0.00001&&p->right->value<0.00001)
					{
						MessageBox("错误:求余是除数为0!");
						isok=false;
						m_cal=false;
						return;
					}
					p->value=(int)p->left->value%(int)p->right->value;
					break;
				case 11:
				case 12:
				case 13:
				case 14:
					MessageBox("error!\n表达式输入有错,=+,-=,*=,/=前面只能为变量,不能为常量!");
					m_cal=false;
					return;
				}
				p->code=8;
				q.Delete(p->left);
				q.Delete(p->right);
				p->left=NULL;
				p->right=NULL;
				sl.Pop();		//弹出栈顶元素
				Invalidate();
				if(sl.IsEmpty())
				{
					m_result=true;
					Invalidate();
					m_cal=false;
					MessageBox("完毕!","编译原理");
				}	
			}
			else
				if(p->left->code==7||p->right->code==7)		//左或右孩子有标识符
				{
					if(p->left->code==7&&table[p->left->entry].evaluated==false)//左标识符未赋值
					{
						CIn dlg;
						string="请输入标识符"+(CString)table[p->left->entry].name+"的值";
						if(dlg.DoModal()==IDOK)
						{
							table[p->left->entry].value=dlg.m_var;
							table[p->left->entry].evaluated=true;
						}
						m_id=true;
						Invalidate();
					}//if
					else
						if(p->right->code==7&&table[p->right->entry].evaluated==false)//右标识符未赋值
						{
							CIn dlg;
							string="请输入标识符"+(CString)table[p->right->entry].name+"的值";
							if(dlg.DoModal()==IDOK)
							{
								table[p->right->entry].value=dlg.m_var;
								table[p->right->entry].evaluated=true;
							}
							m_id=true;
							Invalidate();
						}//if
						else
						{
							double a,b;
							if(p->left->code==7)
								a=table[p->left->entry].value;
							else
								a=p->left->value;
							if(p->right->code==7)
								b=table[p->right->entry].value;
							else
								b=p->right->value;
							switch((int)p->code){
							case 1:
								p->value=a+b;
								p->code=8;
								break;
							case 2:
								p->value=a-b;
								p->code=8;
								break;
							case 3:
								p->value=a*b;
								p->code=8;
								break;
							case 4:
								if(b>-0.00001&&b<0.00001)
								{
									MessageBox("错误:除法是除数为0!");
									isok=false;
									m_cal=false;
									return;
								}
								p->value=a/b;
								p->code=8;
								break;
							case 9:
								if(b>-0.00001&&b<0.00001)
								{
									MessageBox("错误:整除时除数为0!","编译原理");
									isok=false;
									m_cal=false;
									return;
								}
								if(a>=b)
									p->value=(int)a/(int)b;
								else
									p->value=0;
								p->code=8;
								break;
							case 10:
								if(b>-0.00001&&b<0.00001)
								{
									MessageBox("错误:求余时除数为0!","编译原理");
									isok=false;
									m_cal=false;
									return;
								}
								p->value=(int)a%(int)b;
								p->code=8;
								break;
							case 11:
								if(p->left->code!=7)
								{
									MessageBox("error!\n表达式输入有错,=+前面只能为变量,不能为常量!","编译原理");
									m_cal=false;
									return;
								}
								p->value=a+b;
								table[p->left->entry].value=p->value;
								p->code=7;
								p->entry=p->left->entry;
								table[p->entry].evaluated=true;
								break;
							case 12:
								if(p->left->code!=7)
								{
									MessageBox("error!\n表达式输入有错,-=前面只能为变量,不能为常量!","编译原理");
									m_cal=false;
									return;
								}
								p->value=a-b;
								table[p->left->entry].value=p->value;
								p->code=7;
								p->entry=p->left->entry;
								table[p->entry].evaluated=true;
								break;
							case 13:
								if(p->left->code!=7)
								{
									MessageBox("error!\n表达式输入有错,*=前面只能为变量,不能为常量!","编译原理");
									m_cal=false;
									return;
								}
								p->value=a*b;
								table[p->left->entry].value=p->value;
								p->code=7;
								p->entry=p->left->entry;
								table[p->entry].evaluated=true;
								break;
							case 14:
								if(p->left->code!=7)
								{
									MessageBox("error!\n表达式输入有错,/=前面只能为变量,不能为常量!","编译原理");
									m_cal=false;
									return;
								}
								p->value=a/b;
								table[p->left->entry].value=p->value;
								p->code=7;
								p->entry=p->left->entry;
								table[p->entry].evaluated=true;
								break;
							}//switch
							q.Delete(p->left);
							q.Delete(p->right);
							p->left=NULL;
							p->right=NULL;
							node *result;
							result=sl.Pop();		//弹出栈顶元素
							Invalidate();
							if(sl.IsEmpty())
							{
								m_WndDlgBar.GetDlgItem(ID_Caculate)->SetWindowText("开始进行计算(F8)");
								m_result=true;
								Invalidate();
								m_cal=false;
								MessageBox("完毕!","编译原理");
							}
						}//else
				}//if
		}//else
	}//if m_cal==true
	else
		MessageBox("请先生成语法树!","编译原理");
}


void CMy4rdView::PTree(CDC *pDC)		//画图单步输出语法树
{
	listnode *p;
	node *temp;
	CString str;
	p=q.front->next;
	m_num=0;
	while(p!=NULL)
	{
		temp=p->data;
		switch((int)temp->code){
		case 1:
			pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"+");
			if(temp->left!=NULL&&temp->right!=NULL)
			{
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
			}
			break;
		case 2:
			pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"-");
			if(temp->left!=NULL&&temp->right!=NULL)
			{
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
			}
			break;
		case 3:
			pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"*");
			if(temp->left!=NULL&&temp->right!=NULL)
			{
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
			}
			break;
		case 4:
			pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"/");
			if(temp->left!=NULL&&temp->right!=NULL)
			{
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
			}
			break;
		case 7:
			pDC->SetTextColor(RGB(0,0,255));
			pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,CString(table[temp->entry].name));
			pDC->SetTextColor(RGB(0,0,0));
			break;
		case 8:
			str.Format("%.2f",temp->value);
			pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,str);
			break;
		case 9:
			pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"DIV");
			if(temp->left!=NULL&&temp->right!=NULL)
			{
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
			}
			break;
		case 10:
			pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"MOD");
			if(temp->left!=NULL&&temp->right!=NULL)
			{
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
			}
			break;
		case 11:
			pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"+=");
			if(temp->left!=NULL&&temp->right!=NULL)
			{
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
			}
			break;
		case 12:
			pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"-=");
			if(temp->left!=NULL&&temp->right!=NULL)
			{
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
			}
			break;
		case 13:
			pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"*=");
			if(temp->left!=NULL&&temp->right!=NULL)
			{
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
			}
			break;
		case 14:
			pDC->TextOut(Pos[temp->No]->x,Pos[temp->No]->y,"/=");
			if(temp->left!=NULL&&temp->right!=NULL)
			{
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->left->No]->x+5,Pos[temp->left->No]->y);
				pDC->MoveTo(Pos[temp->No]->x+3,Pos[temp->No]->y+15);
				pDC->LineTo(Pos[temp->right->No]->x+5,Pos[temp->right->No]->y);
			}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -