📄 compiler1.cpp
字号:
// Compiler.cpp: implementation of the CCompiler class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "caoyuting.h"
#include "Compiler.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
// Compiler.cpp: implementation of the CCompiler class.
//
//////////////////////////////////////////////////////////////////////
CCompiler::CCompiler()
{
m_ntCifaLen=0;
m_aSourse[0]=0;
m_Interface.SourseBuffer=m_aSourse;
m_Interface.SemanticQuad=quad;
m_Interface.LexicalDuad=m_tCifa;
m_Interface.QuadOpcodeTable=m_QuadOpCodeTable;
m_Interface.ErrorMessageTable=m_tErrorMessage;
m_Interface.ErrorNumber=0;
m_Interface.ErrorAddress=0;
}
CCompiler::~CCompiler()
{
}
char CCompiler::GetCurCh()//get ch and point does not ++
{
return m_aSourse[m_pCurCh];
}
void CCompiler::NextCh()//point ++
{
m_pCurCh++;
}
char CCompiler::GetCh()//get ch and point ++
{
return m_aSourse[m_pCurCh++];
}
char CCompiler::GetNextCh()//get next ch and point does not ++
{
if (m_aSourse[m_pCurCh]==0) return 0;
return m_aSourse[m_pCurCh+1];
}
void CCompiler::CiFaFengXi()
{
BOOL flag=FALSE;
char token[MAX_LEX_LEN];
int k,v;
Initial();
for (int i=0;i<m_ntCifaLen;i++)
delete m_tCifa[i];
m_pCurCh=0;
m_ntCifaLen=0;
while (GetCurCh())//GetSYM
{
if (flag)
{
while (!((GetCurCh()=='*')&&(GetNextCh()=='/')))
if (GetCurCh()) NextCh();else break;
if (GetCurCh())
{
NextCh();NextCh();
flag=FALSE;
}
}
while (1)
{
while ((GetCurCh()==32) || (GetCurCh()==9))
NextCh();
if (!((GetCurCh()==13) && (GetNextCh()==10)))
break;
NextCh();NextCh();
}
if (isalpha(GetCurCh()))//alpha
{
k=0;
while (1)
{
if (k<MAX_LEX_LEN-1) token[k++]=GetCh();
else NextCh();
if (!isalnum(GetCurCh())) break;
}
token[k]=0;
v=FindInKeyWordTab(token);
if (v)
{
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=0;
m_tCifa[m_ntCifaLen]->type=v;
::strcpy(m_tCifa[m_ntCifaLen]->text,token);
m_tCifa[m_ntCifaLen]->address=m_pCurCh-k;
m_ntCifaLen++;
}
else
{
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=FindInCifaTab(token);
m_tCifa[m_ntCifaLen]->type=1;
::strcpy(m_tCifa[m_ntCifaLen]->text,token);
m_tCifa[m_ntCifaLen]->address=m_pCurCh-k;
m_ntCifaLen++;
}
}
else if (isdigit(GetCurCh()))//digit
{
k=0;
BOOL error=FALSE;
while (1)
{
if (k<=MAX_NUMBER_LEN) token[k++]=GetCh();
else
{
error=TRUE;
NextCh();
}
if (!isdigit(GetCurCh())) break;
}
token[k]=0;
v=::strtol(token,NULL,10);
if (error)
{
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=1;
m_tCifa[m_ntCifaLen]->type=0;
::strcpy(m_tCifa[m_ntCifaLen]->text,token);
m_tCifa[m_ntCifaLen]->address=m_pCurCh-k;
m_ntCifaLen++;
}
else
{
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=v;
m_tCifa[m_ntCifaLen]->type=2;
::strcpy(m_tCifa[m_ntCifaLen]->text,token);
m_tCifa[m_ntCifaLen]->address=m_pCurCh-k;
m_ntCifaLen++;
}
}
else
switch (GetCurCh())//other
{
case '+':
case '-':
case '*':
case '~':
case '&':
case '|':
case '=':
case ';':
case '.':
case ',':
case '(':
case ')':
token[0]=GetCurCh();
token[1]=0;
v=FindInKeyWordTab(token);
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=0;
m_tCifa[m_ntCifaLen]->type=v;
::strcpy(m_tCifa[m_ntCifaLen]->text,token);
m_tCifa[m_ntCifaLen]->address=m_pCurCh;
m_ntCifaLen++;
NextCh();
break;
case '\0':
break;
case '/':
switch (GetNextCh())
{
case '*':
NextCh();
NextCh();
flag=TRUE;
break;
default:
token[0]=GetCurCh();
token[1]=0;
v=FindInKeyWordTab(token);
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=0;
m_tCifa[m_ntCifaLen]->type=v;
::strcpy(m_tCifa[m_ntCifaLen]->text,token);
m_tCifa[m_ntCifaLen]->address=m_pCurCh;
m_ntCifaLen++;
NextCh();
}
break;
case '<':
switch (GetNextCh())
{
case '=':
token[0]=GetCurCh();
token[1]=GetNextCh();
token[2]=0;
v=FindInKeyWordTab(token);
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=0;
m_tCifa[m_ntCifaLen]->type=v;
::strcpy(m_tCifa[m_ntCifaLen]->text,token);
m_tCifa[m_ntCifaLen]->address=m_pCurCh;
m_ntCifaLen++;
NextCh();
NextCh();
break;
case '>':
token[0]=GetCurCh();
token[1]=GetNextCh();
token[2]=0;
v=FindInKeyWordTab(token);
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=0;
m_tCifa[m_ntCifaLen]->type=v;
::strcpy(m_tCifa[m_ntCifaLen]->text,token);
m_tCifa[m_ntCifaLen]->address=m_pCurCh;
m_ntCifaLen++;
NextCh();
NextCh();
break;
default:
token[0]=GetCurCh();
token[1]=0;
v=FindInKeyWordTab(token);
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=0;
m_tCifa[m_ntCifaLen]->type=v;
::strcpy(m_tCifa[m_ntCifaLen]->text,token);
m_tCifa[m_ntCifaLen]->address=m_pCurCh;
m_ntCifaLen++;
NextCh();
}
break;
case '>':
switch (GetNextCh())
{
case '=':
token[0]=GetCurCh();
token[1]=GetNextCh();
token[2]=0;
v=FindInKeyWordTab(token);
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=0;
m_tCifa[m_ntCifaLen]->type=v;
::strcpy(m_tCifa[m_ntCifaLen]->text,token);
m_tCifa[m_ntCifaLen]->address=m_pCurCh;
m_ntCifaLen++;
NextCh();
NextCh();
break;
default:
token[0]=GetCurCh();
token[1]=0;
v=FindInKeyWordTab(token);
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=0;
m_tCifa[m_ntCifaLen]->type=v;
::strcpy(m_tCifa[m_ntCifaLen]->text,token);
m_tCifa[m_ntCifaLen]->address=m_pCurCh;
m_ntCifaLen++;
NextCh();
}
break;
case ':':
switch (GetNextCh())
{
case '=':
token[0]=GetCurCh();
token[1]=GetNextCh();
token[2]=0;
v=FindInKeyWordTab(token);
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=0;
m_tCifa[m_ntCifaLen]->type=v;
::strcpy(m_tCifa[m_ntCifaLen]->text,token);
m_tCifa[m_ntCifaLen]->address=m_pCurCh;
m_ntCifaLen++;
NextCh();
NextCh();
break;
default:
token[0]=GetCurCh();
token[1]=0;
v=FindInKeyWordTab(token);
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=0;
m_tCifa[m_ntCifaLen]->type=v;
::strcpy(m_tCifa[m_ntCifaLen]->text,token);
m_tCifa[m_ntCifaLen]->address=m_pCurCh;
m_ntCifaLen++;
NextCh();
}
break;
default:
token[0]=GetCurCh();
token[1]=0;
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=2;
m_tCifa[m_ntCifaLen]->type=0;
::strcpy(m_tCifa[m_ntCifaLen]->text,token);
m_tCifa[m_ntCifaLen]->address=m_pCurCh;
m_ntCifaLen++;
NextCh();
}//switch
if (m_ntCifaLen==LEX_DUAD_TABLE_LEN-2)//out of table space
{
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=99;
m_tCifa[m_ntCifaLen]->type=0;
::strcpy(m_tCifa[m_ntCifaLen]->text,"");
m_tCifa[m_ntCifaLen]->address=m_pCurCh-1;
m_ntCifaLen++;
break;
}
}//GetSYM
m_tCifa[m_ntCifaLen]=new CifaResult;
m_tCifa[m_ntCifaLen]->value=0;
m_tCifa[m_ntCifaLen]->type=-1;//end node
::strcpy(m_tCifa[m_ntCifaLen]->text,"");
m_tCifa[m_ntCifaLen]->address=0;
m_ntCifaLen++;
return;
}
int CCompiler::FindInKeyWordTab(char * a)
{
for (int i=0;i<KEY_WORD_TABLE_LEN;i++)
if (!::stricmp(m_tKeyWord[i],a)) return i;
return 0;
}
int CCompiler::FindInCifaTab(char * a)
{
int v=1;
for (int i=0;i<m_ntCifaLen;i++)
{
if (m_tCifa[i]->type==1)
{
v++;
if (!::stricmp(m_tCifa[i]->text,a))
return m_tCifa[i]->value;
}
}
return v;
}
void CCompiler::YuFaFengXi()
{
if (m_ntCifaLen==0) return;//未进行词法分析
m_pCurSym=0;
p_ChengXu();
m_Interface.ErrorAddress=m_nErrorAddress;
m_Interface.ErrorNumber=m_nErrorNum;
return;
}
int CCompiler::p_ChengXu()
{
switch (GetCurSym()->type)
{
case 3://program
break;
default:
m_nErrorNum=3;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
switch (GetCurSym()->type)
{
case 1://id
break;
default:
m_nErrorNum=4;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
switch (GetCurSym()->type)
{
case 30://;
break;
default:
m_nErrorNum=5;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
if (!p_ChengXuTi()) return FALSE;
switch (GetCurSym()->type)
{
case 31://.
break;
default:
m_nErrorNum=6;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
switch (GetCurSym()->type)
{
case -1://end of cifa
break;
default:
m_nErrorNum=96;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
m_nErrorNum=0;//Successful
m_nErrorAddress=m_pCurSym;
return TRUE;
}
int CCompiler::p_ChengXuTi()
{
switch (GetCurSym()->type)
{
case 14://integer
case 15://real
case 5://procedure
if (!p_ShuoMingChuan()) return FALSE;
switch (GetCurSym()->type)
{
case 30://;
break;
default:
m_nErrorNum=5;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
break;
case 6://begin
break;
default:
m_nErrorNum=7;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
switch (GetCurSym()->type)
{
case 6://begin
break;
default:
m_nErrorNum=8;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
if (!p_YuJuChuan()) return FALSE;
switch (GetCurSym()->type)
{
case 7://end
break;
default:
m_nErrorNum=10;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
return TRUE;
}
int CCompiler::p_ShuoMingChuan()
{
if (!p_ShuoMing()) return FALSE;
while (GetCurSym()->type==30
&& GetNextSym()->type!=6)//; begin
{
NextSym();
if (!p_ShuoMing()) return FALSE;
}
return TRUE;
}
int CCompiler::p_ShuoMing()
{
switch (GetCurSym()->type)
{
case 14://integer
case 15://real
if (!p_JianBianShuoMing()) return FALSE;
break;
case 5://procedure
if (!p_GuoChengShuoMing()) return FALSE;
break;
default:
m_nErrorNum=11;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
return TRUE;
}
int CCompiler::p_JianBianShuoMing()
{
switch (GetCurSym()->type)
{
case 14://integer
case 15://real
break;
default:
m_nErrorNum=12;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
switch (GetCurSym()->type)
{
case 1://id
break;
default:
m_nErrorNum=14;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
while (GetCurSym()->type==32)
{
NextSym();
switch (GetCurSym()->type)
{
case 1://id
break;
default:
m_nErrorNum=14;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
}
return TRUE;
}
int CCompiler::p_GuoChengShuoMing()
{
switch (GetCurSym()->type)
{
case 5://procedure
break;
default:
m_nErrorNum=15;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
switch (GetCurSym()->type)
{
case 1://id
break;
default:
m_nErrorNum=13;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
switch (GetCurSym()->type)
{
case 33://(
if (!p_XingChanBuFeng()) return FALSE;
break;
default:
;
}
switch (GetCurSym()->type)
{
case 30://;
break;
default:
m_nErrorNum=5;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
if (!p_ChengXuTi()) return FALSE;
return TRUE;
}
int CCompiler::p_XingChanBuFeng()
{
switch (GetCurSym()->type)
{
case 33://(
break;
default:
m_nErrorNum=16;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
if (!p_XingChan()) return FALSE;
while (GetCurSym()->type==30)
{
NextSym();
if (!p_XingChan()) return FALSE;
}
switch (GetCurSym()->type)
{
case 34://)
break;
default:
m_nErrorNum=17;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
return TRUE;
}
int CCompiler::p_XingChan()
{
if (GetCurSym()->type==4)//var
NextSym();
switch (GetCurSym()->type)
{
case 1://id
break;
default:
m_nErrorNum=18;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
while (GetCurSym()->type==32)//,
{
NextSym();
switch (GetCurSym()->type)
{
case 1://id
break;
default:
m_nErrorNum=18;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -