www.pudn.com > bianyi大作业.zip > CheckFormulary.cpp
// CheckFormulary.cpp: implementation of the CCheckFormulary class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MyFormulary.h"
#include "CheckFormulary.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
int GetIndex(char ch)
{
switch(ch)
{
case 'Z':
return 0;
case 'E':
return 1;
case 'W':
return 2;
case 'T':
return 3;
case 'F':
return 4;
case 'P':
return 5;
case '+':
return 6;
case '*':
return 7;
case '^':
return 8;
case '(':
return 9;
case ')':
return 10;
case 'I':
return 11;
case '#':
return 12;
}
return -1;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCheckFormulary::CCheckFormulary()
{
}
CCheckFormulary::~CCheckFormulary()
{
}
void CCheckFormulary::GetTablePointer(CTable *pt)
{
m_pTable=pt;
}
FormularyWord CCheckFormulary::GetFormularyWord(WORD num)
{
FormularyWord fw;
switch(num)
{
case CTable::OPERATOR+0x0002:
fw.WordType='+';
break;
case CTable::OPERATOR+0x0009:
fw.WordType='*';
break;
case CTable::OPERATOR+0x001F:
fw.WordType='^';
break;
case CTable::SEPARATOR+0x0000:
fw.WordType='(';
break;
case CTable::SEPARATOR+0x0001:
fw.WordType=')';
break;
default:
if(num>=CTable::INTEGER && num=CTable::IDENTIFIER)fw.Number=0;
else if(num>=CTable::REAL)fw.Number=m_pTable->m_RealTable.GetAt(num-CTable::REAL);
else fw.Number=m_pTable->m_IntegerTable.GetAt(num-CTable::INTEGER);
}
else fw.WordType='U';
}
return fw;
}
FormularyWord CCheckFormulary::ReachWord(FormularyWord* s,int length)
{
FormularyWord fw;
if(length==1)
switch(s[0].WordType)
{
case 'E':
fw.WordType='Z';
fw.Number=s[0].Number;
break;
case 'W':
fw.WordType='E';
fw.Number=s[0].Number;
break;
case 'T':
fw.WordType='W';
fw.Number=s[0].Number;
break;
case 'F':
fw.WordType='T';
fw.Number=s[0].Number;
break;
case 'P':
fw.WordType='F';
fw.Number=s[0].Number;
break;
case 'I':
fw.WordType='P';
fw.Number=s[0].Number;
break;
default:
fw.WordType='U';
}
else if(length==3)
switch(s[0].WordType)
{
case 'E':
if(s[1].WordType=='+' && s[2].WordType=='W')
{
fw.WordType='E';
fw.Number=s[0].Number+s[2].Number;
}
else fw.WordType='U';
break;
case 'T':
if(s[1].WordType=='*' && s[2].WordType=='F')
{
fw.WordType='T';
fw.Number=s[0].Number*s[2].Number;
}
else fw.WordType='U';
break;
case 'P':
if(s[1].WordType=='^' && s[2].WordType=='F')
{
fw.WordType='F';
fw.Number=pow(s[0].Number,s[2].Number);
}
else fw.WordType='U';
break;
case '(':
if(s[1].WordType=='Z' && s[2].WordType==')')
{
fw.WordType='P';
fw.Number=s[1].Number;
}
else fw.WordType='U';
break;
default:
fw.WordType='U';
}
else fw.WordType='U';
return fw;
}
BOOL CCheckFormulary::Check(CWordArray &Source,CString &output)
{
BOOL IsSuccessful=TRUE;
output=_T("");
CString temp;
/////////////////////////////////////////
FormularyWord* T=new FormularyWord[Source.GetSize()+2];
FormularyWord* S=new FormularyWord[Source.GetSize()+2];
for(int i=0;i0)
{
if((g=GrammarTable[GetIndex(S[j-1].WordType)][GetIndex(S[j].WordType)])==__UNKNOWN__ || g==__LESS__)break;
j--;
}
if(g==__UNKNOWN__)
{
output+=_T("【错误:出现文法不可识别的单词连接");
output+=S[j-1].WordType;
output+=S[j].WordType;
output+=_T("】\r\n");
IsSuccessful=FALSE;
break;
}
if((V=ReachWord(S+j,i-j+1)).WordType=='U')
{
if(i==1 && S[i].WordType=='Z' && R.WordType=='#')
{
output+=_T("【正确:表达式符合文法】\r\n");
temp.Format("【运算结果=%g】\r\n",S[i].Number);
output+=temp;
}
else
{
output+=_T("【错误:出现文法无法归约的产生式");
for(ii=j;ii<=i;ii++)output+=S[ii].WordType;
output+=_T("】\r\n");
IsSuccessful=FALSE;
}
break;
}
S[i=j]=V;
temp.Format("【表达式%.3d】",nCount);
output+=temp;
for(ii=0;ii<=i;ii++)output+=S[ii].WordType;
for(ii=k-1;ii