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