?? fc-compile.cpp
字號:
switch(m_curElement)
{
case E_INUMBER: //整數(shù)
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_LOADCONSTI;
m_code[m_iCode].sd.iNumber=m_nCurNumber;
m_iCode++;
if(!GetElement())
return FALSE;
break;
case E_DNUMBER: //實(shí)數(shù)
m_bDouble=TRUE;
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_LOADCONSTD;
m_code[m_iCode].sd.dNumber=m_dCurNumber;
m_iCode++;
if(!GetElement())
return FALSE;
break;
case E_INT: //int -- 強(qiáng)制類型轉(zhuǎn)換
case E_DOUBLE: //double -- 強(qiáng)制類型轉(zhuǎn)換
it=(m_curElement==E_INT?IT_INT:IT_DOUBLE);
if(!GetElement())
return FALSE;
if(m_curElement!=E_LPAREN)
{
if(!ErrorReport(CFCErrorDlg::ET_LESSLPAREN))
return FALSE;
}
//此處不填入break語句
case E_LPAREN: //左括號 -- (表達(dá)式)
if(!GetElement())
return FALSE;
if(!DoExpression())
return FALSE;
if(m_curElement!=E_RPAREN)
{
if(!ErrorReport(CFCErrorDlg::ET_LESSRPAREN))
return FALSE;
//繼續(xù)編譯,權(quán)當(dāng)此處有個(gè)右小括號
}
switch(it)//進(jìn)行類型轉(zhuǎn)換
{
case IT_VOID://不進(jìn)行類型轉(zhuǎn)換
break;
case IT_INT:
if(m_bDouble)
{
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_D2I;
m_code[m_iCode].sd.iNumber=0;
m_iCode++;
m_bDouble=FALSE;
}
break;
case IT_DOUBLE:
if(!m_bDouble)
{
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_I2D;
m_code[m_iCode].sd.iNumber=0;
m_iCode++;
m_bDouble=TRUE;
}
break;
}
m_bDouble=(bDouble || m_bDouble);
if(!GetElement())
return FALSE;
break;
case E_IDENT: //標(biāo)識符 -- 變量或數(shù)組或函數(shù)調(diào)用
index=IdentIndex(m_curIdent);
switch(GetIdentType(m_curIdent))
{
case IT_NULL:
if(!ErrorReport(CFCErrorDlg::ET_UNKNOWNIDENT))
return FALSE;
//繼續(xù)編譯,不寫入導(dǎo)入變量這一中間代碼
if(!GetElement())
return FALSE;
break;
case IT_FUNCTION:
if(!DoCall())
return FALSE;
m_bDouble=(bDouble || m_bDouble);
break;
case IT_INT:
case IT_INTINRANG:
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_LOADVARI;
m_code[m_iCode].sd.iNumber=index;
m_iCode++;
if(!GetElement())
return FALSE;
break;
case IT_DOUBLE:
case IT_DOUBLEINRANG:
m_bDouble=TRUE;
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_LOADVARD;
m_code[m_iCode].sd.iNumber=index;
m_iCode++;
if(!GetElement())
return FALSE;
break;
case IT_INTARRAY:
case IT_IARRAYINRANG:
if(!GetElement())//獲取左方括號
return FALSE;
if(!DoSubscript())
return FALSE;
m_bDouble=FALSE;//整數(shù)數(shù)組
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_LOADARRAYI;
m_code[m_iCode].sd.iNumber=index;
m_iCode++;
if(!GetElement())
return FALSE;
break;
case IT_DOUBLEARRAY:
case IT_DARRAYINRANG:
if(!GetElement())//獲取左方括號
return FALSE;
if(!DoSubscript())
return FALSE;
m_bDouble=TRUE;//實(shí)數(shù)數(shù)組
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_LOADARRAYD;
m_code[m_iCode].sd.iNumber=index;
m_iCode++;
if(!GetElement())
return FALSE;
break;
//不需要default語句 -- GetIdentType(m_curIdent,m_iFunction)只返回所列舉的幾個(gè)值
}//end inner switch
break;
default:
if(!ErrorReport(CFCErrorDlg::ET_UNKNOWNERROR))
return FALSE;
if(!GetElement())
return FALSE;
break;
}//end outer switch
m_bDouble=(m_bDouble || bDouble);
return TRUE;
}
BOOL CFCDlg::DoCall(void)
{
m_bDouble=FALSE;
int i,index=FunctionIndex(m_curIdent);
if(!GetElement())//獲取左小括號
return FALSE;
if(m_curElement!=E_LPAREN)
{
if(!ErrorReport(CFCErrorDlg::ET_LESSLPAREN))
return FALSE;
//繼續(xù)編譯,權(quán)當(dāng)此處有一個(gè)左小括號
}
if(!GetElement())//獲取函數(shù)第一個(gè)實(shí)參(表達(dá)式)的第一個(gè) ZElement 或右小括號
return FALSE;
if(m_curElement!=E_RPAREN)//不是右小括號,函數(shù)有參數(shù)
{
for(i=0;;i++)//參數(shù)處理循環(huán)
{
m_bDouble=FALSE;
if(!DoExpression())
return FALSE;
if(m_bDouble && m_function[index].param[i].type!=IT_DOUBLE)//應(yīng)為整數(shù)參數(shù),卻為實(shí)數(shù)
{
if(!ErrorReport(CFCErrorDlg::ET_WRONGPARAMTYPE))
return FALSE;
}
if(m_curElement==E_RPAREN)//右小括號,參數(shù)部分結(jié)束
{
i++;
break;
}
if(m_curElement!=E_COMMA)//不是右小括號也不是逗號,錯(cuò)誤
{
if(!ErrorReport(CFCErrorDlg::ET_LESSCOMMA))
return FALSE;
}
if(!GetElement())
return FALSE;
}
}
else i=0;
if(i!=m_function[index].iParam)//參數(shù)數(shù)目錯(cuò)誤
{
if(!ErrorReport(CFCErrorDlg::ET_WRONGPARAMNUM))
return FALSE;
}
m_bDouble=(m_function[index].ReturnType==IT_DOUBLE);
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_CALL;
m_code[m_iCode].sd.iNumber=SearchFunction(index);
m_iCode++;
if(!GetElement())
return FALSE;
return TRUE;
}
BOOL CFCDlg::DoDefine(void)
{
ZIdentType type=(m_curElement==E_INT?IT_INT:IT_DOUBLE);
for(int i=m_function[m_iFunction].iIdent;;i++)//循環(huán)處理變量定義
{
if(!GetElement())//獲取變量標(biāo)識符
return FALSE;
if(m_curElement!=E_IDENT)//不是標(biāo)識符
{
if(!ErrorReport(CFCErrorDlg::ET_LESSIDENT))
return FALSE;
}
else
{
switch(GetIdentType(m_curIdent))
{
case IT_FUNCTION:
case IT_INT:
case IT_DOUBLE:
case IT_INTARRAY:
case IT_DOUBLEARRAY:
if(!ErrorReport(CFCErrorDlg::ET_DEFINEDIDENT))
return FALSE;
break;
}
}
strcpy(m_function[m_iFunction].ident[i].name,m_curIdent);//登記變量名
m_function[m_iFunction].ident[i].level=m_function[m_iFunction].level;//登記嵌套層次
if(!GetElement())//獲取逗號或分號或等號
return FALSE;
if(m_curElement==E_LSUB)//數(shù)組定義
{
m_function[m_iFunction].ident[i].type= //登記數(shù)組類型
(type==IT_INT?IT_INTARRAY:IT_DOUBLEARRAY);
if(!DoSubscript())
return FALSE;
if(!TestCode())
return FALSE;
//申請數(shù)組
m_code[m_iCode].op=(type==IT_INT?OP_NEWARRAYI:OP_NEWARRAYD);
m_code[m_iCode].sd.iNumber=i+m_function[m_iFunction].iParam;
m_iCode++;
if(!GetElement())//獲取逗號或分號
return FALSE;
}
else//變量定義
{
m_function[m_iFunction].ident[i].type=type;//登記變量類型
if(m_curElement==E_BECOMES)//標(biāo)識符后有等號
{
if(!GetElement())//獲取表達(dá)式的第一個(gè) ZElement
return FALSE;
m_bDouble=FALSE;//準(zhǔn)備類型檢查
if(!DoExpression())//處理表達(dá)式
return FALSE;
if(m_bDouble && type==IT_INT)//把實(shí)數(shù)賦予整數(shù),錯(cuò)誤
{
if(!ErrorReport(CFCErrorDlg::ET_DOUBLE2INT))
return FALSE;
}
if(!m_bDouble && type==IT_DOUBLE)//把整數(shù)賦予實(shí)數(shù),進(jìn)行類型轉(zhuǎn)換
{
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_I2D;
m_code[m_iCode].sd.iNumber=0;//棧頂?shù)谝粋€(gè)數(shù)
m_iCode++;
}
if(!TestCode())
return FALSE;
m_code[m_iCode].op=(type==IT_INT?OP_SAVEI:OP_SAVED);
m_code[m_iCode].sd.iNumber=i+m_function[m_iFunction].iParam;
m_iCode++;
}
else//標(biāo)識符沒有賦予初值,設(shè)置初值為0
{
m_iCode++;//預(yù)先加一,因?yàn)橄逻呅枰?單元的ZCode
if(!TestCode())
return FALSE;
if(type==IT_INT)//變量為整型
{
m_code[m_iCode-1].op=OP_LOADCONSTI;
m_code[m_iCode-1].sd.iNumber=0;
m_code[m_iCode].op=OP_SAVEI;
m_code[m_iCode].sd.iNumber=i+m_function[m_iFunction].iParam;
}
else//變量為實(shí)型
{
m_code[m_iCode-1].op=OP_LOADCONSTD;
m_code[m_iCode-1].sd.dNumber=0;
m_code[m_iCode].op=OP_SAVED;
m_code[m_iCode].sd.iNumber=i+m_function[m_iFunction].iParam;
}
m_iCode++;
}
}
if(m_curElement==E_SEMICOLON)//標(biāo)識符后是分號,變量定義結(jié)束
{
m_function[m_iFunction].iIdent=i+1;
break;
}
else if(m_curElement!=E_COMMA)//標(biāo)識符后不是等號也不是逗號,錯(cuò)誤
{
if(!ErrorReport(CFCErrorDlg::ET_LESSCOMMA))
return FALSE;
}
m_function[m_iFunction].iIdent=i+1;
}//end for
if(!GetElement())
return FALSE;
return TRUE;
}
BOOL CFCDlg::DoBecomes(void)
{
ZIdentType type=GetIdentType(m_curIdent);
int index=IdentIndex(m_curIdent);
BOOL bVar=TRUE;
if(!GetElement())//獲取賦值號或左方括號
return FALSE;
if(m_curElement==E_LSUB)//左方括號,處理數(shù)組
{
bVar=FALSE;
if(!DoSubscript())
return FALSE;
if(!GetElement())//獲取賦值號
return FALSE;
}
if(m_curElement!=E_BECOMES)//不是等號,錯(cuò)誤
{
if(!ErrorReport(CFCErrorDlg::ET_LESSBECOMES))
return FALSE;
}
if(!GetElement())//獲取表達(dá)式的第一個(gè) ZElement
return FALSE;
m_bDouble=FALSE;//準(zhǔn)備類型檢查
if(!DoExpression())
return FALSE;
if(m_bDouble &&
(type==IT_INT || type==IT_INTARRAY ||
type==IT_INTINRANG || type==IT_IARRAYINRANG))//把實(shí)數(shù)賦予整數(shù),錯(cuò)誤
{
if(!ErrorReport(CFCErrorDlg::ET_DOUBLE2INT))
return FALSE;
}
if(!m_bDouble &&
(type==IT_DOUBLE || type==IT_DOUBLEARRAY ||
type==IT_DOUBLEINRANG || type==IT_DARRAYINRANG))//把整數(shù)賦予實(shí)數(shù),進(jìn)行類型轉(zhuǎn)換
{
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_I2D;
m_code[m_iCode].sd.iNumber=0;//棧頂?shù)谝粋€(gè)數(shù)
m_iCode++;
}
if(!TestCode())
return FALSE;
if(bVar)
m_code[m_iCode].op=((type==IT_INT || type==IT_INTINRANG)?OP_SAVEI:OP_SAVED);
else
m_code[m_iCode].op=((type==IT_INTARRAY || type==IT_IARRAYINRANG)?OP_SAVEARRAYI:OP_SAVEARRAYD);
m_code[m_iCode].sd.iNumber=index;
m_iCode++;
if(!GetElement())
return FALSE;
return TRUE;
}
BOOL CFCDlg::DoInput(void)
{
ZIdentType type;
int index;
BOOL bVar;
while(1)//輸入處理循環(huán)
{
if(!GetElement())//獲取標(biāo)識符
return FALSE;
if(m_curElement!=E_IDENT)//要輸入的不是標(biāo)識符
{
if(!ErrorReport(CFCErrorDlg::ET_WRONGINPUTOB))
return FALSE;
}
else
{
type=GetIdentType(m_curIdent);
switch(type)
{
case IT_INT:
case IT_DOUBLE:
case IT_INTINRANG:
case IT_DOUBLEINRANG:
bVar=TRUE;
index=IdentIndex(m_curIdent);
break;
case IT_INTARRAY:
case IT_DOUBLEARRAY:
case IT_IARRAYINRANG:
case IT_DARRAYINRANG:
bVar=FALSE;
index=IdentIndex(m_curIdent);
if(!GetElement())//獲取左方括號
return FALSE;
if(!DoSubscript())
return FALSE;
break;
default://要輸入的不是變量、參數(shù)、數(shù)組
if(!ErrorReport(CFCErrorDlg::ET_WRONGINPUTOB))
return FALSE;
break;
}
}
if(!TestCode())
return FALSE;
if(bVar)
m_code[m_iCode].op=((type==IT_INT || type==IT_INTINRANG)?
OP_INPUTI:OP_INPUTD);
else
m_code[m_iCode].op=((type==IT_INTARRAY || type==IT_IARRAYINRANG)?
OP_INPUTARRAYI:OP_INPUTARRAYD);
m_code[m_iCode].sd.iNumber=index;
m_iCode++;
if(!GetElement())//獲取逗號或分號
return FALSE;
if(m_curElement==E_SEMICOLON)//分號,輸入語句結(jié)束
break;
if(m_curElement!=E_COMMA)//不是分號也不是逗號,錯(cuò)誤
{
if(!ErrorReport(CFCErrorDlg::ET_LESSCOMMA))
return FALSE;
}
}//end for
if(!GetElement())
return FALSE;
return TRUE;
}
BOOL CFCDlg::DoSpecial(void)
{
switch(m_curElement)
{
case E_RETURN:
if(m_function[m_iFunction].ReturnType==IT_VOID)//無返回值
{
if(!GetElement())//獲取分號
return FALSE;
if(m_curElement!=E_SEMICOLON)//不是分號,錯(cuò)誤
{
if(!ErrorReport(CFCErrorDlg::ET_LESSSEMICOLON))
return FALSE;
}
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_RETURN;
m_code[m_iCode].sd.iNumber=m_function[m_iFunction].iParam;
m_iCode++;
}
else//有返回值
{
if(!GetElement())//獲取表達(dá)式的第一個(gè) ZElement
return FALSE;
m_bDouble=FALSE;//準(zhǔn)備類型檢查
if(!DoExpression())
return FALSE;
if(m_function[m_iFunction].ReturnType==IT_INT && m_bDouble)//int函數(shù)返回double值,錯(cuò)誤
{
if(!ErrorReport(CFCErrorDlg::ET_DOUBLE2INT))
return FALSE;
}
if(m_function[m_iFunction].ReturnType==IT_DOUBLE && !m_bDouble)//double函數(shù)返回int值,進(jìn)行類型轉(zhuǎn)換
{
if(!TestCode())
return FALSE;
m_code[m_iCode].op=OP_I2D;
m_code[m_iCode].sd.iNumber=0;
m_iCode++;
}
if(!TestCode())
return FALSE;
m_code[m_iCode].op=(m_function[m_iFunction].ReturnType==IT_INT?OP_RETURNI:OP_RETURND);
m_code[m_iCode].sd.iNumber=m_function[m_iFunction].iParam;
m_iCode++;
}
m_code[m_iCode].sd.iNumber=m_function[m_iFunction].iParam;
break;
case E_BREAK:
if(m_iBreak==-1)//不在while語句中,錯(cuò)誤
{
if(!ErrorReport(CFCErrorDlg::ET_WRONGBREAK))
return FALSE;
}
m_code[m_iCode].op=OP_JUMP;
m_code[m_iCode].sd.iNumber=m_iBreak;
m_iCode++;
if(!GetElement())//獲取分號
return FALSE;
if(m_curElement!=E_SEMICOLON)//不是分號,錯(cuò)誤
{
if(!ErrorReport(CFCErrorDlg::ET_LESSSEMICOLON))
return FALSE;
}
break;
case E_CONTINUE:
if(m_iContinue==-1)//不在while語句中,錯(cuò)誤
{
if(!ErrorReport(CFCErrorDlg::ET_WRONGCONTINUE))
return FALSE;
}
m_code[m_iCode].op=OP_JUMP;
m_code[m_iCode].sd.iNumber=m_iContinue;
m_iCode++;
if(!GetElement())//獲取分號
return FALSE;
if(m_curElement!=E_SEMICOLON)//不是分號,錯(cuò)誤
{
if(!ErrorReport(CFCErrorDlg::ET_LESSSEMICOLON))
return FALSE;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -