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

📄 fc-interactive.cpp

📁 编译原理的一个课程设计
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		MessageBox("错误的 FCR 中间代码文件!","FC 2.2",MB_OK|MB_ICONEXCLAMATION);
		return;
	}
	else
	{
		if(buf[3]<20)
		{
			MessageBox("未知的 FCR 中间代码文件版本!","FC 2.2",MB_OK|MB_ICONEXCLAMATION);
			return;
		}
		else if(buf[3]<22)
		{
			MessageBox("不兼容的 FCR 中间代码文件版本!","FC 2.2",MB_OK|MB_ICONEXCLAMATION);
			return;
		}
		if(buf[3]>22)
		{
			MessageBox(
				"无法打开 "+FileName+" !\n请使用高版本的 FCR 解释器解释执行 "+FileName+" .",
				"FC 2.2",MB_OK|MB_ICONEXCLAMATION);
			return;
		}
	}
	fin.Read(&m_iCode,4);
	for(i=0;i<m_iCode;i++)
	{
		fin.Read(&ch,sizeof(char));
		m_code[i].op=(ZOperator)ch;
		switch(m_code[i].op)
		{
		case OP_OUTPUTS://不定长字符串
			fin.Read(&t,4);
			m_code[i].sd.string=new char[t+1];
			fin.Read(m_code[i].sd.string,t);
			m_code[i].sd.string[t]='\0';
			break;
		case OP_LOADCONSTD://8字节*1
			fin.Read(&m_code[i].sd.dNumber,sizeof(double));
			break;
		case OP_PARAMTRANSD:case OP_PARAMTRANSI://8字节*2
			fin.Read(&m_code[i].sd.iNumber,sizeof(int));
			fin.Read(&m_code[i].sd.nParam,sizeof(int));
			break;
		case OP_JUMPC:case OP_JUMP:case OP_LOADCONSTI:
		case OP_LOADVARI:case OP_LOADVARD:case OP_SAVEI:
		case OP_SAVED:case OP_INPUTI:case OP_INPUTD:
		case OP_RETURNI:case OP_RETURND:case OP_RETURN:
		case OP_NULL:case OP_I2D:case OP_D2I:
		case OP_CALL:case OP_NEWARRAYI:case OP_NEWARRAYD:
		case OP_SAVEARRAYI:case OP_SAVEARRAYD:
		case OP_LOADARRAYI:case OP_LOADARRAYD:
		case OP_DELARRAYI:case OP_DELARRAYD:
		case OP_INPUTARRAYI:case OP_INPUTARRAYD://4字节*26
			fin.Read(&m_code[i].sd.iNumber,sizeof(int));
			break;
		/*
		case OP_COPYI:case OP_COPYD:case OP_DELETE:
		case OP_EXIT:case OP_AND:case OP_OR:
		case OP_NOT:case OP_OUTPUTI:case OP_OUTPUTD:
		case OP_CHANGESIGNALI:case OP_CHANGESIGNALD:
		case OP_PLUSI:case OP_PLUSD:case OP_MINUSI:
		case OP_MINUSD:case OP_TIMESI:case OP_TIMESD:
		case OP_SLASHI:case OP_SLASHD:case OP_MOD:
		case OP_EQUALI:case OP_EQUALD:case OP_NOTEQUALI:
		case OP_NOTEQUALD:case OP_LESSI:case OP_LESSD:
		case OP_LESSEQUALI:case OP_LESSEQUALD:
		case OP_GREATI:case OP_GREATD:case OP_GREATEQUALI:
		case OP_GREATEQUALD://0字节*29
			break;//*/
		}
	}
	fin.Close();
	SetWindowText("FC 2.2 解释器 - "+FileName);
	m_bCompiled=TRUE;
	m_iErrorCount=0;
	m_strEdit="";
	UpdateData(FALSE);
}

void CFCDlg::On_OpenSource()
{
	if(!m_bSaved)
	{
		CString message;
		if(m_strFile=="")
			message="源代码没有保存,要保存吗?";
		else
			message=m_strFile+" 的内容已经改变,要保存吗?";
		switch(MessageBox(message,"FC 2.2",MB_YESNOCANCEL|MB_ICONQUESTION))
		{
		case IDYES:
			On_SaveSource();
			break;
		case IDNO:
			break;
		case IDCANCEL:
			return;
		}
	}
	CFileDialog dlg(TRUE,"txt",m_strFile,
		OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
		"文本文件 (*.txt)|*.txt|任意文件 (*.*)|*.*||");
	if(dlg.DoModal()!=IDOK)
		return;
	m_strFile=dlg.GetFileName();
	m_strEdit="";
	CFile fin(m_strFile,CFile::modeRead);
	char buf[1025];
	int length;
	do
	{
		length=fin.Read(buf,1024);
		buf[length]='\0';
		m_strEdit+=buf;
	}
	while(length==1024);
	fin.Close();
	SetWindowText("FC 2.2 - "+m_strFile);
	m_bSaved=TRUE;
}

void CFCDlg::On_SaveAbout()
{
	CString FileName;
	GetWindowText(FileName);
	CFileDialog dlg(FALSE,"txt",FileName+".txt",
		OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
		"文本文件 (*.txt)|*.txt|任意文件 (*.*)|*.*||");
	if(dlg.DoModal()!=IDOK)
		return;
	FileName=dlg.GetFileName();
	CFile fout(FileName,CFile::modeWrite|CFile::modeCreate);
	fout.Write(m_strEdit,m_strEdit.GetLength());
	fout.Close();
}

void CFCDlg::On_SaveAsSource()
{
	CFileDialog dlg(FALSE,"txt",m_strFile,
		OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
		"文本文件 (*.txt)|*.txt|任意文件 (*.*)|*.*||");
	if(dlg.DoModal()!=IDOK)
		return;
	m_strFile=dlg.GetFileName();
	CFile fout(m_strFile,CFile::modeWrite|CFile::modeCreate);
	fout.Write(m_strEdit,m_strEdit.GetLength());
	fout.Close();
	SetWindowText("FC 2.2 - "+m_strFile);
	m_bSaved=TRUE;
}

void CFCDlg::On_SaveCode()
{
	if(!m_bCompiled)
		return;
	int i,t;
	char ch;
	CString FileName;
	for(i=m_strFile.GetLength()-1;i>=0;i--)
		if(m_strFile[i]=='.' || m_strFile[i]=='\\' || m_strFile[i]=='/')
			break;
	if(i<0)
		FileName=m_strFile;
	else if(m_strFile[i]=='.')
		FileName=m_strFile.Left(i);
	else
		FileName=m_strFile;
	CFileDialog dlg(FALSE,"fcr",FileName+".fcr",
		OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
		"FC中间代码文件 (*.fcr)|*.fcr||");
	if(dlg.DoModal()!=IDOK)
		return;
	FileName=dlg.GetFileName();
	CFile fout(FileName,CFile::modeCreate|CFile::modeWrite);
	char buf[5]="FCR ";
	buf[3]=(char)22;//版本2.2
	fout.Write(buf,4);
	fout.Write(&m_iCode,4);
	for(i=0;i<m_iCode;i++)
	{
		ch=(char)m_code[i].op;
		fout.Write(&ch,sizeof(char));
		switch(m_code[i].op)
		{
		case OP_OUTPUTS://不定长字符串
			t=(int)strlen(m_code[i].sd.string);
			fout.Write(&t,4);
			fout.Write(m_code[i].sd.string,t);
			break;
		case OP_LOADCONSTD://8字节*1
			fout.Write(&m_code[i].sd.dNumber,sizeof(double));
			break;
		case OP_PARAMTRANSD:case OP_PARAMTRANSI://8字节*2
			fout.Write(&m_code[i].sd.iNumber,sizeof(int));
			fout.Write(&m_code[i].sd.nParam,sizeof(int));
			break;
		case OP_JUMPC:case OP_JUMP:case OP_LOADCONSTI:
		case OP_LOADVARI:case OP_LOADVARD:case OP_SAVEI:
		case OP_SAVED:case OP_INPUTI:case OP_INPUTD:
		case OP_RETURNI:case OP_RETURND:case OP_RETURN:
		case OP_NULL:case OP_I2D:case OP_D2I:
		case OP_CALL:case OP_NEWARRAYI:case OP_NEWARRAYD:
		case OP_SAVEARRAYI:case OP_SAVEARRAYD:
		case OP_LOADARRAYI:case OP_LOADARRAYD:
		case OP_DELARRAYI:case OP_DELARRAYD:
		case OP_INPUTARRAYI:case OP_INPUTARRAYD://4字节*26
			fout.Write(&m_code[i].sd.iNumber,sizeof(int));
			break;
		/*
		case OP_COPYI:case OP_COPYD:case OP_DELETE:
		case OP_EXIT:case OP_AND:case OP_OR:
		case OP_NOT:case OP_OUTPUTI:case OP_OUTPUTD:
		case OP_CHANGESIGNALI:case OP_CHANGESIGNALD:
		case OP_PLUSI:case OP_PLUSD:case OP_MINUSI:
		case OP_MINUSD:case OP_TIMESI:case OP_TIMESD:
		case OP_SLASHI:case OP_SLASHD:case OP_MOD:
		case OP_EQUALI:case OP_EQUALD:case OP_NOTEQUALI:
		case OP_NOTEQUALD:case OP_LESSI:case OP_LESSD:
		case OP_LESSEQUALI:case OP_LESSEQUALD:
		case OP_GREATI:case OP_GREATD:case OP_GREATEQUALI:
		case OP_GREATEQUALD://0字节*29
			break;//*/
		}
	}
	fout.Close();
	SetWindowText("FC 2.2 解释器 - "+FileName);
}

void CFCDlg::On_SaveResult()
{
	CString FileName;
	for(int i=m_strFile.GetLength()-1;i>=0;i--)
		if(m_strFile[i]=='.' || m_strFile[i]=='\\' || m_strFile[i]=='/')
			break;
	if(i<0)
		FileName=m_strFile;
	else if(m_strFile[i]=='.')
		FileName=m_strFile.Left(i);
	else
		FileName=m_strFile;
	FileName+=" 运行结果.txt";
	CFileDialog dlg(FALSE,"txt",FileName,
		OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
		"文本文件 (*.txt)|*.txt|任意文件 (*.*)|*.*||");
	if(dlg.DoModal()!=IDOK)
		return;
	FileName=dlg.GetFileName();
	CFile fout(FileName,CFile::modeWrite|CFile::modeCreate);
	fout.Write(m_strEdit,m_strEdit.GetLength());
	fout.Close();
}

void CFCDlg::On_SaveSource()
{
	if(m_strFile=="")
	{
		CFileDialog dlg(FALSE,"txt",m_strFile,
			OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
			"文本文件 (*.txt)|*.txt|任意文件 (*.*)|*.*||");
		if(dlg.DoModal()!=IDOK)
			return;
		m_strFile=dlg.GetFileName();
		SetWindowText("FC 2.2 - "+m_strFile);
	}
	CFile fout(m_strFile,CFile::modeWrite|CFile::modeCreate);
	fout.Write(m_strEdit,m_strEdit.GetLength());
	fout.Close();
	SetWindowText("FC 2.2 - "+m_strFile);
	m_bSaved=TRUE;
}

void CFCDlg::On_Translate()
{
	if(!m_bSaved)
	{
		CString message="翻译前要进行语法检查。";
		if(m_strFile=="")
			message+="源代码没有保存,要保存吗?";
		else
			message+=m_strFile+" 的内容已经改变,要保存吗?";
		switch(MessageBox(message,"FC 2.2",MB_YESNOCANCEL|MB_ICONQUESTION))
		{
		case IDYES:
			On_SaveSource();
			break;
		case IDNO:
			break;
		case IDCANCEL:
			return;
		}
	}
	m_source=m_strEdit;
	m_SourceLength=m_source.GetLength();
	m_iStatus=4;
	m_strEdit="";
	((CEdit*)GetDlgItem(IDC_EDIT))->SetReadOnly(TRUE);
	GetDlgItem(IDB_OPEN)->ShowWindow(SW_HIDE);
	GetDlgItem(IDB_SAVE)->ShowWindow(SW_HIDE);
	GetDlgItem(IDB_SAVE_AS)->ShowWindow(SW_HIDE);
	GetDlgItem(IDB_RUN)->ShowWindow(SW_HIDE);
	GetDlgItem(IDB_CLEAR)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_STATIC_PRECISION)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_PRECISION)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_POSITION)->ShowWindow(SW_HIDE);
	GetDlgItem(IDB_SET_POSITION)->ShowWindow(SW_HIDE);
	GetDlgItem(IDB_TRANSLATE)->ShowWindow(SW_HIDE);
	GetDlgItem(IDB_ABOUT_EDIT)->ShowWindow(SW_HIDE);
	GetDlgItem(IDB_ABOUT_GRM)->ShowWindow(SW_HIDE);
	GetDlgItem(ID_APP_ABOUT)->ShowWindow(SW_HIDE);
	GetDlgItem(IDCANCEL)->SetWindowText("返回");
	if(m_strFile=="")
		SetWindowText("FC 2.2 编译器");
	else
		SetWindowText("FC 2.2 编译器 - "+m_strFile);
	if(Compile())
		m_bCompiled=TRUE;
	if(m_iStatus==4)
	{
		On_ExitTranslate();
		UpdateData(FALSE);
		if(m_bCompiled && m_iErrorCount==0)
			Translate();
		else
		{
			CString message;
			message.Format("源代码中发现 %d 处错误,无法翻译为C++语言,请修正源代码\r\n",m_iErrorCount);
			MessageBox(message,"FC 2.2",MB_OK|MB_ICONEXCLAMATION);
		}
	}
}

⌨️ 快捷键说明

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