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

📄 codeeditview.cpp

📁 一个用VC++开发的Pascal编译器. 包括词法分析 语法分析 语义分析 中间代码生成 对学习编译原理的同学有很大用途
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	case PROGRAM:	return "program";
	case BEGIN:		return "begin";
	case END:		return "end";
	case VAR:		return "var";
	case IF :		return "if";
	case THEN:		return "then";
	case ELSE:		return "else";
	case WHILE:		return "while";
	case DO :		return "do";
	case INTEGER:	return "integer";
	case REAL:		return "real";
	case ASSIGN:	return ":=";
	case PLUS:		return "+";
	case TIMES:		return "*";
	case OR :		return "|";
	case AND:		return "&";
	case NOT:		return "!";
	case EQ :		return "=";
	case LT :		return "<";
	case LE :		return "<=";
	case GT :		return ">";
	case GE :		return ">=";
	case NE :		return "<>";
	case SEMI:		return ";";
	case LPAREN:	return "(";
	case RPAREN :	return ")";
	case COMMA :	return ",";
	case COLON :	return ":";
	case LCUT :		return "{";
	case RCUT :		return "}";
	default:		return "";
	}
}

void CCodeEditView::OutObj()
{
	CMainFrame* pFrame = (CMainFrame*)::AfxGetMainWnd();
	CString	ObjStr = "";
	for( int i = 0; i < m_Obj.size(); i++){
		if(m_Obj[ i ].operand > 5){//跳转指令
			ObjStr.Format("%d:   %s   %d",i+1,OP[ m_Obj[ i ].operand ],m_Obj[ i ].address);
		}
		else{		//不是跳转指令
			ObjStr.Format("%d:   %s   %s   %s",i+1,OP[ m_Obj[ i ].operand ],
				m_Obj[ i ].arg1, m_Obj[ i ].arg2);
		}
		pFrame->m_pMsgView->AddMsg(ObjStr);
	}
	CString FinishStr = "";
	FinishStr.Format("%d:   Halt",m_Obj.size()+1);
	pFrame->m_pMsgView->AddMsg(FinishStr);
	m_IEOFM.clear();
	m_Obj.clear();
}

void CCodeEditView::GenObj()
{
	int	count = m_IEOFM.size();
	int	address[ 50 ] = { 0 };
	address[ 1 ] = 1;
	for(int i = 0 ; i<count; i++){//翻译所有四元式
		switch(m_IEOFM[ i ].OP){
		case ASSIGN:
			{
				if(m_IEOFM[ i ].arg1.Type == 0){//立即数
					m_ObjModel.operand = mMOV;//mov
					m_ObjModel.arg1 = "AX";
					m_ObjModel.arg2 = "#";
					m_ObjModel.arg2 += m_IEOFM[ i ].arg1.Name;
					m_ObjModel.address = 0;
					m_Obj.push_back(m_ObjModel);
					/////////////////////////////////////////
					m_ObjModel.operand = mMOV;//mov
					m_ObjModel.arg1 = m_IEOFM[ i ].result.Name;
					m_ObjModel.arg2 = "AX";
					m_ObjModel.address = 0;
					m_Obj.push_back(m_ObjModel);
					address[ i+2 ] = address[ i+1 ] + 2; 
				}
				else{
					m_ObjModel.operand = mMOV;//mov
					m_ObjModel.arg1 = "AX";
					m_ObjModel.arg2 = m_IEOFM[ i ].arg1.Name;
					m_ObjModel.address = 0;
					m_Obj.push_back(m_ObjModel);
					/////////////////////////////////////////
					m_ObjModel.operand = mMOV;//mov
					m_ObjModel.arg1 = m_IEOFM[ i ].result.Name;
					m_ObjModel.arg2 = "AX";
					m_ObjModel.address = 0;
					m_Obj.push_back(m_ObjModel);
					address[ i+2 ] = address[ i+1 ] + 2;
				}
			}
			break;
		case GT://   >
			{
				m_ObjModel.operand = mMOV;//mov
				m_ObjModel.arg1 = "AX";
				m_ObjModel.arg2 = m_IEOFM[ i ].arg1.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				/////////////////////////////////////////
				m_ObjModel.operand = mCMP;//mov
				m_ObjModel.arg1 = "AX";
				m_ObjModel.arg2 = m_IEOFM[ i ].arg2.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				/////////////////////////////////////////
				m_ObjModel.operand = mJA;//mov
				m_ObjModel.arg1 = "";
				m_ObjModel.arg2 = "";
				m_ObjModel.address = atoi(m_IEOFM[ i ].result.Name);
				m_Obj.push_back(m_ObjModel);
				address[ i+2 ] = address[ i+1 ] + 3;
			}
			break;
		case LT://   <
			{
				m_ObjModel.operand = mMOV;//mov
				m_ObjModel.arg1 = "AX";
				m_ObjModel.arg2 = m_IEOFM[ i ].arg1.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				/////////////////////////////////////////
				m_ObjModel.operand = mCMP;//mov
				m_ObjModel.arg1 = "AX";
				m_ObjModel.arg2 = m_IEOFM[ i ].arg2.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				/////////////////////////////////////////
				m_ObjModel.operand = mJB;//mov
				m_ObjModel.arg1 = "";
				m_ObjModel.arg2 = "";
				m_ObjModel.address = atoi(m_IEOFM[ i ].result.Name);
				m_Obj.push_back(m_ObjModel);
				address[ i+2 ] = address[ i+1 ] + 3;
			}
			break;
		case LE:
			{
				m_ObjModel.operand = mMOV;//mov
				m_ObjModel.arg1 = "AX";
				m_ObjModel.arg2 = m_IEOFM[ i ].arg1.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				/////////////////////////////////////////
				m_ObjModel.operand = mCMP;//mov
				m_ObjModel.arg1 = "AX";
				m_ObjModel.arg2 = m_IEOFM[ i ].arg2.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				/////////////////////////////////////////
				m_ObjModel.operand = mJNA;//mov
				m_ObjModel.arg1 = "";
				m_ObjModel.arg2 = "";
				m_ObjModel.address = atoi(m_IEOFM[ i ].result.Name);
				m_Obj.push_back(m_ObjModel);
				address[ i+2 ] = address[ i+1 ] + 3;
			}
			break;
		case GE:
			{
				m_ObjModel.operand = mMOV;//mov
				m_ObjModel.arg1 = "AX";
				m_ObjModel.arg2 = m_IEOFM[ i ].arg1.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				/////////////////////////////////////////
				m_ObjModel.operand = mCMP;//mov
				m_ObjModel.arg1 = "AX";
				m_ObjModel.arg2 = m_IEOFM[ i ].arg2.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				/////////////////////////////////////////
				m_ObjModel.operand = mJNB;//mov
				m_ObjModel.arg1 = "";
				m_ObjModel.arg2 = "";
				m_ObjModel.address = atoi(m_IEOFM[ i ].result.Name);
				m_Obj.push_back(m_ObjModel);
				address[ i+2 ] = address[ i+1 ] + 3;
			}
			break;
		case NE:
			{
				m_ObjModel.operand = mMOV;//mov
				m_ObjModel.arg1 = "AX";
				m_ObjModel.arg2 = m_IEOFM[ i ].arg1.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				/////////////////////////////////////////
				m_ObjModel.operand = mCMP;//mov
				m_ObjModel.arg1 = "AX";
				m_ObjModel.arg2 = m_IEOFM[ i ].arg2.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				/////////////////////////////////////////
				m_ObjModel.operand = mJNE;//mov
				m_ObjModel.arg1 = "";
				m_ObjModel.arg2 = "";
				m_ObjModel.address = atoi(m_IEOFM[ i ].result.Name);
				m_Obj.push_back(m_ObjModel);
				address[ i+2 ] = address[ i+1 ] + 3;
			}
			break;
		case EQ:
			{
				m_ObjModel.operand = mMOV;//mov
				m_ObjModel.arg1 = "AX";
				m_ObjModel.arg2 = m_IEOFM[ i ].arg1.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				/////////////////////////////////////////
				m_ObjModel.operand = mCMP;//mov
				m_ObjModel.arg1 = "AX";
				m_ObjModel.arg2 = m_IEOFM[ i ].arg2.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				/////////////////////////////////////////
				m_ObjModel.operand = mJE;//mov
				m_ObjModel.arg1 = "";
				m_ObjModel.arg2 = "";
				m_ObjModel.address = atoi(m_IEOFM[ i ].result.Name);
				m_Obj.push_back(m_ObjModel);
				address[ i+2 ] = address[ i+1 ] + 3;
			}
			break;
		case JMP:
			{
				m_ObjModel.operand = mJMP;//mov
				m_ObjModel.arg1 = "";
				m_ObjModel.arg2 = "";
				m_ObjModel.address = atoi(m_IEOFM[ i ].result.Name);
				m_Obj.push_back(m_ObjModel);
				address[ i+2 ] = address[ i+1 ] + 1;
			}
			break;
		case JNZ:
			{
				m_ObjModel.operand = mMOV;//mov
				m_ObjModel.arg1 = "AX";
				m_ObjModel.arg2 = m_IEOFM[ i ].arg1.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				/////////////////////////////////
				m_ObjModel.operand = mJNZ;//mov
				m_ObjModel.arg1 = "";
				m_ObjModel.arg2 = "";
				m_ObjModel.address = atoi(m_IEOFM[ i ].result.Name);
				m_Obj.push_back(m_ObjModel);
				address[ i+2 ] = address[ i+1 ] + 2;
			}
			break;
		case PLUS:
			{
				m_ObjModel.operand = mMOV;//mov
				m_ObjModel.arg1 = "AX";
				if(m_IEOFM[ i ].arg1.Type == 0){//立即数
					m_ObjModel.arg2 = "#";
					m_ObjModel.arg2 += m_IEOFM[ i ].arg1.Name;
				}
				else m_ObjModel.arg2 = m_IEOFM[ i ].arg1.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				///////////////////////////////////////////////
				m_ObjModel.operand = mADD;//add
				m_ObjModel.arg1 = "AX";
				if(m_IEOFM[ i ].arg2.Type == 0){//立即数
					m_ObjModel.arg2 = "#";
					m_ObjModel.arg2 += m_IEOFM[ i ].arg2.Name;
				}
				else m_ObjModel.arg2 = m_IEOFM[ i ].arg2.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				///////////////////////////////////////////////
				m_ObjModel.operand = mMOV;//mov
				m_ObjModel.arg1 = m_IEOFM[ i ].result.Name;
				m_ObjModel.arg2 = "AX";
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				address[ i+2 ] = address[ i+1 ] + 3;
			}
			break;
		case SUB:
			{
				m_ObjModel.operand = mMOV;//mov
				m_ObjModel.arg1 = "AX";
				if(m_IEOFM[ i ].arg1.Type == 0){//立即数
					m_ObjModel.arg2 = "#";
					m_ObjModel.arg2 += m_IEOFM[ i ].arg1.Name;
				}
				else m_ObjModel.arg2 = m_IEOFM[ i ].arg1.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				///////////////////////////////////////////////
				m_ObjModel.operand = mSUB;//add
				m_ObjModel.arg1 = "AX";
				if(m_IEOFM[ i ].arg2.Type == 0){//立即数
					m_ObjModel.arg2 = "#";
					m_ObjModel.arg2 += m_IEOFM[ i ].arg2.Name;
				}
				else m_ObjModel.arg2 = m_IEOFM[ i ].arg2.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				///////////////////////////////////////////////
				m_ObjModel.operand = mMOV;//mov
				m_ObjModel.arg1 = m_IEOFM[ i ].result.Name;
				m_ObjModel.arg2 = "AX";
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				address[ i+2 ] = address[ i+1 ] + 3;
			}
			break;
		case TIMES:
			{
				m_ObjModel.operand = mMOV;//mov
				m_ObjModel.arg1 = "AX";
				if(m_IEOFM[ i ].arg1.Type == 0){//立即数
					m_ObjModel.arg2 = "#";
					m_ObjModel.arg2 += m_IEOFM[ i ].arg1.Name;
				}
				else m_ObjModel.arg2 = m_IEOFM[ i ].arg1.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				///////////////////////////////////////////////
				m_ObjModel.operand = mMUL;//add
				m_ObjModel.arg1 = "AX";
				if(m_IEOFM[ i ].arg2.Type == 0){//立即数
					m_ObjModel.arg2 = "#";
					m_ObjModel.arg2 += m_IEOFM[ i ].arg2.Name;
				}
				else m_ObjModel.arg2 = m_IEOFM[ i ].arg2.Name;
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				///////////////////////////////////////////////
				m_ObjModel.operand = mMOV;//mov
				m_ObjModel.arg1 = m_IEOFM[ i ].result.Name;
				m_ObjModel.arg2 = "AX";
				m_ObjModel.address = 0;
				m_Obj.push_back(m_ObjModel);
				address[ i+2 ] = address[ i+1 ] + 3;
			}
			break;
		default:
			break;
		}
	}
	BackPatchAddr(address);
}

void CCodeEditView::BackPatchAddr(int address[])
{
	for(int i = 0; i < m_Obj.size()+2; i++){
		if(m_Obj[ i ].operand > 5){//跳转指令
			m_Obj[ i ].address = address[m_Obj[ i ].address];
		}
	}
}

void CCodeEditView::OnUpdateCompile(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable( GetStr()!="" );
}

⌨️ 快捷键说明

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