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

📄 faceview.cpp

📁 上课时老师用过的SNL编译器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// faceView.cpp : implementation of the CFaceView class
//

#include "stdafx.h"
#include "face.h"

#include "faceDoc.h"
#include "faceView.h"


#include "MainFrm.h"
#include "out.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CFaceView

IMPLEMENT_DYNCREATE(CFaceView, CEditView)

BEGIN_MESSAGE_MAP(CFaceView, CEditView)
	//{{AFX_MSG_MAP(CFaceView)
	ON_COMMAND(ID_COMPILE_SCAN, OnCompileScan)
	ON_COMMAND(ID_COMPILE_ANALYZE, OnCompileAnalyze)
	ON_COMMAND(ID_COMPILE_MIDTODEMI, OnCompileMidtodemi)
	ON_COMMAND(ID_COMPILE_TREETODEMI, OnCompileTreetodemi)
	ON_COMMAND(ID_READ_ANALYZE, OnReadAnalyze)
	ON_COMMAND(ID_READ_INTERPRETER, OnReadInterpreter)
	ON_COMMAND(ID_READ_MIDCODE, OnReadMidcode)
	ON_COMMAND(ID_READ_MIDTODEMI, OnReadMidtodemi)
	ON_COMMAND(ID_READ_PARSE, OnReadParse)
	ON_COMMAND(ID_READ_SCAN, OnReadScan)
	ON_COMMAND(ID_READ_TREETODEMI, OnReadTreetodemi)
	ON_COMMAND(ID_COMPILE_INTEPRETER, OnCompileIntepreter)
	ON_COMMAND(ID_EXE_ALL, OnExeAll)
	ON_COMMAND(ID_EXE_INTERPRE, OnExeInterpre)
	ON_COMMAND(ID_READ_CONSTOPTI, OnReadConstopti)
	ON_COMMAND(ID_READ_ECCOPTI, OnReadEccopti)
	ON_COMMAND(ID_READ_LOOPOPTI, OnReadLoopopti)
	ON_COMMAND(ID_PARSE_DIGUI, OnParseDigui)
	ON_COMMAND(ID_PARSE_LL1, OnParseLL1)
	ON_COMMAND(ID_CFG, OnCfg)
	ON_COMMAND(ID_RESET, OnReset)
	ON_WM_CREATE()
	ON_UPDATE_COMMAND_UI(ID_COMPILE_SCAN, OnUpdateCompileScan)
	ON_UPDATE_COMMAND_UI(ID_PARSE_DIGUI, OnUpdateParseDigui)
	ON_UPDATE_COMMAND_UI(ID_PARSE_LL1, OnUpdateParseLl1)
	ON_UPDATE_COMMAND_UI(ID_COMPILE_TREETODEMI, OnUpdateCompileTreetodemi)
	ON_UPDATE_COMMAND_UI(ID_COMPILE_MIDTODEMI, OnUpdateCompileMidtodemi)
	ON_UPDATE_COMMAND_UI(ID_COMPILE_INTEPRETER, OnUpdateCompileIntepreter)
	ON_COMMAND(ID_MTD_DEMICODE, OnMtdDemicode)
	ON_COMMAND(ID_OPTI_CONST, OnOptiConst)
	ON_UPDATE_COMMAND_UI(ID_OPTI_CONST, OnUpdateOptiConst)
	ON_COMMAND(ID_OPTI_ECC, OnOptiEcc)
	ON_UPDATE_COMMAND_UI(ID_OPTI_ECC, OnUpdateOptiEcc)
	ON_COMMAND(ID_OPTI_LOOP, OnOptiLoop)
	ON_UPDATE_COMMAND_UI(ID_OPTI_LOOP, OnUpdateOptiLoop)
	ON_COMMAND(ID_MTD_MIDCODE, OnMtdMidcode)
	ON_UPDATE_COMMAND_UI(ID_MTD_MIDCODE, OnUpdateMtdMidcode)
	ON_UPDATE_COMMAND_UI(ID_COMPILE_ANALYZE, OnUpdateCompileAnalyze)
	ON_UPDATE_COMMAND_UI(ID_MTD_DEMICODE, OnUpdateMtdDemicode)
	ON_UPDATE_COMMAND_UI(ID_EXE_ALL, OnUpdateExeAll)
	ON_COMMAND(ID_READ_LL1PARSE_A, OnReadLl1parseA)
	ON_COMMAND(ID_READ_LL1PARSE_B, OnReadLl1parseB)
	ON_COMMAND(ID_READ_PARSE_A, OnReadParseA)
	ON_UPDATE_COMMAND_UI(ID_COMPILE_ANALYZE, OnUpdateCompileAnalyze)
	ON_COMMAND(ID_READ_PARSE_B, OnReadParseB)
	//}}AFX_MSG_MAP

	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CEditView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFaceView construction/destruction

CFaceView::CFaceView()
{
	
	//取消单步执行各阶段执行标志:
	 DOSCANFLAG	=	false;
	 DOPARSEFLAG	=	false;
	 DOANALYZEFLAG=	 false;
     DOMIDCODEFLAG=	 false;
	 DODEMICODEFLAG= false;
	 SELTREETODEMI = false;
	 SELMIDTODEMI = false;

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

	 //取消所有复选标志:
	 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;

	
}

CFaceView::~CFaceView()
{
 
}

BOOL CFaceView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	BOOL bPreCreated = CEditView::PreCreateWindow(cs);
	cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL);	// Enable word-wrapping


	return bPreCreated;
}

/////////////////////////////////////////////////////////////////////////////
// CFaceView drawing

void CFaceView::OnDraw(CDC* pDC)
{
	CFaceDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);


    
}

/////////////////////////////////////////////////////////////////////////////
// CFaceView printing

BOOL CFaceView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default CEditView preparation
	return CEditView::OnPreparePrinting(pInfo);
}

void CFaceView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView begin printing.
	CEditView::OnBeginPrinting(pDC, pInfo);
}

void CFaceView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView end printing
	CEditView::OnEndPrinting(pDC, pInfo);
}

/////////////////////////////////////////////////////////////////////////////
// CFaceView diagnostics

#ifdef _DEBUG
void CFaceView::AssertValid() const
{
	CEditView::AssertValid();
}

void CFaceView::Dump(CDumpContext& dc) const
{
	CEditView::Dump(dc);
}

CFaceDoc* CFaceView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFaceDoc)));
	return (CFaceDoc*)m_pDocument;
}
#endif //_DEBUG



/************************************************************/
/****************菜单:单步执行	*****************************/
/************************************************************/

/****词法分析菜单项********/
   
void CFaceView::OnCompileScan() 
{
	//获得用户打开或者新建的源文件路径:
    pgm = m_pDocument->GetPathName();
	//pgm = GetDocument()->GetPathName();
	 if (pgm == "")
	 { MessageBox("请先选择一个源文件!");
		return;
	 }

    //设置词法分析执行标志:
	if (!DOSCANFLAG)
			DOSCANFLAG = true;
	else
	{	MessageBox("请执行下一步!");
		return;
	}
		
	//定义词法分析结果文件的位置:
	myscan.listing = fopen("c:\\scan.txt","w+");
	
	
    //调用编译器的词法分析主函数:
	myscan.getTokenList(pgm);
	
    //输出Token序列到文件:
    myscan.printTokenlist();
	
    //关闭结果文件:
	fclose(myscan.listing);
	
	//在输出栏倒入结果文件:
	this->OutPut("c:\\scan.txt");

    DeleteFile("c:\\scan.txt");

	b_scan_check=true;
}


/******************语法分析菜单项*******************/


/************递归下降法***************/

void CFaceView::OnParseDigui() 
{
	//词法分析执行标志为假,不执行语法分析:
 if (!DOSCANFLAG)
 {	 MessageBox("请先执行词法分析!");
     return;
 }
 //词法分析有错,不进行语法分析:
 if (myscan.Error)
 {
	 MessageBox("请更正词法错误后再进行语法分析!");
	 return;
 }

	//设置语法分析执行标志:
	if (!DOPARSEFLAG)
			DOPARSEFLAG = true;
	else
	{	MessageBox(" 请执行下一步!");
		return;
	}

	
	 //定义语法分析结果文件位置:
     myparse.listing = fopen("c:\\parse.txt","w+");
    
	//调用语法分析函数,进行语法分析:
	tree =	myparse.parse();

	//语法分析无错时显示生成的语法树:
	if (!myparse.Error)
    {  
	   fprintf(myparse.listing,">>无语法错误,构造的语法树如下:\n");
	   myparse.printTree(tree);
	}

    //关闭结果文件:
	fclose(myparse.listing);

	//在输出栏倒入结果文件:
	this->OutPut("c:\\parse.txt");

    DeleteFile("c:\\parse.txt");

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

}

/***********LL1语法分析方法*******************/

void CFaceView::OnParseLL1() 
{

	//词法分析执行标志为假,不执行语法分析:
 if (!DOSCANFLAG)
 {	 MessageBox("请先执行词法分析!");
     return;
 }
 //词法分析有错,不进行语法分析:
 if (myscan.Error)
 {
	 MessageBox("请更正词法错误后再进行语法分析!");
	 return;
 }

	//设置语法分析执行标志:
	if (!DOPARSEFLAG)
			DOPARSEFLAG = true;
	else
	{	MessageBox(" 请执行下一步!");
		return;
	}


	 //定义语法分析结果文件位置:
     myparseLL1.listing = fopen("c:\\parseLL1.txt","w+");
   
	//调用语法分析函数,进行语法分析:
	tree =	myparseLL1.parseLL1();
 	

	//语法分析无错时显示生成的语法树:
	if (!myparseLL1.Error)
    {  
	   fprintf(myparseLL1.listing,">>无语法错误,构造的语法树如下:\n");
	   myparseLL1.printTree(tree);
	}

    //关闭结果文件:
	fclose(myparseLL1.listing);

	//在输出栏倒入结果文件:
	this->OutPut("c:\\parseLL1.txt");

    DeleteFile("c:\\parseLL1.txt");

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


}


/****************语义分析菜单项*******************/

void CFaceView::OnCompileAnalyze() 
{
 //语法分析执行标志为假,不执行语义分析:
 if (!DOPARSEFLAG)
 {	 MessageBox("请先执行语法分析!");
     return;
 }

 //语法分析有错,不进行语义分析:
 if ((myparse.Error)||(myparseLL1.Error))
 {
	 MessageBox("请更正语法错误后再进行语义分析!");
	 return;
 }

    //设置语义分析执行标志:
	if (!DOANALYZEFLAG)
			DOANALYZEFLAG = true;
	else
	{	MessageBox("请执行下一步!",NULL,MB_OK);
		return;
	}

	
    //定义语义分析结果文件位置:
    myanalyze.listing = fopen("c:\\analyze.txt","w+");
    
	//调用语义分析函数,进行语义分析:
	StoreNoff = myanalyze.analyze(tree);

	//语义分析无错时显示生成的符号表:
	if (!myanalyze.Error)
    {  
	   fprintf(myanalyze.listing,">>无语义错误,生成的符号表如下:\n");
	   myanalyze.PrintSymbTable();
	}

    //关闭结果文件:
	fclose(myanalyze.listing);

	//在输出栏导入结果文件:
	this->OutPut("c:\\analyze.txt");

    DeleteFile("c:\\analyze.txt");

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

}

//选择路径为:通过中间代码生成目标代码.

void CFaceView::OnCompileMidtodemi() 
{
	
	if (SELTREETODEMI)
	{  
		MessageBox("已经选择从语法树生成目标代码!请执行下一步!");
		return;
	}

	//如果已经调出中间代码菜单,则不再添加: 
	if (SELMIDTODEMI)
		return;
    
	b_midtodemi_check = true;

	enable_midcode =   true;
	enable_opticonst = true;
	enable_optiecc =   true;
	enable_optiloop =  true;
	enable_midtodemi = true;
	
	//设置有中间代码过程标志:
	SELMIDTODEMI = true;

}


/**********************中间代码生成***********************/

void CFaceView::OnMtdMidcode() 
{
 //语义分析执行标志为假,不执行中间代码生成:
 if (!DOANALYZEFLAG)
 {	 MessageBox("请先执行语义分析!");
     return;
 }

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

    //设置中间代码执行标志:
	if (!DOMIDCODEFLAG)
			DOMIDCODEFLAG = true;
	else
	{	MessageBox("请执行下一步!");
		return;
	}


	 //定义中间代码文件位置:
    mymidcode.listing = fopen("c:\\midcode.txt","w+");
    
	//调用中间代码生成主函数:
	midcode = mymidcode.GenMidCode(tree,StoreNoff);

	//输出中间代码到文件:
	fprintf(mymidcode.listing, ">>中间代码:\n");
	mymidcode.PrintMidCode(midcode);

    //关闭结果文件:
	fclose(mymidcode.listing);

	//在输出栏导入结果文件:
	this->OutPut("c:\\midcode.txt");

    DeleteFile("c:\\midcode.txt");

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

}

/*******************常量表达式优化************************/

void CFaceView::OnOptiConst() 
{   
//中间代码生成标志为假,不执行优化:
 if (!DOMIDCODEFLAG)
 {	 MessageBox("请先生成中间代码!");
     return;
 }

 
	 //定义结果文件位置:
    myconOpti.listing = fopen("c:\\constOpti.txt","w+");
    
	//调用常量表达式优化主函数:
	midcode = myconOpti.ConstOptimize(midcode);

	//输出常量表达式优化结果到文件:
	fprintf(myconOpti.listing, " >>常量表达式优化结果:\n");
	myconOpti.PrintMidCode(midcode);

    //关闭结果文件:
	fclose(myconOpti.listing);

	//在输出栏导入结果文件:
	this->OutPut("c:\\constOpti.txt");

    DeleteFile("c:\\constOpti.txt");

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

}

/****************公共表达式优化:**********************/
void CFaceView::OnOptiEcc() 
{
 //中间代码生成标志为假,不执行优化:
 if (!DOMIDCODEFLAG)
 {	 MessageBox("请先生成中间代码!");
     return;
 }
 	
    //定义结果文件位置:
    myeccOpti.listing = fopen("c:\\eccOpti.txt","w+");
    
	//调用公共表达式优化主函数:
	midcode = myeccOpti.ECCsave(midcode);

	//输出公共表达式优化结果到文件:
	fprintf(myeccOpti.listing, " >>公共表达式优化结果:\n");
	myeccOpti.PrintMidCode(midcode);

    //关闭结果文件:
	fclose(myeccOpti.listing);

	//在输出栏导入结果文件:
	this->OutPut("c:\\eccOpti.txt");

    DeleteFile("c:\\eccOpti.txt");

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

}

/*****************循环不变式优化:********************/
void CFaceView::OnOptiLoop() 
{
	//中间代码生成标志为假,不执行优化:
 if (!DOMIDCODEFLAG)
 {	 MessageBox("请先生成中间代码!");
     return;
 }

 	
    //定义结果文件位置:
    myloopOpti.listing = fopen("c:\\loopOpti.txt","w+");
    
	//调用循环不变式优化主函数:
	midcode = myloopOpti.LoopOpti(midcode);

	//输出循环不变式优化结果到文件:
	fprintf(myloopOpti.listing, " >>循环不变式优化结果:\n");
	myloopOpti.PrintMidCode(midcode);

    //关闭结果文件:
	fclose(myloopOpti.listing);

	//在输出栏导入结果文件:
	this->OutPut("c:\\loopOpti.txt");

    DeleteFile("c:\\loopOpti.txt");

	//添加复选按钮:
	b_OptiLoop_check=true;
    
	
}

/*************从中间代码生成目标代码函数:***************/
void CFaceView::OnMtdDemicode() 
{
 //中间代码生成标志为假,不能生成目标代码:
 if (!DOPARSEFLAG)
 {	 MessageBox("请先生成中间代码!");
     return;
 }
    
    //设置目标代码生成标志:
	if (!DODEMICODEFLAG)
			DODEMICODEFLAG = true;
	else
	{	MessageBox("请执行下一步!");
		return;
	}

	
    
		//指定目标文件名:
		codefile = "c:\\destcode.tm";

		//打开目标代码文件,输出文件名。
		mymidtodemi.code = fopen(codefile,"w+");
	    if(mymidtodemi.code==NULL)
		{
			CString  str ;
			str.Format("Unable to open %s\n",codefile);
		    MessageBox(str);
			return;
		}
		//生成目标代码,并写入文件
		mymidtodemi.codeGen(midcode,codefile);

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

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

}

//选择路径为:从语法树直接生成目标代码:
void CFaceView::OnCompileTreetodemi() 
{
	//若已经选择了有中间代码过程,则不允许此菜单项:
	if (SELMIDTODEMI)
	{
		MessageBox("已经选择从中间代码生成目标代码,请执行下一步!");
		return;

⌨️ 快捷键说明

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