📄 faceview.cpp
字号:
}
//语义分析标志为假,不能生成目标代码:
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 + -