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