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

📄 faceview.cpp

📁 上课时老师用过的SNL编译器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}

 //语义分析标志为假,不能生成目标代码:
 if (!DOANALYZEFLAG)
 {	 MessageBox("请先进行语义分析!");
     return;
 }


  //语义分析有错,不进行中间代码生成:
 if (myanalyze.Error)
 {		MessageBox("请更正语义错误后再进行代码生成!");
		return;
 }


    //设置目标代码生成标志:
	if (!DODEMICODEFLAG)
			DODEMICODEFLAG = true;
	else
	{	MessageBox("请执行下一步!");
		return;
	}       

	
    	//指定目标文件名:
		codefile = "c:\\destcode.tm";
		
		//打开目标代码文件,输出文件名。
		mytreetodemi.code = fopen(codefile,"w+");
	    if(mytreetodemi.code==NULL)
		{
			CString  str ;
			str.Format("不能打开文件%s\n",codefile);
		    MessageBox(str);
			return;
		}
		//生成目标代码,并写入文件
		mytreetodemi.codeGen(tree,codefile,StoreNoff);

		//关闭目标代码文件
		fclose(mytreetodemi.code);
	
  		//在输出栏导入结果文件:
		this->OutPut(codefile);

		//添加复选按钮:
		b_treetodemi_check=true;


		//设置选择从语法树生成目标代码标志:
		SELTREETODEMI =	true;


}

//解释器:和用户交互执行,内部实现。
void CFaceView::OnCompileIntepreter() 
{
 //目标代码生成标志为假,不能解释执行:
 if (!DODEMICODEFLAG)
 {	 MessageBox("请先生成目标代码!",NULL,MB_OK);
     return;
 }
	
	//解释执行:
    mytm.tmain(codefile);

    //全部执行完毕,恢复各项值:
    Reset();

}


/******************************************************/
/*******************编译菜单的实现*********************/
/******************************************************/

//编译整个程序,得到目标代码:
void CFaceView::OnExeAll() 
{

	//获得用户打开或者新建的源文件路径:
     pgm = m_pDocument->GetPathName();
	 if (pgm == "")
	 { MessageBox("请先选择一个源文件!");
		return;
	 }

	//设置编译标志:
	if (!DOCOMPILE)
			DOCOMPILE = true;
	else
	{	MessageBox("编译过程已执行");
		return;
	}       

	//定义词法分析结果文件的位置:
	myscan.listing = fopen("c:\\total.txt","w+");
	fprintf(myscan.listing," >>进行词法分析... ");
	

	//调用编译器的词法分析主函数:
	myscan.getTokenList(pgm);

	if (myscan.Error)
	{ 
		myscan.printTokenlist();

		fclose(myscan.listing);

		this->OutPut("c:\\total.txt");
		return;
	}
	else 
	{	
		 fprintf(myscan.listing," 0个错误;\n");
		 fclose(myscan.listing);
	}



	myparse.listing	= fopen("c:\\total.txt","a");
	fprintf(myparse.listing," >>进行语法分析...	");

	//调用语法分析函数,进行语法分析:
	tree =	myparse.parse();

	if (myparse.Error)
	{
		fclose(myparse.listing);
		this->OutPut("c:\\total.txt");
		return;
	}
	else 
	{	 fprintf(myparse.listing," 0个错误;\n");
		 fclose(myparse.listing);
	}


	myanalyze.listing	= fopen("c:\\total.txt","a");

	fprintf(myanalyze.listing," >>进行语义分析...");
	//调用语义分析函数,进行语义分析:
	StoreNoff = myanalyze.analyze(tree);
	
	if (myanalyze.Error)
	{	
		fclose(myanalyze.listing);
		this->OutPut("c:\\total.txt");
		return;
	}
	else 
	{	 fprintf(myanalyze.listing," 0个错误;\n");


		//指定目标文件名:
		 codefile = "c:\\destcode.tm";
		
		 fprintf(myanalyze.listing," 生成目标代码文件:");
		 fprintf(myanalyze.listing, codefile);
	     fclose(myanalyze.listing);
	}
		//打开目标代码文件,输出文件名。
		mytreetodemi.code = fopen(codefile,"w");
	    if(mytreetodemi.code==NULL)
		{
			CString  str ;
			str.Format("Unable to open %s\n",codefile);
		    MessageBox(str);
			return;
		}
		//生成目标代码,并写入文件
		mytreetodemi.codeGen(tree,codefile,StoreNoff);
		fclose(mytreetodemi.code);
		
		this->OutPut("c:\\total.txt");
	
		//添加复选按钮:
		b_compile_check=true;	
}


//为了节省代码,把倒入输入栏的代码用一个函数表示:
void  CFaceView::OutPut(CString  str)
{
	//在输出栏导入结果文件:
	tagVARIANT filetype;
	filetype.vt=VT_ERROR|VT_EMPTY;
	CMainFrame *pFrame = (CMainFrame *) (AfxGetApp()->m_pMainWnd);
	CRichText *prichtext = (CRichText *) pFrame->m_wndMyDialogBar.GetDlgItem(IDC_RICHTEXTCTRL1);
	prichtext->LoadFile(str,filetype);

}

//对目标代码进行解释执行:
void CFaceView::OnExeInterpre() 
{
  if ((myscan.Error)||(myparse.Error)||(myanalyze.Error))
  {	  MessageBox("请先更正错误!");
	  return;
  }
  //先生成目标代码:
 if (!DOCOMPILE)
 {	 MessageBox("请先进行编译!");
     return;
 }
	//解释执行:
	mytm.tmain(codefile);

	//恢复编译菜单:
	DOCOMPILE  =  false;

	b_compile_check = false;
	DeleteFile("c:\\total.txt");
	
}

/************************************************************/
/********  菜单:	 阅读程序源代码部分				*********/
/************************************************************/

//阅读词法分析源程序:
void CFaceView::OnReadScan() 
{

	CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\scan.txt";

	OpenNewDocument(str);

	
}


//阅读语法分析源程序:
void CFaceView::OnReadParse() 
{
  
	CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\parse.txt";

	OpenNewDocument(str);


}
//阅读递归下降语法分析源程序上半部分
void CFaceView::OnReadParseA() 
{
    CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\parseA.txt";

	OpenNewDocument(str);	
}

//阅读递归下降语法分析源程序下半部分
void CFaceView::OnReadParseB() 
{
	CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\parseB.txt";

	OpenNewDocument(str);
	
}

//阅读LL1语法分析源程序上半部分
void CFaceView::OnReadLl1parseA() 
{
	CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\parseLL1A.txt";

	OpenNewDocument(str);
}

//阅读语法分析源程序下半部分:
void CFaceView::OnReadLl1parseB() 
{
	CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\parseLL1B.txt";

	OpenNewDocument(str);
	
}


//阅读LL1语义分析源程序:
void CFaceView::OnReadAnalyze() 
{
	
	CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\analyze.txt";

	OpenNewDocument(str);


}


//阅读中间代码生成源程序:
void CFaceView::OnReadMidcode() 
{
	CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\midcode.txt";

	OpenNewDocument(str);


}

//阅读常量表达式优化源程序:
void CFaceView::OnReadConstopti() 
{

	CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\constOpti.txt";

	OpenNewDocument(str);

}

//阅读公共表达式优化源程序:
void CFaceView::OnReadEccopti() 
{
	

	CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\eccOpti.txt";

	OpenNewDocument(str);
}

//阅读循环不变式优化源程序:
void CFaceView::OnReadLoopopti() 
{

	
	CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\loopOpti.txt";

	OpenNewDocument(str);


}


//阅读中间代码到目标代码的生成源程序:
void CFaceView::OnReadMidtodemi() 
{
	
	CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\midToDemi.txt";

	OpenNewDocument(str);


}

//阅读语法树到目标代码的生成源程序:
void CFaceView::OnReadTreetodemi() 
{
	
	CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\treeToDemi.txt";

	OpenNewDocument(str);


}


//阅读目标代码的解释器生成源程序:
void CFaceView::OnReadInterpreter() 
{
	CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\tm.txt";

	OpenNewDocument(str);
	

}

//帮助菜单:

/************给出此语言的上下文无关文法*************/
void CFaceView::OnCfg() 
{
	
	CMainFrame *pFrm=(CMainFrame*)AfxGetMainWnd();
	
	CString str = pFrm->buf;
	str = str+"\\code\\cfg.txt";

	OpenNewDocument(str);

}


/****************实用函数*****************/

//打开一个文件函数:自定义
BOOL CFaceView::OpenNewDocument(const CString&  strTarget)
{
	CString  strDocName;
	CDocTemplate  *pSelectedTemplate;
	POSITION  pos = AfxGetApp()->GetFirstDocTemplatePosition();
	while (pos!= NULL)
	{
		pSelectedTemplate = (CDocTemplate *)(AfxGetApp()->GetNextDocTemplate(pos));
		ASSERT(pSelectedTemplate != NULL);
		ASSERT(pSelectedTemplate->IsKindOf(	RUNTIME_CLASS(CDocTemplate)));
	    
		pSelectedTemplate->OpenDocumentFile(strTarget,TRUE);
			return TRUE;
	}
	return  FALSE;
}


//重置单步执行菜单:取消所有菜单复选标志;设置所有菜单项为未执行状态.
void CFaceView::Reset()
{

	//取消所有复选标志:
	b_scan_check = false;
	b_parse_check = false;
	b_ll1parse_check = false ;
	b_analyze_check = false ;	
	
	b_treetodemi_check = false;
	b_midtodemi_check = false;
	
	b_midcode_check = false;
	b_OptiConst_check = false;
	b_OptiEcc_check = false ;
	b_OptiLoop_check = false ;
	b_mtddemi_check = false;

	b_intepreter_check = false;
	b_compile_check = false;

	//中间代码菜单变灰
	enable_midcode = false;
	enable_opticonst = false;
	enable_optiecc = false;
	enable_optiloop = false;
	enable_midtodemi = false;
	

	//取消单步执行各阶段执行标志:
	 DOSCANFLAG	   = false;
	 DOPARSEFLAG   = false;
	 DOANALYZEFLAG = false;
     DOMIDCODEFLAG = false;
	 DODEMICODEFLAG= false;

	 SELMIDTODEMI =	false;
	 SELTREETODEMI = false;

	 //取消编译菜单的执行标志:
	 DOCOMPILE = false;
}


/*重置菜单,重新设置,使编译菜单或者单步执行菜单回到初始状态,
  以便进行下一个源程序的处理*/
void CFaceView::OnReset() 
{
	//调用reset函数:
	Reset();
	
}


//设置字体的显示格式:

int CFaceView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CEditView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	//设置要显示的字体格式:
	 m_fontEdit.DeleteObject();

	 m_fontEdit.CreateFont(20,
					0,
					0,
					0,
					FW_HEAVY,
					0,
					0,
					0,
					ANSI_CHARSET,
					OUT_DEFAULT_PRECIS,
					CLIP_DEFAULT_PRECIS,
					DEFAULT_QUALITY,
					DEFAULT_PITCH|FF_DONTCARE,
					"粗体字");
	
		GetEditCtrl().SetFont(&m_fontEdit);	

	return 0;

}

//添加复选框
void CFaceView::OnUpdateCompileScan(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(b_scan_check);
}



void CFaceView::OnUpdateParseDigui(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(b_parse_check);
	
}

void CFaceView::OnUpdateParseLl1(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(b_ll1parse_check);
	
}

void CFaceView::OnUpdateCompileAnalyze(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(b_analyze_check);

}


void CFaceView::OnUpdateCompileTreetodemi(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(b_treetodemi_check);
	
}

void CFaceView::OnUpdateCompileMidtodemi(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(b_midtodemi_check);
	
}

void CFaceView::OnUpdateCompileIntepreter(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(b_intepreter_check);
	
}


void CFaceView::OnUpdateOptiConst(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(b_OptiConst_check);

	if (pCmdUI->m_pSubMenu != NULL)
	{
		BOOL b_Popup = enable_opticonst || enable_optiecc || enable_optiloop;
		pCmdUI->m_pMenu->EnableMenuItem(pCmdUI->m_nIndex,
        MF_BYPOSITION | 
						(b_Popup ? MF_ENABLED :(MF_DISABLED | MF_GRAYED)));

		return;

	}
    pCmdUI->Enable(enable_opticonst);
	
}

void CFaceView::OnUpdateOptiEcc(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(b_OptiEcc_check);
	pCmdUI->Enable(enable_optiecc);

}


void CFaceView::OnUpdateOptiLoop(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(b_OptiLoop_check);
	pCmdUI->Enable(enable_optiloop);

}


void CFaceView::OnUpdateMtdDemicode(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(b_mtddemi_check);

	pCmdUI->Enable(enable_midtodemi);

}

void CFaceView::OnUpdateMtdMidcode(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(b_midcode_check);

	pCmdUI->Enable(enable_midtodemi);

}

void CFaceView::OnUpdateExeAll(CCmdUI* pCmdUI) 
{
   	pCmdUI->SetCheck(b_compile_check);
}

⌨️ 快捷键说明

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