📄 fc-interactive.cpp
字号:
#include "stdafx.h"
#include "FC.h"
#include "FCDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
void CFCDlg::On_AboutEdit()
{
m_source=m_strEdit;
m_iStatus=3;
m_strEdit="\
FC语言是C语言的一个子集,实现了C语言中的一些简单的功能。\r\n\
\r\n\
判断语句:if-else,其中else部分可有可无,并且else与其前边距\r\n\
其最近的且未配对的if匹配。\r\n\
循环语句:while,若条件永为真则可省略条件部分,写为while()\r\n\
do-while,循环体至少执行一次。\r\n\
开关语句:switch-case-default,只有整型值才能作为开关表达式\r\n\
,若case分支中没有用break语句跳出,程序流程将进入下一个case\r\n\
分支中,default分支只能出现在所有case分支后。\r\n\
判断语句、循环语句和开关语句可以嵌套使用,在各嵌套层中,可\r\n\
以使用continue结束最内层循环,使用break语句结束最内层循环或\r\n\
开关语句,另外可以使用return语句结束函数,可以使用exit语句\r\n\
结束程序。\r\n\
输入输出:使用input语句进行输入,output语句进行输出。\r\n\
\r\n\
一个程序中必须有且只能有一个void main()函数,程序将以此函数\r\n\
为运行起点!\r\n\
一个程序中至多能有32个函数,函数可以向前调用(即先定义后调\r\n\
用),也可以自递归调用!\r\n\
一个函数中至多能有16个参数,参数采用值调用!\r\n\
一个函数中至多能有128个标识符,不同函数间标识符可以重名,同\r\n\
一函数的同一嵌套层次内标识符不能重名,不同嵌套层次内标识符\r\n\
可以重名。\r\n\
一个标识符至多能有31个字符,必须是由字母或下划线打头,字母\r\n\
数字下划线构成的串;不区分大小写!\r\n\
\r\n\
字符串支持转义字符:\"\\n\"表示回车符,\"\\t\"表示横向制表符,\"\\\"\"\r\n\
表示双引号,\"\\\\\"表示\"\\\"字符,另外,字符串在行尾加入\"\\\"字符\r\n\
则可一个字符串分多行表示。\r\n\
\r\n\
数据类型有整型数(int)、实型数(double)、整型一维数组(int[])、\r\n\
实型一维数组(double[])。\r\n\
算术运算符有加(+)减(-)乘(*)除(/)余(%),余运算(%)的左右运算\r\n\
数必须都是整型数。\r\n\
比较运算符有等于(==)不等(!=)大于(>)大于等于(>=)小于(<)小于\r\n\
等于(<=)。\r\n\
逻辑运算符有与(&&)或(||)非(!)。\r\n\
\r\n\
编译器将忽视源代码中的所有空格、tab符、换行符、“//”开头的\r\n\
一行注释以及“/*”和“*/”括内的多行注释。\r\n\
\r\n\
程序中的变量与数组的初始值均为0,函数的默认返回值为0。\r\n";
((CEdit*)GetDlgItem(IDC_EDIT))->SetReadOnly(TRUE);
GetDlgItem(IDB_OPEN)->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("返回");
SetWindowText("FC 2.2 编辑说明");
}
void CFCDlg::On_AboutGrm()
{
m_source=m_strEdit;
m_iStatus=3;
m_strEdit="\
<程序> ::={<函数>}\r\n\
<函数> ::=<类型><标识符> \"(\" [<类型><标识符>{,<类型><标识符>}] \")\" \"{\" {语句} \"}\"\r\n\
<语句> ::=<定义语句> |\r\n\
<输入语句> |\r\n\
<输出语句> |\r\n\
<选择语句> |\r\n\
<循环语句> |\r\n\
<重复语句> |\r\n\
<开关语句> |\r\n\
<赋值语句> |\r\n\
<复合语句> |\r\n\
<函数调用>; |\r\n\
<特殊语句>\r\n\
<定义语句>::=<类型><标识符>[( \"=\" <表达式>) | ( \"[\" <表达式> \"]\" )]{,<类型><标识符>[( \"=\" <表达式>) | ( \"[\" <表达式> \"]\" )]};\r\n\
<输入语句>::=\"input\" <标识符>{,<标识符>};\r\n\
<输出语句>::=\"output\" <输出对象>{,<输出对象>};\r\n\
<选择语句>::=\"if\" \"(\" [<条件>] \")\" <语句>[ \"else\" <语句>]\r\n\
<循环语句>::=\"while\" \"(\" <条件> \")\" <语句>\r\n\
<重复语句>::=\"do\" <语句> \"while\" \"(\" <条件> \")\" \";\"\r\n\
<开关语句>::=\"switch\" \"(\"<表达式>\")\" \"{\"{开关分支>}[<开关缺省>]\r\n\
<开关分支>::=\"case\" <整数> \":\" {<语句>}\r\n\
<开关缺省>::=\"default\" \":\"{<语句>}\r\n\
<赋值语句>::=<标识符> \"=\" <表达式>;\r\n\
<复合语句>::=\"{\" {语句} \"}\"\r\n\
<函数调用>::=<标识符> \"(\" [<表达式>{,<表达式>}] \")\" \r\n\
<特殊语句>::=\"continue\" |\r\n\
\"break\" |\r\n\
\"exit\" |\r\n\
\"return\" [表达式];\r\n\
<类型> ::=\"int\" |\r\n\
\"double\"\r\n\
<标识符> ::=<字母>{<数字> | <字母>}\r\n\
<表达式> ::=[ \"+\" | \"-\" ]<项>{( \"+\" | \"-\" )<项>}\r\n\
<输出对象>::=<表达式> |\r\n\
<字符串>\r\n\
<项> ::=<因子>{( \"*\" | \"/\" | \"%\" )<因子>}\r\n\
<因子> ::=<标识符>[ \"[\" <表达式> \"]\" ] |\r\n\
<数> |\r\n\
\"(\" <表达式> \")\" |\r\n\
<函数调用> |\r\n\
( \"int\" | \"double\" ) \"(\" <表达式> \")\"\r\n\
<条件> ::=<条件与项>{ \"||\" <条件与项>}\r\n\
<条件与项>::=<条件子项>{ \"&&\" <条件子项>}\r\n\
<条件子项>::=[ \"!\" ] \"(\" <条件> \")\" |\r\n\
<表达式>( \"==\" | \"!=\" | \"<=\" | \"<\" | \">=\" | \">\" )<表达式>\r\n";
m_strEdit+="\
<字符串> ::=\"{任意可见字符 | 转义字符}\"\r\n\
<整数> ::={数字}\r\n\
<数> ::={数字}[ \".\" {数字}]\r\n\
<字母> ::=a|b|c|…|X|Y|Z\r\n\
<数字> ::=0|1|…|8|9\r\n";
((CEdit*)GetDlgItem(IDC_EDIT))->SetReadOnly(TRUE);
GetDlgItem(IDB_OPEN)->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("返回");
SetWindowText("FC 2.2 语法说明");
}
void CFCDlg::On_Compile()
{
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=2;
m_strEdit="";
((CEdit*)GetDlgItem(IDC_EDIT))->SetReadOnly(TRUE);
GetDlgItem(IDB_SAVE_AS)->SetWindowText("保存结果");
GetDlgItem(IDB_RUN)->SetWindowText("执行");
GetDlgItem(IDB_CLEAR)->SetWindowText("清空");
GetDlgItem(IDC_STATIC_PRECISION)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_PRECISION)->ShowWindow(SW_SHOW);
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_bCompiled && m_iErrorCount==0)
{
m_strEdit="";
UpdateData(FALSE);
Interpret();
}
else if(m_iStatus==2)
{
m_strEdit.Format("源代码中发现 %d 处错误,无法解释执行,请修正源代码\r\n",m_iErrorCount);
UpdateData(FALSE);
}
}
void CFCDlg::On_Exit()
{
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;
}
}
CDialog::OnCancel();
}
void CFCDlg::On_ExitAbout()
{
m_iStatus=1;
m_strEdit=m_source;
((CEdit*)GetDlgItem(IDC_EDIT))->SetReadOnly(FALSE);
GetDlgItem(IDB_OPEN)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_SAVE_AS)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_RUN)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_CLEAR)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_POSITION)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_SET_POSITION)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_TRANSLATE)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_ABOUT_EDIT)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_ABOUT_GRM)->ShowWindow(SW_SHOW);
GetDlgItem(ID_APP_ABOUT)->ShowWindow(SW_SHOW);
GetDlgItem(IDCANCEL)->SetWindowText("退出");
CString WindowText="FC 2.2";
if(m_strFile!="")
WindowText+=" - "+m_strFile;
if(!m_bSaved)
WindowText+=" *";
SetWindowText(WindowText);
}
void CFCDlg::On_ExitCompile()
{
m_iStatus=1;
m_strEdit=m_source;
((CEdit*)GetDlgItem(IDC_EDIT))->SetReadOnly(FALSE);
GetDlgItem(IDB_SAVE_AS)->SetWindowText("另存为");
GetDlgItem(IDB_RUN)->SetWindowText("编译执行");
GetDlgItem(IDB_CLEAR)->SetWindowText("新建");
GetDlgItem(IDC_STATIC_PRECISION)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_PRECISION)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_POSITION)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_SET_POSITION)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_TRANSLATE)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_ABOUT_EDIT)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_ABOUT_GRM)->ShowWindow(SW_SHOW);
GetDlgItem(ID_APP_ABOUT)->ShowWindow(SW_SHOW);
GetDlgItem(IDCANCEL)->SetWindowText("退出");
CString WindowText="FC 2.2";
if(m_strFile!="")
WindowText+=" - "+m_strFile;
if(!m_bSaved)
WindowText+=" *";
SetWindowText(WindowText);
}
void CFCDlg::On_ExitTranslate()
{
m_iStatus=1;
m_strEdit=m_source;
((CEdit*)GetDlgItem(IDC_EDIT))->SetReadOnly(FALSE);
GetDlgItem(IDB_OPEN)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_SAVE)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_SAVE_AS)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_RUN)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_CLEAR)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_POSITION)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_SET_POSITION)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_TRANSLATE)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_ABOUT_EDIT)->ShowWindow(SW_SHOW);
GetDlgItem(IDB_ABOUT_GRM)->ShowWindow(SW_SHOW);
GetDlgItem(ID_APP_ABOUT)->ShowWindow(SW_SHOW);
GetDlgItem(IDCANCEL)->SetWindowText("退出");
CString WindowText="FC 2.2";
if(m_strFile!="")
WindowText+=" - "+m_strFile;
if(!m_bSaved)
WindowText+=" *";
SetWindowText(WindowText);
}
void CFCDlg::On_Interpret()
{
if(m_bCompiled && m_iErrorCount==0)
{
m_strEdit="";
UpdateData(FALSE);
Interpret();
}
else
{
m_strEdit.Format("源代码中发现 %d 处错误,无法解释执行,请修正源代码\r\n",m_iErrorCount);
UpdateData(FALSE);
}
}
void CFCDlg::On_OpenCode()
{
int i,t;
char ch;
CString FileName;
CFileDialog dlg(TRUE,"fcr",NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"FC中间代码文件 (*.fcr)|*.fcr||");
if(dlg.DoModal()!=IDOK)
return;
FileName=dlg.GetFileName();
CFile fin(FileName,CFile::modeRead);
char buf[5];
fin.Read(buf,4);
if(buf[0]!='F' || buf[1]!='C' || buf[2]!='R')
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -