?? fc-compile.cpp
字號:
{
int i,cnt=0,m=2*n+1;
for(i=1;i<m_iCode && cnt<m;i++)
if(m_code[i].op==OP_NULL)
cnt++;
return i-1;
}
int CFCDlg::IdentIndex(char ident[IDENTLENGTH])
{
int i;
if(m_iFunction>=0)
{
for(i=m_function[m_iFunction].iIdent;i>=0;i--)//查找變量列表
if(strcmp(ident,m_function[m_iFunction].ident[i].name)==0 && //標識符名相同
m_function[m_iFunction].ident[i].level>=0 )//變量在其作用域內(nèi)
return i+m_function[m_iFunction].iParam;
for(i=m_function[m_iFunction].iParam;i>=0;i--)//查找參數(shù)列表
if(strcmp(ident,m_function[m_iFunction].param[i].name)==0)
return i;
}
return -1;
}
int CFCDlg::FunctionIndex(char ident[IDENTLENGTH])
{
for(int i=m_iFunction;i>=0;i--)
if(strcmp(ident,m_function[i].name)==0)
break;
return i;
}
BOOL CFCDlg::RecycleMemory(void)
{
if(m_function[m_iFunction].iIdent>m_function[m_iFunction].iMaxIdent)
m_function[m_iFunction].iMaxIdent=m_function[m_iFunction].iIdent;
for(int i=m_function[m_iFunction].iIdent-1;i>=0;i--)
if(m_function[m_iFunction].ident[i].level>m_function[m_iFunction].level)
{
switch(m_function[m_iFunction].ident[i].type)
{
case IT_INTARRAY:
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_DELARRAYI;
m_code[m_iCode].sd.iNumber=i+m_function[m_iFunction].iParam;
m_iCode++;
break;
case IT_DOUBLEARRAY:
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_DELARRAYD;
m_code[m_iCode].sd.iNumber=i+m_function[m_iFunction].iParam;
m_iCode++;
break;
}
m_function[m_iFunction].ident[i].level=-1;
m_function[m_iFunction].iIdent--;
}
return TRUE;
}
// CFCDlg 編譯函數(shù)
BOOL CFCDlg::Compile(void)
{
m_strEdit="編譯中...\r\n";
UpdateData(FALSE); //刷新輸出信息
m_nCurNumber=0; //當前整數(shù)
m_dCurNumber=0.0; //當前實數(shù)
m_curElement=E_NULL;//當前ZElement
m_iFunction=-1; //函數(shù)數(shù)目計數(shù)
m_iCount=0; //源代碼字符計數(shù)
m_iLine=0; //源代碼行計數(shù)
m_iCode=1; //中間代碼計數(shù) -- 賦值 1 是為了在 0 處填入jump to main代碼
m_iErrorCount=0; //源代碼錯誤計數(shù)
m_iContinue=-1;
m_iBreak=-1;
if(!GetElement())//獲取第一個函數(shù)的返回類型
return FALSE;
while(1)//循環(huán)處理函數(shù)
{
if(m_curElement==E_FILEEND)
break;
if(!DoFunction())
return FALSE;
}
m_iFunction++;
if(!SearchMain())
return FALSE;
return TRUE;
}
BOOL CFCDlg::DoFunction(void)
{
if(m_iFunction==nFUNCTION)//函數(shù)數(shù)超過上限
{
ErrorReport(CFCErrorDlg::ET_MANYFUNCTION);
return FALSE;
}
if(!TestCode())
return FALSE;
int head=m_iCode;
m_code[head].op=OP_NULL;//函數(shù)開始標志
m_iCode++;//預(yù)留空格以填入函數(shù)參數(shù)和變量所需的內(nèi)存大小
switch(m_curElement)//登記函數(shù)的返回類型
{
case E_DOUBLE:
m_function[m_iFunction+1].ReturnType=IT_DOUBLE;
break;
case E_INT:
m_function[m_iFunction+1].ReturnType=IT_INT;
break;
case E_VOID:
m_function[m_iFunction+1].ReturnType=IT_VOID;
break;
default://錯誤的函數(shù)返回類型
ErrorReport(CFCErrorDlg::ET_UNKNOWNTYPE);
return FALSE;
}
if(!GetElement())//獲取函數(shù)名
return FALSE;
if(m_curElement!=E_IDENT)//不是標識符
{
if(!ErrorReport(CFCErrorDlg::ET_LESSIDENT))
return FALSE;
}
if(IT_FUNCTION==GetIdentType(m_curIdent))//已經(jīng)定義的函數(shù)?
{
if(!ErrorReport(CFCErrorDlg::ET_DEFINEDIDENT))
return FALSE;
//繼續(xù)編譯,權(quán)當此處函數(shù)名沒有重名
}
m_iFunction++;
strcpy(m_function[m_iFunction].name,m_curIdent);//登記函數(shù)名
if(!GetElement())//獲取函數(shù)參數(shù)前的左括號
return FALSE;
if(m_curElement!=E_LPAREN)//不是左小括號?
{
if(!ErrorReport(CFCErrorDlg::ET_LESSLPAREN))
return FALSE;
//繼續(xù)編譯,權(quán)當此處有一個左小括號
}
if(!GetElement())//獲取函數(shù)的第一個參數(shù)的類型或右小括號
return FALSE;
if(m_curElement==E_RPAREN)//右括號,即此函數(shù)時無參函數(shù)
m_function[m_iFunction].iParam=0;
else//處理函數(shù)參數(shù)
{
int iParam=0;
m_function[m_iFunction].iParam=0;
while(1)
{
if(iParam==nPARAM)//檢查參數(shù)數(shù)目
{
ErrorReport(CFCErrorDlg::ET_MANYPARAM);
return FALSE;
}
switch(m_curElement)//登記參數(shù)類型
{
case E_INT:
m_function[m_iFunction].param[iParam].type=IT_INT;
break;
case E_DOUBLE:
m_function[m_iFunction].param[iParam].type=IT_DOUBLE;
break;
default:
ErrorReport(CFCErrorDlg::ET_UNKNOWNTYPE);
return FALSE;
}
if(!GetElement())//獲取參數(shù)名稱
return FALSE;
if(m_curElement!=E_IDENT)//不是標識符
{
if(!ErrorReport(CFCErrorDlg::ET_LESSIDENT))
return FALSE;
}
if(GetIdentType(m_curIdent)!=IT_NULL)//參數(shù)重名
{
if(!ErrorReport(CFCErrorDlg::ET_DEFINEDIDENT))
return FALSE;
//繼續(xù)編譯,權(quán)當此處參數(shù)沒有重名
}
strcpy(m_function[m_iFunction].param[iParam].name,m_curIdent);//登記參數(shù)名稱
if(!GetElement())//獲取逗號或右小括號
return FALSE;
iParam++;
m_function[m_iFunction].iParam++;//參數(shù)數(shù)目加一
if(m_curElement!=E_COMMA)//不是逗號,結(jié)束參數(shù)
break;
if(!GetElement())//獲取下一個參數(shù)類型
return FALSE;
}
if(m_curElement!=E_RPAREN)
{
if(!ErrorReport(CFCErrorDlg::ET_LESSRPAREN))
return FALSE;
//繼續(xù)編譯,權(quán)當此處有一個右小括號
}
for(iParam=0;iParam<m_function[m_iFunction].iParam;iParam++)//處理參數(shù)傳遞
{
if(!TestCode())
return FALSE;
m_code[m_iCode].op=(m_function[m_iFunction].param[iParam].type==IT_INT?
OP_PARAMTRANSI:OP_PARAMTRANSD);
m_code[m_iCode].sd.iNumber=iParam;
m_code[m_iCode].sd.nParam=m_function[m_iFunction].iParam;
m_iCode++;
}
}
if(!GetElement())//獲取函數(shù)頭部的左花括號
return FALSE;
if(m_curElement!=E_BEGIN)
{
if(!ErrorReport(CFCErrorDlg::ET_LESSBEGIN))
return FALSE;
//繼續(xù)編譯,權(quán)當此處有一個左花括號
}
m_function[m_iFunction].level=0;//初始嵌套層次為0
m_function[m_iFunction].iIdent=0;
if(!GetElement())//獲取語句的第一個 ZElement
return FALSE;
while(m_curElement!=E_END)//循環(huán)處理函數(shù)內(nèi)的語句
{
if(!DoStatement())
return FALSE;
}
m_function[m_iFunction].level=-1;//函數(shù)已經(jīng)結(jié)束,回收所有變量占用的內(nèi)存
if(!RecycleMemory())
return FALSE;
if(!GetElement())//獲取下一個函數(shù)的類型或源代碼結(jié)束符
return FALSE;
switch(m_function[m_iFunction].ReturnType)//處理函數(shù)默認返回
{
case IT_INT:
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_LOADCONSTI;
m_code[m_iCode].sd.iNumber=0;
m_iCode++;
break;
case IT_DOUBLE:
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_LOADCONSTD;
m_code[m_iCode].sd.dNumber=0.0;
m_iCode++;
break;
}
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_NULL; //函數(shù)結(jié)束標志
m_code[m_iCode].sd.iNumber=m_function[m_iFunction].iParam;
m_iCode++;
m_code[head].sd.iNumber= //填入函數(shù)參數(shù)和變量所需的內(nèi)存大小
m_function[m_iFunction].iMaxIdent+m_function[m_iFunction].iParam;
// m_iFunction++;
return TRUE;
}
BOOL CFCDlg::DoStatement(void)
{
m_bDouble=FALSE;
switch(m_curElement)
{
case E_FILEEND: //源代碼結(jié)束
ErrorReport(CFCErrorDlg::ET_SOURCENOEND);
return FALSE;
case E_OUTPUT: //輸出語句
return DoOutput();
case E_BEGIN: //復(fù)合語句
m_function[m_iFunction].level++;
if(!GetElement())
return FALSE;
while(1)
{
if(m_curElement==E_END || m_curElement==E_FILEEND)
break;
if(!DoStatement())
return FALSE;
}
m_function[m_iFunction].level--;
if(!RecycleMemory())
return FALSE;
if(!GetElement())//獲取下一語句開始的 ZElement
return FALSE;
break;
case E_INT:case E_DOUBLE: //定義語句
return DoDefine();
case E_IDENT:
switch(GetIdentType(m_curIdent))
{
case IT_NULL: //未知標識符
if(!ErrorReport(CFCErrorDlg::ET_UNKNOWNIDENT))
return FALSE;
if(!GetElement())
return FALSE;
break;
case IT_INT: //賦值語句
case IT_DOUBLE:
case IT_INTARRAY:
case IT_DOUBLEARRAY:
case IT_INTINRANG:
case IT_DOUBLEINRANG:
case IT_IARRAYINRANG:
case IT_DARRAYINRANG:
if(!DoBecomes())
return FALSE;
break;
case IT_FUNCTION: //函數(shù)調(diào)用
ZIdentType it=m_function[FunctionIndex(m_curIdent)].ReturnType;
if(!DoCall())
return FALSE;
if(m_curElement!=E_SEMICOLON)//缺少分號
{
if(!ErrorReport(CFCErrorDlg::ET_LESSSEMICOLON))
return FALSE;
}
if(it!=IT_VOID)
{
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_DELETE;
m_iCode++;
}
if(!GetElement())
return FALSE;
break;
}
break;
case E_INPUT: //輸入語句
return DoInput();
case E_CONTINUE:case E_BREAK:case E_EXIT:case E_RETURN://特殊語句
return DoSpecial();
case E_IF: //判斷語句
return DoIf();
case E_WHILE: //循環(huán)語句
return DoWhile();
case E_DO: //重復(fù)語句
return DoDoWhile();
case E_SWITCH: //選擇語句
return DoSwitch();
default:
if(!ErrorReport(CFCErrorDlg::ET_WRONGSTATEMENT))
return FALSE;
if(!GetElement())
return FALSE;
break;
}
return TRUE;
}
BOOL CFCDlg::DoOutput(void)
{
do
{
if(!GetElement())
return FALSE;
if(m_curElement==E_STRING)//輸出字符串
{
char *string=new char[m_curString.GetLength()+1];
strcpy(string,m_curString);
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_OUTPUTS;
m_code[m_iCode].sd.string=string;
m_iCode++;
if(!GetElement())
return FALSE;
}
else//輸出表達式
{
m_bDouble=FALSE;
if(!DoExpression())
return FALSE;
if(!TestCode())
return FALSE;
if(m_bDouble)
m_code[m_iCode].op=OP_OUTPUTD;
else
m_code[m_iCode].op=OP_OUTPUTI;
m_iCode++;
}
}
while(m_curElement==E_COMMA);
if(m_curElement!=E_SEMICOLON)
{
if(!ErrorReport(CFCErrorDlg::ET_LESSSEMICOLON))
return FALSE;
//繼續(xù)編譯,權(quán)當此處有一個分號
}
if(!GetElement())
return FALSE;
return TRUE;
}
BOOL CFCDlg::DoExpression(void)
{
BOOL bDouble=FALSE;
BOOL bMinus=FALSE;
if(m_curElement==E_MINUS || m_curElement==E_PLUS)//處理表達式前的加減號
{
if(m_curElement==E_MINUS)
bMinus=TRUE;
if(!GetElement())
return FALSE;
if(!DoTerm())
return FALSE;
if(bMinus)
{
if(!TestCode())
return FALSE;
if(m_bDouble)m_code[m_iCode].op=OP_CHANGESIGNALD;
else m_code[m_iCode].op=OP_CHANGESIGNALI;
m_iCode++;
}
}
else//表達式前沒有加減號
{
if(!DoTerm())
return FALSE;
}
while(m_curElement==E_MINUS || m_curElement==E_PLUS)//循環(huán)處理項
{
bMinus=(m_curElement==E_MINUS);
if(!GetElement())
return FALSE;
bDouble=m_bDouble;
m_bDouble=FALSE;
if(!DoTerm())
return FALSE;
if(!bDouble && m_bDouble)//原來不是double現(xiàn)在是
{//作整數(shù)變實數(shù)
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_I2D;
m_code[m_iCode].sd.iNumber=-1;//棧頂?shù)诙€數(shù)
m_iCode++;
}
if(bDouble && !m_bDouble)//原來是double現(xiàn)在不是
{//作整數(shù)變實數(shù)
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_I2D;
m_code[m_iCode].sd.iNumber=0;//棧頂?shù)谝粋€數(shù)
m_iCode++;
}
m_bDouble=(m_bDouble || bDouble);
if(!TestCode())
return FALSE;
if(bMinus)
{
if(m_bDouble)m_code[m_iCode].op=OP_MINUSD;
else m_code[m_iCode].op=OP_MINUSI;
}
else
{
if(m_bDouble)m_code[m_iCode].op=OP_PLUSD;
else m_code[m_iCode].op=OP_PLUSI;
}
m_iCode++;
}
return TRUE;
}
BOOL CFCDlg::DoTerm(void)
{
BOOL bDouble=FALSE;
ZElement el;
if(!DoFactor())
return FALSE;
while(m_curElement==E_TIMES || m_curElement==E_SLASH || m_curElement==E_MOD)//循環(huán)處理因子
{
el=m_curElement;
if(!GetElement())
return FALSE;
bDouble=m_bDouble;
m_bDouble=FALSE;
if(!DoFactor())
return FALSE;
if(!bDouble && m_bDouble)//原來不是double現(xiàn)在是
{//作整數(shù)變實數(shù)
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_I2D;
m_code[m_iCode].sd.iNumber=-1;//棧頂?shù)诙€數(shù)
m_iCode++;
}
if(bDouble && !m_bDouble)//原來是double現(xiàn)在不是
{//作整數(shù)變實數(shù)
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_I2D;
m_code[m_iCode].sd.iNumber=0;//棧頂?shù)谝粋€數(shù)
m_iCode++;
}
m_bDouble=(bDouble || m_bDouble);
if(!TestCode())
return FALSE;
switch(el)
{
case E_TIMES:
if(m_bDouble)m_code[m_iCode].op=OP_TIMESD;
else m_code[m_iCode].op=OP_TIMESI;
break;
case E_SLASH:
if(m_bDouble)m_code[m_iCode].op=OP_SLASHD;
else m_code[m_iCode].op=OP_SLASHI;
break;
case E_MOD:
if(m_bDouble)
{
if(!ErrorReport(CFCErrorDlg::ET_DOUBLEMOD))
return FALSE;
//繼續(xù)編譯,權(quán)當此處不是浮點數(shù)參加余運算
}
m_code[m_iCode].op=OP_MOD;
break;
}//end switch
m_iCode++;
}
return TRUE;
}
BOOL CFCDlg::DoFactor(void)
{
BOOL bDouble=FALSE;
m_bDouble=FALSE;
ZIdentType it=IT_VOID;//強制類型轉(zhuǎn)換標志
int index;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -