📄 codeeditview.cpp
字号:
// CodeEditView.cpp : implementation file
//
#include "stdafx.h"
#include "mini_Pascal.h"
#include "MainFrm.h"
#include "CodeEditView.h"
#include "Compiler.h"
#include "mini_PascalDoc.h"
#include "mini_PascalView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCodeEditView
IMPLEMENT_DYNCREATE(CCodeEditView, CEditView)
CCodeEditView::CCodeEditView()
{
OP[ 1 ] = "MOV";
OP[ 2 ] = "ADD";
OP[ 3 ] = "SUB";
OP[ 4 ] = "MUL";
OP[ 5 ] = "CMP";
OP[ 6 ] = "JMP";
OP[ 7 ] = "JNZ";
OP[ 8 ] = "JA";
OP[ 9 ] = "JB";
OP[ 10 ] = "JNB";
OP[ 11 ] = "JNA";
OP[ 12 ] = "JNE";
OP[ 13 ] = "JE";
HeaderMsg = "--------------------Configuration: mini_Pascal - Win32 Debug--------------------";
FooterMsg = "\r\nmini_Pascal.exe - ";
errornum = "";
resulttype = -5;
}
CCodeEditView::~CCodeEditView()
{
}
BEGIN_MESSAGE_MAP(CCodeEditView, CEditView)
//{{AFX_MSG_MAP(CCodeEditView)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_FILE_NEW, OnFileNew)
ON_COMMAND(ID_COMPILE, OnCompile)
ON_UPDATE_COMMAND_UI(ID_COMPILE, OnUpdateCompile)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCodeEditView drawing
void CCodeEditView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CCodeEditView diagnostics
#ifdef _DEBUG
void CCodeEditView::AssertValid() const
{
CEditView::AssertValid();
}
void CCodeEditView::Dump(CDumpContext& dc) const
{
CEditView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CCodeEditView message handlers
void CCodeEditView::OnFileOpen()
{
// TODO: Add your command handler code here
CFileDialog fdlg(TRUE,"mpl",NULL,OFN_FILEMUSTEXIST,
"miniPascal源文件(*.mpl)|*.mpl|所有文件(*.*)|*.*||",this);
fdlg.m_ofn.lpstrTitle="打开miniPascal源文件";
if (fdlg.DoModal()==IDOK)
{
SetFilePath(fdlg.GetPathName());
CFile file;
file.Open(GetFilePath(),CFile::modeRead);
char buf[10000];
int count = file.Read(buf, 10000);
buf[ count ] = 0 ;
SetWindowText( buf );
file.Close();
}
}
void CCodeEditView::SetFilePath(CString str)
{
m_cFilePath = str;
}
CString CCodeEditView::GetFilePath()
{
return m_cFilePath;
}
void CCodeEditView::OnFileNew()
{
// TODO: Add your command handler code here
CDocument* pDoc = GetDocument();
char buf[10000];
buf[0] = 0 ;
SetWindowText( buf );
// pDoc->m_sourcestr = buf;
}
CString CCodeEditView::GetStr()
{
char buf[10000];
int sz=GetWindowText(buf,10000);
buf[sz]=0;
return buf;
}
void CCodeEditView::OnCompile()
{
// TODO: Add your command handler code here
CMainFrame* pFrame = (CMainFrame*)::AfxGetMainWnd();
pFrame->m_pDualityView->Clear();
pFrame->m_pMsgView->Clear();
pFrame->m_FourModelView->Clear();
CString str = GetStr();
CCompiler m_cCompiler;
m_cCompiler.SetSourceStr(str);
m_IEOFM.clear();
pFrame->m_pMsgView->AddMsg(HeaderMsg);
pFrame->m_pMsgView->AddMsg("\r\nToken parsing......");
m_cCompiler.CiFa();
if (m_cCompiler.m_error == 0){//词法没有错误
for (int i=0; i<m_cCompiler.m_dModel.size(); i ++){
CString msg = "";
msg.Format("%d: (%-3d,%-5s,%-5d)",i+1,m_cCompiler.m_dModel[i].TokenType,
m_cCompiler.m_dModel[i].TokenString,
m_cCompiler.m_dModel[i].LineNo);
pFrame->m_pDualityView->AddMsg( msg );
}
pFrame->m_pMsgView->AddMsg("\r\nSyntax and Semantic parsing......");
m_cCompiler.YuFa();//进行语法分析
if(m_cCompiler.m_error == 2){//有语法错误给出错误明细表
errornum.Format("%d error(s), 0 warning(s)",m_cCompiler.m_eErrorTable.size());
OutErrorTableDetail(m_cCompiler);
}
else{//语法语义没有错误,输出四元式
OutFourModel(m_cCompiler.m_SymbolRecord,m_cCompiler.m_fourModel);
GenObj();
OutObj();
}
}
else{//存在词法错误给出错误明细表
errornum.Format("%d error(s), 0 warning(s)",m_cCompiler.m_eErrorTable.size());
OutErrorTableDetail(m_cCompiler);
}
if (errornum == "") errornum = "0 error(s), 0 warning(s)";
FooterMsg += errornum;
errornum = "";
pFrame->m_pMsgView->AddMsg(FooterMsg);
FooterMsg = "\r\nmini_Pascal.exe - ";
m_cCompiler.m_Variable.clear();
}
void CCodeEditView::OutSymbolRecord(vector<SymbolRecord> SymbolRecord)
{
CMainFrame* pFrame = (CMainFrame*)::AfxGetMainWnd();
for(int i=0; i<SymbolRecord.size(); i++){
CString SymbolRecordStr = "";
SymbolRecordStr.Format("record %d:TokenStr: %10s,type %d,location: %d,value :%d",i+1,SymbolRecord[i].TokenString,
SymbolRecord[i].TokenType,SymbolRecord[i].Location,
(int*)SymbolRecord[i].m_pValue);
pFrame->m_pMsgView->AddMsg(SymbolRecordStr);
}
}
void CCodeEditView::OutFourModel(vector<SymbolRecord> SymbolRecord,vector<QuadRuple> FourModel)
{
CMainFrame* pFrame = (CMainFrame*)::AfxGetMainWnd();
int a = FourModel.size();
int i = 1 ;
for(i=1; i<FourModel.size(); i++){
int OP = FourModel[ i ].OP;
m_iFourModel.OP = OP;
int arg1 = FourModel[ i ].arg1;
int arg2 = FourModel[ i ].arg2;
int result = FourModel[ i ].result;
CString Opstr = GetOp(OP);
CString strarg1 = GetArg1(OP,arg1,SymbolRecord);
m_iFourModel.arg1.Name = strarg1;
m_iFourModel.arg1.Type = arg1type;
CString strarg2 = GetArg2(OP,arg2,SymbolRecord);
m_iFourModel.arg2.Name = strarg2;
m_iFourModel.arg2.Type = arg2type;
CString resultstr = GetResult(OP,result,SymbolRecord);
m_iFourModel.result.Name = resultstr;
m_iFourModel.result.Type = resulttype;
m_IEOFM.push_back(m_iFourModel);
CString FourModel = "";
FourModel.Format("%5d:(%-10.8s,%-10.8s,%-10.8s,%-10.8s)",i,Opstr,strarg1,strarg2,resultstr);
pFrame->m_FourModelView->AddMsg(FourModel);
}
int a1 = m_IEOFM.size();
CString LastFourModel = "";
LastFourModel.Format("%5d:Halt",i);
pFrame->m_FourModelView->AddMsg(LastFourModel);
}
void CCodeEditView::OutErrorTableDetail(CCompiler m_cCompiler)
//输出错误明细表
{
CMainFrame* pFrame = (CMainFrame*)::AfxGetMainWnd();
for(int i=0; i<m_cCompiler.m_eErrorTable.size(); i++){
CString Detail = "";
switch(m_cCompiler.m_eErrorTable[ i ].ErrorType){
case Nonlicetchar://非法字符
{
char m_char;
int position = m_cCompiler.m_eErrorTable[ i ].Position;
m_char = m_cCompiler.m_sSourceStr[ position-1 ];
Detail.Format("unknown character (%-5c : %d)",m_char,m_char);
}
break;
case Nonlicetword://非法单词
{
CString m_word;
int position = m_cCompiler.m_eErrorTable[ i ].Position;
m_word = m_cCompiler.Nonlicetwords[ position ];
Detail.Format("Illegal word (%s)",m_word);
}
break;
case ProgramExpect://期待program
{
CString m_word;
int position = m_cCompiler.m_eErrorTable[ i ].Position;
m_word = m_cCompiler.m_dModel[ position ].TokenString;
if (m_word == ""){//说明不是标志符,也不是数字
m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
}
Detail.Format("program expected while '%s' found",m_word);
}
break;
case BeginExpect://
{
CString m_word;
int position = m_cCompiler.m_eErrorTable[ i ].Position;
m_word = m_cCompiler.m_dModel[ position ].TokenString;
if (m_word == ""){//说明不是标志符,也不是数字
m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
}
Detail.Format("begin expected while '%s' found",m_word);
}
break;
case EndExpect:
{
CString m_word;
int position = m_cCompiler.m_eErrorTable[ i ].Position;
if (position >= m_cCompiler.m_dModel.size()) m_word = "end of file";
else m_word = m_cCompiler.m_dModel[ position ].TokenString;
if (m_word == ""){//说明不是标志符,也不是数字
m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
}
Detail.Format("end expected while '%s' found",m_word);
}
break;
case VarExcept:
{
CString m_word;
int position = m_cCompiler.m_eErrorTable[ i ].Position;
m_word = m_cCompiler.m_dModel[ position ].TokenString;
if (m_word == ""){//说明不是标志符,也不是数字
m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
}
Detail.Format("var expected while '%s' found",m_word);
}
break;
case LeadTypeExcept:
{
CString m_word;
int position = m_cCompiler.m_eErrorTable[ i ].Position;
m_word = m_cCompiler.m_dModel[ position ].TokenString;
if (m_word == ""){//说明不是标志符,也不是数字
m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
}
Detail.Format("integer or real expected while '%s' found",m_word);
}
break;
case LeadSExcept:
{
CString m_word;
int position = m_cCompiler.m_eErrorTable[ i ].Position;
m_word = m_cCompiler.m_dModel[ position ].TokenString;
if (m_word == ""){//说明不是标志符,也不是数字
m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
}
Detail.Format("identifier or { or if or while expected while '%s' found",m_word);
}
break;
case LeadAExcept:
{
CString m_word;
int position = m_cCompiler.m_eErrorTable[ i ].Position;
m_word = m_cCompiler.m_dModel[ position ].TokenString;
if (m_word == ""){//说明不是标志符,也不是数字
m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
}
Detail.Format("identifier expected while '%s' found",m_word);
}
break;
case LeadAEExcept:
{
CString m_word;
int position = m_cCompiler.m_eErrorTable[ i ].Position;
m_word = m_cCompiler.m_dModel[ position ].TokenString;
if (m_word == ""){//说明不是标志符,也不是数字
m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
}
Detail.Format("'(' or identifier or INTNUM or REALNUM expected while '%s' found",m_word);
}
break;
case LeadTExcept:
{
CString m_word;
int position = m_cCompiler.m_eErrorTable[ i ].Position;
m_word = m_cCompiler.m_dModel[ position ].TokenString;
if (m_word == ""){//说明不是标志符,也不是数字
m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
}
Detail.Format("'(' or identifier or INTNUM or REALNUM expected while '%s' found",m_word);
}
break;
case LeadFExcept:
{
CString m_word;
int position = m_cCompiler.m_eErrorTable[ i ].Position;
m_word = m_cCompiler.m_dModel[ position ].TokenString;
if (m_word == ""){//说明不是标志符,也不是数字
m_word = TypeToStr(m_cCompiler.m_dModel[ position ].TokenType);
}
Detail.Format("'(' or identifier or INTNUM or REALNUM expected while '%s' found",m_word);
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -