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

📄 fc-translate.cpp

📁 编译原理的一个课程设计
💻 CPP
字号:
#include "stdafx.h"
#include "FC.h"
#include "FCDlg.h"
#include "FCTranslateDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

void CFCDlg::Translate(void)
{
	CFCTranslateDlg dlg;
	dlg.m_bBlankLine	=m_bBlankLine;
	dlg.m_bExitWait		=m_bExitWait;
	dlg.m_bOpSpace		=m_bOpSpace;
	dlg.m_bOutPrecision	=m_bOutPrecision;
	dlg.m_bOutRuntime	=m_bOutRuntime;
	dlg.m_iBackChoice	=m_iBackChoice;
	dlg.m_strBack.Format("%d",m_iBack);
	if(m_strCppFile!="")
	{
		for(int i=m_strCppFile.GetLength()-1;i>=0;i--)
			if(m_strCppFile[i]=='.' || m_strCppFile[i]=='/' || m_strCppFile[i]=='\\')
				break;
		if(i<0)
			dlg.m_strObjectFile=m_strCppFile+".cpp";
		else if(m_strCppFile[i]=='.')
			dlg.m_strObjectFile=m_strCppFile.Left(i)+".cpp";
		else
			dlg.m_strObjectFile=m_strCppFile+".cpp";
	}
	if(dlg.DoModal()!=IDOK)
		return;
	m_bBlankLine	=dlg.m_bBlankLine;
	m_bExitWait		=dlg.m_bExitWait;
	m_bOpSpace		=dlg.m_bOpSpace;
	m_bOutPrecision	=dlg.m_bOutPrecision;
	m_bOutRuntime	=dlg.m_bOutRuntime;
	m_iBack			=atoi(dlg.m_strBack);
	m_iBackChoice	=dlg.m_iBackChoice;
	m_strCppFile	=dlg.m_strObjectFile;

	m_nCurNumber=0;		//当前整数
	m_dCurNumber=0.0;	//当前实数
	m_curElement=E_NULL;//当前ZElement
	m_iCount=0;			//源代码字符计数
	m_iLine=0;			//源代码行计数
	m_iLevel=0;

	m_fout.open(m_strCppFile);
	m_fout<<"// "<<m_strCppFile<<"\n";
	if(m_strFile=="")
		m_fout<<"// FC2.2 翻译产生\n";
	else
		m_fout<<"// FC2.2 翻译 “"<<m_strFile<<"” 产生\n";
	m_fout<<"// 版权所有 ZKF 2003.05\n";
	m_fout<<"\n";
	m_fout<<"// 注意:请检查所定义的数组的长度,若不是定值请改写为动态申请形式\n";
	m_fout<<"\n";
	m_fout<<"#include <iostream.h>\n";
	m_fout<<"#include <stdlib.h>\n";
	if(m_bOutRuntime)
	{
		m_fout<<"#include <time.h>\n";
		m_fout<<"\n";
		m_fout<<"// 下边两个全局变量用以统计程序运行时间;\n";
		m_fout<<"// 若main函数中使用了return语句或程序中调用了exit()函数,将无法统计程序运行时间;\n";
		m_fout<<"// 如果不需要统计程序运行时间,请删除下一行,并删除程序中使用了这两个变量的所有语句\n";
		m_fout<<"clock_t tStart,tElapse;\n";
	}
	if(!m_bBlankLine)
		m_fout<<"\n";

	if(!GetElement())//获取第一个函数的返回类型
		return;
	while(1)//循环处理函数
	{
		if(m_curElement==E_FILEEND)
			break;
		if(m_bBlankLine)
			m_fout<<"\n";
		TrsFunction();//获取第一个函数的返回类型
	}
	m_fout.close();
	MessageBox("“"+m_strFile+"” 已经成功的翻译到 “"+m_strCppFile+"”。","FC 2.2",MB_OK|MB_ICONINFORMATION);
}

void CFCDlg::TrsFunction(void)
{
	switch(m_curElement)
	{
	case E_VOID:
		m_fout<<"void ";
		break;
	case E_INT:
		m_fout<<"int ";
		break;
	case E_DOUBLE:
		m_fout<<"double ";
		break;
	}
	GetElement();//获取函数名
	m_fout<<m_curIdent;
	m_bMainFunction= (strcmp(m_curIdent,"main")==0);
	GetElement();//获取“(”
	m_fout<<"(";
	GetElement();//获取第一个函数参数的类型或“)”
	if(m_curElement==E_RPAREN)
		m_fout<<"void";
	else
	{
		while(1)
		{
			switch(m_curElement)
			{
			case E_INT:
				m_fout<<"int ";
				break;
			case E_DOUBLE:
				m_fout<<"double ";
				break;
			}
			GetElement();//获取参数名
			m_fout<<m_curIdent;
			GetElement();//获取“,”或“)”
			if(m_curElement==E_RPAREN)
				break;
			m_fout<<",";
			GetElement();//获取参数类型
		}
	}
	m_fout<<")\n";
	GetElement();//获取“{”
	TrsMultStat();
}

void CFCDlg::TrsStatement()
{
	switch(m_curElement)
	{
	case E_OUTPUT:
		TrsOutput();
		break;
	case E_INPUT:
		TrsInput();
		break;
	case E_INT:
	case E_DOUBLE:
		TrsDefine();
		break;
	case E_CONTINUE:
	case E_BREAK:
	case E_EXIT:
	case E_RETURN:
		TrsSpecial();
		break;
	case E_IF:
		TrsIf();
		break;
	case E_WHILE:
		TrsWhile();
		break;
	case E_DO:
		TrsDoWhile();
		break;
	case E_SWITCH:
		TrsSwitch();
		break;
	case E_BEGIN:
		TrsMultStat();
		break;
	case E_IDENT:
		SpaceBack();
		m_fout<<m_curIdent;
		GetElement();
		if(m_curElement==E_LPAREN)
		{
			TrsParameter();
			m_fout<<";\n";
			GetElement();
			break;
		}
		if(m_curElement==E_LSUB)
		{
			m_fout<<"[";
			GetElement();
			TrsExpression();
			m_fout<<"]";
			GetElement();
		}
		OutOperator("=");
		GetElement();
		TrsExpression();
		m_fout<<";\n";
		GetElement();
		break;
	}
}

void CFCDlg::TrsMultStat()
{
	SpaceBack();
	m_fout<<"{\n";
	m_iLevel++;
	if(m_bMainFunction)
	{
		m_bMainFunction=FALSE;
		if(m_bOutPrecision)
		{
			SpaceBack();
			m_fout<<"// 下一行设置输出精度,如果需要,可以将括号内的";
			m_fout<<m_strPrecision<<"改为0到15的任意整数值\n";
			SpaceBack();
			m_fout<<"cout.precision("<<m_strPrecision<<");\n\n";
		}
		if(m_bOutRuntime)
		{
			SpaceBack();
			m_fout<<"// 下两行初始化程序运行计时\n";
			SpaceBack();
			m_fout<<"::tStart=clock();\n";
			SpaceBack();
			m_fout<<"::tElapse=0;\n";
			m_fout<<"\n";
		}
		GetElement();
		while(m_curElement!=E_END)
			TrsStatement();
		if(m_bOutRuntime)
		{
			m_fout<<"\n";
			SpaceBack();
			m_fout<<"// 输出程序用时统计结果\n";
			SpaceBack();
			m_fout<<"cout<<\"\\n程序执行用时 \"<<clock()+::tElapse-::tStart<<\" 毫秒\\n\";\n";
		}
		if(m_bExitWait)
		{
			m_fout<<"\n";
			SpaceBack();
			m_fout<<"// 下三行的作用是在程序结束前等待用户输入任意字符,\n";
			SpaceBack();
			m_fout<<"// 以方便用户查看程序运行结果,如不需要,请删除之\n";
			SpaceBack();
			m_fout<<"cout<<\"\\n\";\n";
			SpaceBack();
			m_fout<<"cout.flush();\n";
			SpaceBack();
			m_fout<<"system(\"pause\");\n";
		}
		m_iLevel--;
		SpaceBack();
		m_fout<<"}\n";
		m_bMainFunction=FALSE;
	}
	else
	{
		GetElement();
		while(m_curElement!=E_END)
			TrsStatement();
		m_iLevel--;
		SpaceBack();
		m_fout<<"}\n";
	}
	GetElement();
}

void CFCDlg::TrsOutput()
{
	SpaceBack();
	m_fout<<"cout";
	OutOperator("<<");
	while(1)
	{
		GetElement();
		if(m_curElement==E_STRING)
		{
			m_fout<<"\"";
			int i,length=m_curString.GetLength();
			for(i=0;i<length;i++)
			{
				switch(m_curString[i])
				{
				case '\"':
					m_fout<<"\\\"";
					break;
				case '\r':
					break;
				case '\n':
					m_fout<<"\\n";
					break;
				case '\\':
					m_fout<<"\\\\";
					break;
				default:
					m_fout<<m_curString[i];
					break;
				}
			}
			m_fout<<"\"";
			GetElement();
		}
		else
			TrsExpression();
		if(m_curElement==E_SEMICOLON)
			break;
		OutOperator("<<");
	}
	m_fout<<";\n";
	GetElement();
}

void CFCDlg::TrsDefine()
{
	SpaceBack();
	switch(m_curElement)
	{
	case E_INT:
		m_fout<<"int ";
		break;
	case E_DOUBLE:
		m_fout<<"double ";
		break;
	}
	GetElement();
	while(1)
	{
		m_fout<<m_curIdent;
		GetElement();
		switch(m_curElement)
		{
		case E_BECOMES:
			OutOperator("=");
			GetElement();
			TrsExpression();
			break;
		case E_LSUB:
			m_fout<<"[";
			GetElement();
			TrsExpression();
			m_fout<<"]={0}";
			GetElement();
			break;
		default:
			OutOperator("=");
			m_fout<<"0";
			break;
		}
		if(m_curElement==E_SEMICOLON)
			break;
		m_fout<<",";
		GetElement();
	}
	m_fout<<";\n";
	GetElement();
}

void CFCDlg::TrsInput()
{
	if(m_bOutRuntime)
	{
		SpaceBack();
		m_fout<<"::tElapse+=clock()-::tStart;\n";
	}
	SpaceBack();
	m_fout<<"cin";
	OutOperator(">>");
	GetElement();
	while(1)
	{
		m_fout<<m_curIdent;
		GetElement();
		if(m_curElement==E_LSUB)
		{
			m_fout<<"[";
			TrsExpression();
			m_fout<<"]";
			GetElement();
		}
		if(m_curElement==E_SEMICOLON)
			break;
		OutOperator(">>");
		GetElement();
	}
	m_fout<<";\n";
	if(m_bOutRuntime)
	{
		SpaceBack();
		m_fout<<"::tStart=clock();\n";
	}
	GetElement();
}

void CFCDlg::TrsExpression()
{
	switch(m_curElement)
	{
	case E_MINUS:
		OutOperator("-");
		//此处没有break
	case E_PLUS:
		GetElement();
		break;
	}
	TrsTerm();
	while(m_curElement==E_MINUS || m_curElement==E_PLUS)
	{
		switch(m_curElement)
		{
		case E_MINUS:
			OutOperator("-");
			break;
		case E_PLUS:
			OutOperator("+");
			break;
		}
		GetElement();
		TrsTerm();
	}
}

void CFCDlg::TrsTerm()
{
	while(1)
	{
		TrsFactor();
		switch(m_curElement)
		{
		case E_TIMES:
			OutOperator("*");
			break;
		case E_SLASH:
			OutOperator("/");
			break;
		case E_MOD:
			OutOperator("%");
			break;
		default:return;
		}
		GetElement();
	}
}

void CFCDlg::TrsFactor()
{
	switch(m_curElement)
	{
	case E_INUMBER:
		m_fout<<m_nCurNumber;
		GetElement();
		break;
	case E_DNUMBER:
		m_fout<<m_dCurNumber;
		GetElement();
		break;
	case E_INT:
	case E_DOUBLE:
		if(m_curElement==E_INT)
			m_fout<<"(int)";
		else
			m_fout<<"(double)";
		GetElement();
		//此处不需要break
	case E_LPAREN:
		m_fout<<"(";
		GetElement();
		TrsExpression();
		m_fout<<")";
		GetElement();
		break;
	case E_IDENT:/*//*/
		m_fout<<m_curIdent;
		GetElement();
		if(m_curElement==E_LSUB)
		{
			m_fout<<"[";
			GetElement();
			TrsExpression();
			m_fout<<"]";
			GetElement();
		}
		else if(m_curElement==E_LPAREN)
			TrsParameter();
		break;
	}
}

void CFCDlg::TrsParameter()
{
	m_fout<<"(";
	GetElement();
	while(1)
	{
		TrsExpression();
		if(m_curElement==E_RPAREN)
			break;
		m_fout<<",";
		GetElement();
	}
	m_fout<<")";
	GetElement();
}

void CFCDlg::TrsSpecial(void)
{
	SpaceBack();
	switch(m_curElement)
	{
	case E_BREAK:
		m_fout<<"break;\n";
		GetElement();
		GetElement();
		break;
	case E_CONTINUE:
		m_fout<<"continue;\n";
		GetElement();
		GetElement();
		break;
	case E_EXIT:
		m_fout<<"exit(0);\n";
		GetElement();
		GetElement();
		break;
	case E_RETURN:
		GetElement();
		if(m_curElement==E_SEMICOLON)
			m_fout<<"return;\n";
		else
		{
			m_fout<<"return ";
			TrsExpression();
			m_fout<<";\n";
		}
		GetElement();
		break;
	}
}

void CFCDlg::TrsIf()
{
	SpaceBack();
	m_fout<<"if(";
	GetElement();
	GetElement();
	TrsCondition();
	m_fout<<")\n";
	GetElement();
	if(m_curElement==E_BEGIN)
		TrsMultStat();
	else
	{
		m_iLevel++;
		TrsStatement();
		m_iLevel--;
	}
	if(m_curElement!=E_ELSE)
		return;
	SpaceBack();
	m_fout<<"else\n";
	GetElement();
	if(m_curElement==E_BEGIN)
		TrsStatement();
	else
	{
		m_iLevel++;
		TrsStatement();
		m_iLevel--;
	}
}

void CFCDlg::TrsCondition()
{
	while(1)
	{
		TrsAndCondition();
		if(m_curElement!=E_OR)
			return;
		m_fout<<" || ";
		GetElement();
	}
}

void CFCDlg::TrsAndCondition()
{
	while(1)
	{
		TrsSubCondition();
		if(m_curElement!=E_AND)
			return;
		m_fout<<" && ";
		GetElement();
	}
}

void CFCDlg::TrsSubCondition()
{
	if(m_curElement==E_NOT)
	{
		OutOperator("!");
		GetElement();
	}
	if(m_curElement==E_LPAREN)
	{
		m_fout<<"(";
		TrsCondition();
		m_fout<<")";
		GetElement();
	}
	else
	{
		TrsExpression();
		switch(m_curElement)
		{
		case E_EQUAL:
			OutOperator("==");
			break;
		case E_NOTEQUAL:
			OutOperator("!=");
			break;
		case E_LESS:
			OutOperator("<");
			break;
		case E_LESSEQUAL:
			OutOperator("<=");
			break;
		case E_GREAT:
			OutOperator(">");
			break;
		case E_GREATEQUAL:
			OutOperator(">=");
			break;
		}
		GetElement();
		TrsExpression();
	}
}

void CFCDlg::TrsWhile()
{
	SpaceBack();
	m_fout<<"while(";
	GetElement();
	GetElement();
	if(m_curElement==E_RPAREN)
		m_fout<<"1)\n";
	else
	{
		TrsCondition();
		m_fout<<")\n";
	}
	GetElement();
	if(m_curElement==E_BEGIN)
		TrsMultStat();
	else
	{
		m_iLevel++;
		TrsStatement();
		m_iLevel--;
	}
}

void CFCDlg::TrsDoWhile()
{
	SpaceBack();
	m_fout<<"do\n";
	GetElement();
	if(m_curElement==E_BEGIN)
		TrsMultStat();
	else
	{
		m_iLevel++;
		TrsStatement();
		m_iLevel--;
	}
	SpaceBack();
	m_fout<<"while(";
	GetElement();
	GetElement();
	TrsCondition();
	m_fout<<");\n";
	GetElement();
	GetElement();
}

void CFCDlg::TrsSwitch()
{
	SpaceBack();
	m_fout<<"switch(";
	GetElement();//获取(
	GetElement();//获取条件的第一个 ZElement
	TrsExpression();
	m_fout<<")\n";
	GetElement();//获取{
	SpaceBack();
	m_fout<<"{\n";
	m_iLevel++;
	GetElement();//获取case
	while(1)
	{
		if(m_curElement==E_CASE)
		{
			m_iLevel--;
			SpaceBack();
			m_fout<<"case ";
			GetElement();//获取case后的整数
			m_fout<<m_nCurNumber;
			GetElement();//获取冒号
			m_fout<<":\n";
			m_iLevel++;
			GetElement();
		}
		else if(m_curElement==E_DEFAULT)
		{
			m_iLevel--;
			SpaceBack();
			GetElement();//获取冒号
			m_fout<<"default:\n";
			m_iLevel++;
			GetElement();
		}
		else if(m_curElement==E_END)
		{
			m_iLevel--;
			SpaceBack();
			m_fout<<"}\n";
			GetElement();
			return;
		}
		else
			TrsStatement();
	}
}

void CFCDlg::OutOperator(char op[])
{
	if(m_bOpSpace)m_fout<<' ';
	m_fout<<op;
	if(m_bOpSpace)m_fout<<' ';
}

void CFCDlg::SpaceBack()
{
	int i;
	if(m_iBackChoice==0)
		for(i=m_iLevel;i>0;i--)
			m_fout<<'\t';
	else
		for(int i=m_iBack*m_iLevel;i>0;i--)
			m_fout<<' ';
}

⌨️ 快捷键说明

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