📄 fc-translate.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 + -