www.pudn.com > CLanCompiler.rar > Compiler.cpp
// Compiler.cpp: implementation of the CCompiler class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CLanCompiler.h"
#include "Compiler.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#define LEN_KEYWORDTAB 11//关键字表长
#define LEN_OPRSYMTAB 11//运算符表长
#define LEN_BNDSYMTAB 8//界符表长
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//关键字表
const char tabKeyWord[LEN_KEYWORDTAB][10]=
{
"main",
"const",
"int",
"float",
"char",
"if",
"else",
"while",
"do",
"printf",
"scanf",
};
//运算符表
const char tabOprSym[LEN_OPRSYMTAB][3]=
{
"+",
"-",
"*",
"/",
"==",
"<",
">",
"!=",
"<=",
">=",
"="
};
//界符表
const char tabBndSym[LEN_BNDSYMTAB][2]=
{
";",
",",
"(",
")",
"{",
"}",
"\"",
"&"
};
CCompiler::CCompiler()
{
}
CCompiler::~CCompiler()
{
}
bool CCompiler::LexAnalysis(char *szstr)
{
SYNTAXERR seTemp;
if(!strcmp(szstr,"")) //如果没有发代码
{
seTemp.iSyntaxErrCode =SE_FE_NOCODE;
m_vectorSyntaxErr.push_back (seTemp);
return false;
}
LEXPROPERTYVS lpvTemp; //由词和属性构成的属性对
strlwr(szstr); //小写字符串
int nLen;
char *szTemp;
while (*szstr!='\0')
{
szstr=JumpNoMatterChar(szstr);
if(*szstr=='\0')
break;
nLen=0;
if(isalpha(*szstr)) //是否为字母
{
while (isalpha(*szstr)||isdigit(*szstr))
{
szstr++;
nLen++;
}//while
szTemp=new char[nLen];
memcpy(szTemp,szstr-nLen,nLen);
szTemp[nLen]='\0';
if(IsKeyWord(szTemp))
lpvTemp.lpProperty =KeyWord;
else //该字符串可能是变量、常量
lpvTemp.lpProperty =Id;
lpvTemp.szStr =szTemp;
m_vectorSymbol.push_back (lpvTemp);
} //if(isalpha(*szstr))
else
{
if(isdigit(*szstr))
{
while(isdigit(*szstr))
{
nLen++;
szstr++;
}//while
szTemp=new char[nLen];
memcpy(szTemp,szstr-nLen,nLen);
szTemp[nLen]='\0';
lpvTemp.szStr =szTemp;
lpvTemp.lpProperty =Const;
m_vectorSymbol.push_back (lpvTemp);
}//if(isdigit(*szstr))
else
{
char *szTemp=new char[3];
if(!isalpha(*szstr)&&!isdigit(*szstr)&&*szstr!='\0'
&&*szstr!='\r'&&*szstr!='\n'&&*szstr!=' '&&*szstr!=9)
{ //如果为其他运算符
szTemp[0]=*szstr;
szstr++;
}
switch(szTemp[0])
{
case '<':
if(*szstr=='=')
{
szTemp[1]='=';
szTemp[2]='\0';
szstr++;
}//if(*szstr=='=')
else
szTemp[1]='\0';
lpvTemp.lpProperty =OprSym;
break;
case '>':
if(*szstr=='=')
{
szTemp[1]='=';
szTemp[2]='\0';
szstr++;
}//if(*szstr=='=')
else
szTemp[1]='\0';
lpvTemp.lpProperty =OprSym;
break;
case '=':
if(*szstr=='=')
{
szTemp[1]='=';
szTemp[2]='\0';
szstr++;
}//if(*szstr=='=')
else
szTemp[1]='\0';
lpvTemp.lpProperty =OprSym;
break;
case '!':
if(*szstr=='=')
{
szTemp[1]='=';
szTemp[2]='\0';
szstr++;
}//if(*szstr=='=')
else
szTemp[1]='\0';
lpvTemp.lpProperty =OprSym;
break;
case '%':
if(*szstr=='d')
{
szTemp[1]='d';
szTemp[2]='\0';
szstr++;
}
else
szTemp[1]='\0';
lpvTemp.lpProperty =OprSym;
break;
default:
szTemp[1]='\0';
if(IsOprSym(szTemp))
lpvTemp.lpProperty =OprSym;
else if(IsBndSym(szTemp))
lpvTemp.lpProperty =BndSym;
else //有错误产生
{
lpvTemp.lpProperty =IllegalChar;
if(!flagChar)
{
seTemp.iSyntaxErrCode =SE_ILLEGALCHAR;
m_vectorSyntaxErr.push_back (seTemp);
flagChar=true;
}
}
break;
}//switch
lpvTemp.szStr =szTemp;
m_vectorSymbol.push_back (lpvTemp);
}// else
}// else
}// while
return true;
}
bool CCompiler::IsKeyWord(char *szStr)
{
for(int i=0;i=m_iVecterSize&&!flag)//语法出错:程序必须以} 结尾
{
errtemp.iSyntaxErrCode=HEADANDEND;
m_vectorSyntaxErr.push_back(errtemp);
flag=true;
return;
}
if(strcmp("}",m_vectorSymbol[m_iCurPointer++].szStr)&&!flag)//语法出错:程序必须以} 结尾
{
errtemp.iSyntaxErrCode=HEADANDEND;
m_vectorSyntaxErr.push_back(errtemp);
flag=true;
}
}
void CCompiler::Compile(char *szFile)
{
char *szStr;
int nLength;
CFile file(szFile,CFile::modeRead);
nLength=file.GetLength();
szStr=new char[nLength+1];
file.Read(szStr,nLength);
szStr[nLength]='\0';
file.Close ();
CString str;
//复位符号表指针
m_vectorSyntaxErr.clear(); //清空语法错误向量
m_vectorSymbol.clear(); //清空符号表向量
if(LexAnalysis(szStr))//词法分析
{ //输出错误向量
Analysis();//语法分析
OutErrToFile();
}
}
void CCompiler::Analysis_Prog()
{
SYNTAXERR errtemp;
if(!strcmp("}",m_vectorSymbol[m_iCurPointer].szStr))
{
errtemp.iSyntaxErrCode=HAVENOBODY;
m_vectorSyntaxErr.push_back(errtemp);
return;
}
Analysis_Const();
if(!Analysis_Var())
return;
if(!strcmp("}",m_vectorSymbol[m_iCurPointer].szStr))
return;
while(strcmp("}",m_vectorSymbol[m_iCurPointer].szStr))
{
if(!strcmp("if",m_vectorSymbol[m_iCurPointer].szStr))
Analysis_if_eslse();
else if(!strcmp("while",m_vectorSymbol[m_iCurPointer].szStr))
Analysis_while();
else if(!strcmp("printf",m_vectorSymbol[m_iCurPointer].szStr))
Analysis_printf();
else if(!strcmp("scanf",m_vectorSymbol[m_iCurPointer].szStr))
Analysis_scanf();
else
Analysis_Statement();
if(m_iCurPointer>=m_iVecterSize)
return;
}
}
void CCompiler::Analysis_Id()
{
SYNTAXERR errtemp;
int size=strlen(m_vectorSymbol[m_iCurPointer].szStr);
if(!isalpha(m_vectorSymbol[m_iCurPointer].szStr[0]))
{
m_iCurPointer++;
errtemp.iSyntaxErrCode=NAMEERR;
m_vectorSyntaxErr.push_back(errtemp);
return;
}
for(int i=1;i=m_iVecterSize)
return;
}
}
bool CCompiler::Analysis_Var()
{
SYNTAXERR errtemp;
if(strcmp("int",m_vectorSymbol[m_iCurPointer].szStr))
{
errtemp.iSyntaxErrCode=NEEDVAR;
m_vectorSyntaxErr.push_back(errtemp);
return false;
}
m_iCurPointer++;
b: Analysis_Id();
if(!strcmp(";",m_vectorSymbol[m_iCurPointer++].szStr))
return true;
m_iCurPointer--;
if(strcmp(",",m_vectorSymbol[m_iCurPointer++].szStr)&&!flagVar)
{
errtemp.iSyntaxErrCode=CONSTANDVARERR;
m_vectorSyntaxErr.push_back(errtemp);
flagVar=true;
}
goto b;
return true;
}
void CCompiler::Analysis_Number()
{
SYNTAXERR errtemp;
int iSize=strlen(m_vectorSymbol[m_iCurPointer].szStr);
for(int i=0;i