📄 codeeditview.cpp
字号:
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 + -