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

📄 codeeditview.cpp

📁 一个用VC++开发的Pascal编译器. 包括词法分析 语法分析 语义分析 中间代码生成 对学习编译原理的同学有很大用途
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -