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

📄 fc-interactive.cpp

📁 编译原理的一个课程设计
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -