📄 fc-interactive.cpp
字号:
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 + -