www.pudn.com > bianyi大作业.zip > AccidenceAnalysis.cpp
// AccidenceAnalysis.cpp:implementation of the CAccidenceAnalysis class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MyFormulary.h"
#include "AccidenceAnalysis.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAccidenceAnalysis::CAccidenceAnalysis()
{
}
CAccidenceAnalysis::~CAccidenceAnalysis()
{
}
void CAccidenceAnalysis::GetTablePointer(CTable *pt)
{
m_pTable=pt;
}
int CAccidenceAnalysis::PreCheck(CString &source, CString &destination)
{
destination=_T("");
STATUS Status=COMMON;
int nError=0;
int nCurrPos=0,nLength=source.GetLength();
int nCount=0;
while(nCurrPosTablesInitialization();
output.RemoveAll();
destination=_T("");
CTable::WORDTYPE Wordtype=CTable::UNKNOWN;
BYTE chCurrChar='\0';
CString CurrString=_T("");
CString Temp=_T("");
WORD wNumber=0;
DWORD dwCurrNum=0;
double fCurrNum=0;
int nCount=0,nError=0;
int nIndex=0,nSize=0;
int nCurrPos=0,nLength=source.GetLength();
while(nCurrPos='A' && chCurrChar<='Z') || (chCurrChar>='a' && chCurrChar<='z'))Wordtype=CTable::KEYWORD;
else if((chCurrChar>='0' && chCurrChar<='9') || (chCurrChar=='.' && nCurrPos+1='0' && source.GetAt(nCurrPos+1)<='9'))Wordtype=CTable::REAL;
else Wordtype=CTable::OPERATOR;
do
switch(Wordtype)
{
case CTable::COMMAND:
CurrString=chCurrChar;
while(++nCurrPos='0' && chCurrChar<='9') || (chCurrChar>='A' && chCurrChar<='Z') || (chCurrChar>='a' && chCurrChar<='z'))CurrString+=chCurrChar;
else break;
}
nSize=m_pTable->m_CommandTable.GetSize();
for(nIndex=0;nIndexm_CommandTable.GetAt(nIndex))
{
wNumber=CTable::COMMAND+nIndex;
Wordtype=CTable::UNKNOWN;
break;
}
if(Wordtype==CTable::COMMAND)
{
nError++;
wNumber=CTable::ERRORCODE;
CurrString=_T("【错误:未知命令字 ")+CurrString+_T(" 】");
Wordtype=CTable::UNKNOWN;
}
output.Add(wNumber);
Temp.Format("%.2d.命令字:",output.GetSize());
destination+=Temp;
destination+=CurrString;
destination+=_T("\r\n");
break;
case CTable::KEYWORD:
CurrString=chCurrChar;
while(++nCurrPos='0' && chCurrChar<='9') || (chCurrChar>='A' && chCurrChar<='Z') || (chCurrChar>='a' && chCurrChar<='z'))CurrString+=chCurrChar;
else break;
}
nSize=m_pTable->m_KeywordTable.GetSize();
for(nIndex=0;nIndexm_KeywordTable.GetAt(nIndex))
{
wNumber=CTable::KEYWORD+nIndex;
Wordtype=CTable::UNKNOWN;
break;
}
if(Wordtype==CTable::KEYWORD)Wordtype=CTable::IDENTIFIER;
else
{
output.Add(wNumber);
Temp.Format("%.2d.关键字:",output.GetSize());
destination+=Temp;
destination+=CurrString;
destination+=_T("\r\n");
}
break;
case CTable::IDENTIFIER:
nSize=m_pTable->m_IdentifierTable.GetSize();
for(nIndex=0;nIndexm_IdentifierTable.GetAt(nIndex))
{
wNumber=CTable::IDENTIFIER+nIndex;
Wordtype=CTable::UNKNOWN;
break;
}
if(Wordtype==CTable::IDENTIFIER)
{
m_pTable->m_IdentifierTable.Add(CurrString);
wNumber=CTable::IDENTIFIER+nSize;
Wordtype=CTable::UNKNOWN;
}
output.Add(wNumber);
Temp.Format("%.2d.标识符:",output.GetSize());
destination+=Temp;
destination+=CurrString;
destination+=_T("\r\n");
break;
case CTable::OPERATOR:
nSize=m_pTable->m_OperatorTable.GetSize();
for(nIndex=0;nIndexm_OperatorTable.GetAt(nIndex);
if(CurrString==source.Mid(nCurrPos,CurrString.GetLength()))
{
nCurrPos+=CurrString.GetLength();
wNumber=CTable::OPERATOR+nIndex;
Wordtype=CTable::UNKNOWN;
break;
}
}
if(Wordtype==CTable::OPERATOR)Wordtype=CTable::SEPARATOR;
else
{
output.Add(wNumber);
Temp.Format("%.2d.运算符:",output.GetSize());
destination+=Temp;
destination+=CurrString;
destination+=_T("\r\n");
}
break;
case CTable::SEPARATOR:
nSize=m_pTable->m_SeparatorTable.GetSize();
for(nIndex=0;nIndexm_SeparatorTable.GetAt(nIndex);
if(CurrString==source.Mid(nCurrPos,CurrString.GetLength()))
{
nCurrPos+=CurrString.GetLength();
wNumber=CTable::SEPARATOR+nIndex;
Wordtype=CTable::UNKNOWN;
break;
}
}
if(Wordtype==CTable::SEPARATOR)
{
nError++;
wNumber=CTable::ERRORCODE;
CurrString.Format("【错误:未知分隔符 %c 】",source.GetAt(nCurrPos));
nCurrPos++;
Wordtype=CTable::UNKNOWN;
}
output.Add(wNumber);
Temp.Format("%.2d.分隔符:",output.GetSize());
destination+=Temp;
destination+=CurrString;
destination+=_T("\r\n");
break;
case CTable::CHARACTER:
CurrString=_T("");
while((chCurrChar=source.GetAt(++nCurrPos))!='\'')
{
CurrString+=chCurrChar;
if(chCurrChar=='\\')CurrString+=source.GetAt(++nCurrPos);
}
nCurrPos++;
nSize=m_pTable->m_CharacterTable.GetSize();
for(nIndex=0;nIndexm_CharacterTable.GetAt(nIndex))
{
wNumber=CTable::CHARACTER+nIndex;
Wordtype=CTable::UNKNOWN;
break;
}
if(Wordtype==CTable::CHARACTER)
{
m_pTable->m_CharacterTable.Add(CurrString);
wNumber=CTable::CHARACTER+nSize;
Wordtype=CTable::UNKNOWN;
}
output.Add(wNumber);
Temp.Format("%.2d.单字符:",output.GetSize());
destination+=Temp;
destination+=('\''+CurrString+'\'');
destination+=_T("\r\n");
break;
case CTable::STRING:
CurrString=_T("");
while((chCurrChar=source.GetAt(++nCurrPos))!='\"')
{
CurrString+=chCurrChar;
if(chCurrChar=='\\')CurrString+=source.GetAt(++nCurrPos);
}
nCurrPos++;
nSize=m_pTable->m_StringTable.GetSize();
for(nIndex=0;nIndexm_StringTable.GetAt(nIndex))
{
wNumber=CTable::STRING+nIndex;
Wordtype=CTable::UNKNOWN;
break;
}
if(Wordtype==CTable::STRING)
{
m_pTable->m_StringTable.Add(CurrString);
wNumber=CTable::STRING+nSize;
Wordtype=CTable::UNKNOWN;
}
output.Add(wNumber);
Temp.Format("%.2d.字符串:",output.GetSize());
destination+=Temp;
destination+=('\"'+CurrString+'\"');
destination+=_T("\r\n");
break;
case CTable::INTEGER:
nCount=0;
if(chCurrChar=='\0')
{
dwCurrNum=0;
if(CurrString.GetLength()>1)
if(CurrString.GetAt(1)=='x')
if((nSize=CurrString.GetLength())<3)nCount++;
else
for(nIndex=2;nIndex='0' && chCurrChar<='9')dwCurrNum+=(chCurrChar-'0');
else if(chCurrChar>='A' && chCurrChar<='F')dwCurrNum+=(chCurrChar-'A'+10);
else if(chCurrChar>='a' && chCurrChar<='f')dwCurrNum+=(chCurrChar-'a'+10);
else
{
nCount++;
break;
}
}
else
{
nSize=CurrString.GetLength();
for(nIndex=1;nIndex='0' && chCurrChar<='7')(dwCurrNum<<=3)+=(chCurrChar-'0');
else
{
nCount++;
break;
}
}
}
}
if(nCount)
{
nError++;
wNumber=CTable::ERRORCODE;
CurrString=_T("【错误:未知的整型数 ")+CurrString+_T(" 】");
Wordtype=CTable::UNKNOWN;
}
else
{
nSize=m_pTable->m_IntegerTable.GetSize();
for(nIndex=0;nIndexm_IntegerTable.GetAt(nIndex))
{
wNumber=CTable::INTEGER+nIndex;
Wordtype=CTable::UNKNOWN;
break;
}
if(Wordtype==CTable::INTEGER)
{
m_pTable->m_IntegerTable.Add(dwCurrNum);
wNumber=CTable::INTEGER+nSize;
Wordtype=CTable::UNKNOWN;
}
}
output.Add(wNumber);
Temp.Format("%.2d.整型数:",output.GetSize());
destination+=Temp;
destination+=CurrString;
destination+=_T("\r\n");
break;
case CTable::REAL:
fCurrNum=0;
nCount=0;
if((CurrString=chCurrChar)==".")nCount++;
while(++nCurrPos='0' && chCurrChar<='9')CurrString+=chCurrChar;
else if(chCurrChar=='.')
{
CurrString+=chCurrChar;
nCount++;
}
else if((chCurrChar>='A' && chCurrChar<='Z') || (chCurrChar>='a' && chCurrChar<='z'))
{
CurrString+=chCurrChar;
nCount+=0x1000;
}
else break;
}
if(CurrString.GetAt(0)=='0' && (nCount&0x00FF)==0)
{
Wordtype=CTable::INTEGER;
chCurrChar='\0';
break;
}
if(nCount>1 || CurrString.GetAt(CurrString.GetLength()-1)=='.')
{
nError++;
wNumber=CTable::ERRORCODE;
CurrString=_T("【错误:未知的实型数 ")+CurrString+_T(" 】");
Wordtype=CTable::UNKNOWN;
}
else
{
for(nIndex=0;nIndexnIndex;i--)(fTempNum/=10)+=(CurrString.GetAt(i)-'0');
fCurrNum+=fTempNum/10;
break;
}
}
if(nCount || fCurrNum>0xFFFFFFFF)
{
nSize=m_pTable->m_RealTable.GetSize();
for(nIndex=0;nIndexm_RealTable.GetAt(nIndex))
{
wNumber=CTable::REAL+nIndex;
Wordtype=CTable::UNKNOWN;
break;
}
if(Wordtype==CTable::REAL)
{
m_pTable->m_RealTable.Add(fCurrNum);
wNumber=CTable::REAL+nSize;
Wordtype=CTable::UNKNOWN;
}
}
else
{
dwCurrNum=(DWORD)fCurrNum;
Wordtype=CTable::INTEGER;
break;
}
}
output.Add(wNumber);
Temp.Format("%.2d.实型数:",output.GetSize());
destination+=Temp;
destination+=CurrString;
destination+=_T("\r\n");
}
while(Wordtype!=CTable::UNKNOWN);
}
return nError;
}