?? 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 + -