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