?? fc-compile.cpp
字號(hào):
#include "stdafx.h"
#include "FC.h"
#include "FCDlg.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CFCDlg::ZIdentType CFCDlg::GetIdentType(char ident[IDENTLENGTH])
{
int i;
for(i=0;i<=m_iFunction;i++)//查找函數(shù)名字列表
if(strcmp(ident,m_function[i].name)==0)
return IT_FUNCTION;
if(m_iFunction>=0 && m_iFunction<=m_iFunction)
{
for(i=m_function[m_iFunction].iIdent-1;i>=0;i--)//查找變量列表
if(strcmp(ident,m_function[m_iFunction].ident[i].name)==0)//標(biāo)識(shí)符名相同
{
if(m_function[m_iFunction].ident[i].level==m_function[m_iFunction].level)
return m_function[m_iFunction].ident[i].type;//當(dāng)前作用域的變量或數(shù)組
else if(m_function[m_iFunction].ident[i].level>=0)
{
switch(m_function[m_iFunction].ident[i].type)
{
case IT_INT:return IT_INTINRANG;
case IT_DOUBLE:return IT_DOUBLEINRANG;
case IT_INTARRAY:return IT_IARRAYINRANG;
case IT_DOUBLEARRAY:return IT_DARRAYINRANG;
}
}
}
for(i=0;i<m_function[m_iFunction].iParam;i++)//查找參數(shù)列表
if(strcmp(ident,m_function[m_iFunction].param[i].name)==0)
return m_function[m_iFunction].param[i].type;
}
return IT_NULL;
}
BOOL CFCDlg::ErrorReport(CFCErrorDlg::ZErrorType et)
{
m_iErrorCount++;
int i,i0,cnt=0;
for(i=0;cnt<m_iLine;i++)
if(m_source[i]=='\n')
cnt++;
i0=i;
for(i0=i;i<m_SourceLength;i++)
if(m_source[i]=='\r')
break;
CFCErrorDlg dlg;
MessageBeep(0);
if(dlg.ErrorReport(m_iLine+1,m_source.Mid(i0,i-i0),et)==IDCANCEL)
{
if(m_iStatus==2)On_ExitCompile();
else if(m_iStatus==4)On_ExitTranslate();
return FALSE;
}
return TRUE;
}
BOOL CFCDlg::SearchMain(void)
{
int i,cnt,n;
for(i=0;i<m_iFunction;i++)
if(strcmp("main",m_function[i].name)==0)
break;
if(i==m_iFunction)
{
if(!ErrorReport(CFCErrorDlg::ET_NOMAIN))
return FALSE;
}
else if(m_function[i].iParam!=0)
{
if(!ErrorReport(CFCErrorDlg::ET_PARAMMAIN))
return FALSE;
}
else if(m_function[i].ReturnType!=IT_VOID)
{
if(!ErrorReport(CFCErrorDlg::ET_NOVOIDMAIN))
return FALSE;
}
n=2*i+1;
cnt=0;
for(i=1;cnt<n && i<nCODE;i++)
if(m_code[i].op==OP_NULL)
cnt++;
m_code[0].op=OP_CALL;
m_code[0].sd.iNumber=i-1;
return TRUE;
}
BOOL CFCDlg::TestCode(void)
{
if(m_iCode>=nCODE)
return ErrorReport(CFCErrorDlg::ET_LONGPROGRAM);
return TRUE;
}
BOOL CFCDlg::GetElement(void)//詞法分析函數(shù)
{
while(1)//跳過空格,tab,回車符,注釋
{
if(m_iCount>=m_SourceLength)//到達(dá)源代碼尾
{
m_curElement=E_FILEEND;
return TRUE;
}
if(m_source[m_iCount]==' ' || m_source[m_iCount]=='\t' || //空白字符
m_source[m_iCount]=='\r' || m_source[m_iCount]=='\n') //換行字符
{
if(m_source[m_iCount]=='\n')
m_iLine++;
m_iCount++;
}
else if(m_source[m_iCount]=='/' && m_iCount+1<m_SourceLength) //可能為注釋
{
if(m_source[m_iCount+1]=='/')//單行注釋
{
for(m_iCount+=2;m_iCount<m_SourceLength && m_source[m_iCount]!='\n';m_iCount++);
if(m_iCount!=m_SourceLength)
{
m_iCount++;
m_iLine++;
}
}
else if(m_source[m_iCount+1]=='*')//多行注釋
{
m_iCount+=2;
while(1)
{
if(m_iCount>=m_SourceLength)
{
m_curElement=E_FILEEND;
return TRUE;
}
if(m_source[m_iCount]=='\r')
m_iLine++;
else if(m_source[m_iCount]=='*' && m_iCount+1<m_SourceLength &&
{
m_iCount+=2;
break;
}
m_iCount++;
}
}
else break;
}
else break;
}
switch(m_source[m_iCount])//此處處理運(yùn)算符
{
case '+':
m_iCount++;
m_curElement=E_PLUS;
return TRUE;
case '-':
m_iCount++;
m_curElement=E_MINUS;
return TRUE;
case '*':
m_iCount++;
m_curElement=E_TIMES;
return TRUE;
case '/':
m_iCount++;
m_curElement=E_SLASH;
return TRUE;
case '%':
m_iCount++;
m_curElement=E_MOD;
return TRUE;
case '(':
m_iCount++;
m_curElement=E_LPAREN;
return TRUE;
case ')':
m_iCount++;
m_curElement=E_RPAREN;
return TRUE;
case '[':
m_iCount++;
m_curElement=E_LSUB;
return TRUE;
case ']':
m_iCount++;
m_curElement=E_RSUB;
return TRUE;
case '{':
m_iCount++;
m_curElement=E_BEGIN;
return TRUE;
case '}':
m_iCount++;
m_curElement=E_END;
return TRUE;
case ',':
m_iCount++;
m_curElement=E_COMMA;
return TRUE;
case ':':
m_iCount++;
m_curElement=E_COLON;
return TRUE;
case ';':
m_iCount++;
m_curElement=E_SEMICOLON;
return TRUE;
case '!':
if(m_iCount+1<m_SourceLength && m_source[m_iCount+1]=='=')
{
m_iCount+=2;
m_curElement=E_NOTEQUAL;
}
else
{
m_iCount++;
m_curElement=E_NOT;
}
return TRUE;
case '>':
if(m_iCount+1<m_SourceLength && m_source[m_iCount+1]=='=')
{
m_iCount+=2;
m_curElement=E_GREATEQUAL;
}
else
{
m_iCount++;
m_curElement=E_GREAT;
}
return TRUE;
case '<':
if(m_iCount+1<m_SourceLength && m_source[m_iCount+1]=='=')
{
m_iCount+=2;
m_curElement=E_LESSEQUAL;
}
else
{
m_iCount++;
m_curElement=E_LESS;
}
return TRUE;
case '=':
if(m_iCount+1<m_SourceLength && m_source[m_iCount+1]=='=')
{
m_iCount+=2;
m_curElement=E_EQUAL;
}
else
{
m_iCount++;
m_curElement=E_BECOMES;
}
return TRUE;
case '&':
if(m_iCount+1<m_SourceLength && m_source[m_iCount+1]=='&')
{
m_iCount+=2;
m_curElement=E_AND;
return TRUE;
}
else
{
ErrorReport(CFCErrorDlg::ET_UNKNOWNTOKEN);
return FALSE;
}
case '|':
if(m_iCount+1<m_SourceLength && m_source[m_iCount+1]=='|')
{
m_iCount+=2;
m_curElement=E_OR;
return TRUE;
}
else
{
ErrorReport(CFCErrorDlg::ET_UNKNOWNTOKEN);
return FALSE;
}
}//end switch
if(m_source[m_iCount]>='0' && m_source[m_iCount]<='9')//此處處理數(shù)
{
int d=0,l=0,n=0;
do
{
n*=10;
n+=m_source[m_iCount]-'0';
m_iCount++;
}
while(m_iCount<m_SourceLength &&
m_source[m_iCount]>='0' && m_source[m_iCount]<='9');
if(m_iCount<m_SourceLength && m_source[m_iCount]=='.')//有小數(shù)點(diǎn)
{
m_iCount++;
if(m_iCount<m_SourceLength &&
m_source[m_iCount]>='0' && m_source[m_iCount]<='9')
{ //實(shí)數(shù)
m_dCurNumber=n;
do
{
l++;
m_dCurNumber+=(m_source[m_iCount]-'0')/pow(10,l);
m_iCount++;
}
while(m_iCount<m_SourceLength &&
m_source[m_iCount]>='0' && m_source[m_iCount]<='9');
m_curElement=E_DNUMBER;
return TRUE;
}
}
//無小數(shù)點(diǎn)或小數(shù)點(diǎn)后沒有數(shù)字 -- 整數(shù)
m_curElement=E_INUMBER;
m_nCurNumber=n;
return TRUE;
}
if((m_source[m_iCount]>='a' && m_source[m_iCount]<='z') ||//標(biāo)識(shí)符或者關(guān)鍵字
(m_source[m_iCount]>='A' && m_source[m_iCount]<='Z') ||
m_source[m_iCount]=='_' )
{
char str[IDENTLENGTH];
int i=0;
while(m_iCount<m_SourceLength && //此循環(huán)獲取連續(xù)的字母數(shù)字下劃線串
((m_source[m_iCount]>='a' && m_source[m_iCount]<='z') ||
(m_source[m_iCount]>='A' && m_source[m_iCount]<='Z') ||
(m_source[m_iCount]>='0' && m_source[m_iCount]<='9') ||
m_source[m_iCount]=='_' ) )
{
if(i==IDENTLENGTH-1)//標(biāo)識(shí)符過長(zhǎng)
{
if(ErrorReport(CFCErrorDlg::ET_LONGIDENT))
{//返回TRUE,繼續(xù)編譯,跳過過長(zhǎng)的標(biāo)識(shí)符
while(m_iCount<m_SourceLength &&
((m_source[m_iCount]>='a' && m_source[m_iCount]<='z') ||
(m_source[m_iCount]>='A' && m_source[m_iCount]<='Z') ||
(m_source[m_iCount]>='0' && m_source[m_iCount]<='9')))
m_iCount++;
m_curElement=E_IDENT;
str[IDENTLENGTH-1]='\0';
strcpy(m_curIdent,str);
return TRUE;
}
else return FALSE;
}
str[i]=m_source[m_iCount];
i++;
m_iCount++;
}//while end
str[i]='\0';
strlwr(str);
switch(str[0])//根據(jù)首字母判斷關(guān)鍵字
{
case 'b':
if(strcmp("break",str)==0)
{
m_curElement=E_BREAK;
return TRUE;
}
break;
case 'c':
if(strcmp("case",str)==0)
{
m_curElement=E_CASE;
return TRUE;
}
if(strcmp("continue",str)==0)
{
m_curElement=E_CONTINUE;
return TRUE;
}
break;
case 'd':
if(strcmp("default",str)==0)
{
m_curElement=E_DEFAULT;
return TRUE;
}
if(strcmp("double",str)==0)
{
m_curElement=E_DOUBLE;
return TRUE;
}
if(strcmp("do",str)==0)
{
m_curElement=E_DO;
return TRUE;
}
break;
case 'e':
if(strcmp("else",str)==0)
{
m_curElement=E_ELSE;
return TRUE;
}
if(strcmp("exit",str)==0)
{
m_curElement=E_EXIT;
return TRUE;
}
break;
case 'i':
if(strcmp("if",str)==0)
{
m_curElement=E_IF;
return TRUE;
}
if(strcmp("int",str)==0)
{
m_curElement=E_INT;
return TRUE;
}
if(strcmp("input",str)==0)
{
m_curElement=E_INPUT;
return TRUE;
}
break;
case 'o':
if(strcmp("output",str)==0)
{
m_curElement=E_OUTPUT;
return TRUE;
}
break;
case 'r':
if(strcmp("return",str)==0)
{
m_curElement=E_RETURN;
return TRUE;
}
break;
case 's':
if(strcmp("switch",str)==0)
{
m_curElement=E_SWITCH;
return TRUE;
}
case 'v':
if(strcmp("void",str)==0)
{
m_curElement=E_VOID;
return TRUE;
}
break;
case 'w':
if(strcmp("while",str)==0)
{
m_curElement=E_WHILE;
return TRUE;
}
break;
}//switch end
strcpy(m_curIdent,str);
m_curElement=E_IDENT;
return TRUE;
}
if(m_source[m_iCount]=='\"')//此處處理字符串
{
CString str="";
BOOL bSys=FALSE;//轉(zhuǎn)義字符標(biāo)記
for(m_iCount++;m_iCount<m_SourceLength;m_iCount++)
{
if(!bSys && m_source[m_iCount]=='\\')//轉(zhuǎn)義字符
bSys=TRUE;
else if(bSys)
{
switch(m_source[m_iCount])
{
case 'n'://回車符
str+="\r\n";
break;
case 't':
str+='\t';
break;
case '\"'://引號(hào)
str+='\"';
break;
case '\\':
str+='\\';
break;
case '\r'://多行字符串
m_iCount++;
m_iLine++;
break;
default:
str+='\\';
str+=m_source[m_iCount];
break;
}
bSys=FALSE;
}
else if(m_source[m_iCount]=='\"')//字符串結(jié)束
{
m_iCount++;
m_curElement=E_STRING;
m_curString=str;
return TRUE;
}
else if(m_source[m_iCount]=='\r')//換行,字符串意外結(jié)束
{
if(ErrorReport(CFCErrorDlg::ET_STRINGNOEND))
{ //返回TRUE,繼續(xù)編譯,
m_curElement=E_STRING;
m_curString=str;
return TRUE;
}
else return FALSE;
}
else str+=m_source[m_iCount];
}//end for
//若能運(yùn)行到此處,必有m_iCount==m_SourceLength,即到達(dá)源代碼尾而字符串沒結(jié)束
if(ErrorReport(CFCErrorDlg::ET_STRINGNOEND))
{ //返回TRUE,繼續(xù)編譯,
m_curElement=E_STRING;
m_curString=str;
return TRUE;
}
else return FALSE;
}
//若能運(yùn)行到此處,即碰到無法認(rèn)識(shí)的字符
ErrorReport(CFCErrorDlg::ET_UNKNOWNTOKEN);
return FALSE;
}
int CFCDlg::SearchFunction(int n)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -