📄 myanylise.cpp
字号:
// MyAnylise.cpp: implementation of the CMyAnylise class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "dataBase.h"
#include "MyAnylise.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//struct item unit[MAXSIZE];
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMyAnylise::CMyAnylise()
{
CheckCMDType = 0;
m_str.Empty();
index = 0;
count_success = count_false =0;
loc=count=error=0;
memset(ch,0,MAXSIZE);
//init stack input
SETNULL(&stack);
SETNULL(&input);
//init word
int i=0;
for(i = 0;i < 100;i++)
{
word[i].kind = -1;
memset(word[i].name,0,10);
word[i].pointer = -1;
memset(word[i].mark,0,20);
}
// Symbol symbol[100];
for(i=0;i<100;i++)
{
memset(symbol[i].name,0,100);
}
// Constant constant[100];
for(i=0;i<100;i++)
{
constant[i].value=-1;
}
line=tokenval=0;
word_count=symbol_count=constant_count=name_count=key_count=0;
tokenfloat=0;
memset(name,0,10);
//key
strcpy(key[0],"CREATE");
strcpy(key[1],"TABLE");
strcpy(key[2],"VARCHAR");
strcpy(key[3],"CHAR");
strcpy(key[4],"INTEGER");
strcpy(key[5],"ALTER");
strcpy(key[6],"ADD");
strcpy(key[7],"DROP");
strcpy(key[8],"INDEX");
strcpy(key[9],"VIEW");
strcpy(key[10],"SELECT");
strcpy(key[11],"FROM");
strcpy(key[12],"AND");
strcpy(key[13],"OR");
strcpy(key[14],"WHERE");
strcpy(key[15],"INSERT");
strcpy(key[16],"INTO");
strcpy(key[17],"VALUES");
strcpy(key[18],"UPDATE");
strcpy(key[19],"SET");
strcpy(key[20],"DELETE");
strcpy(key[21],"GRANT");
strcpy(key[22],"REVOKE");
strcpy(key[23],"ON");
strcpy(key[24],"TO");
strcpy(key[25],"AS");
strcpy(key[26],"typedef");
strcpy(key[27],"union");
strcpy(key[28],"unsigned");
strcpy(key[29],"void");
strcpy(key[30],"volatile");
strcpy(key[31],"while");
// char yunsuanfu[20];
yunsuanfu[0]='=';
yunsuanfu[1]='<';
yunsuanfu[2]='>';
yunsuanfu[3]='+';
yunsuanfu[4]='-';
yunsuanfu[5]='*';
yunsuanfu[6]='/';
yunsuanfu[7]='&';
yunsuanfu[8]='%';
yunsuanfu[9]='!';
yunsuanfu[10]='|';
yunsuanfu[11]='~';
yunsuanfu[12]='\0';
yunsuanfu[13]='\0';
yunsuanfu[14]='\0';
yunsuanfu[15]='\0';
yunsuanfu[16]='\0';
yunsuanfu[17]='\0';
yunsuanfu[18]='\0';
yunsuanfu[19]='\0';
//char fengefu[20]="";
fengefu[0]=';';
fengefu[1]='.';
fengefu[2]=',';
fengefu[3]='(';
fengefu[4]=')';
fengefu[5]='\'';
fengefu[6]='[';
fengefu[7]=']';
fengefu[8]='{';
fengefu[9]='}';
fengefu[10]='?';
fengefu[11]='\"';
fengefu[12]='\0';
fengefu[13]='\0';
fengefu[14]='\0';
fengefu[15]='\0';
fengefu[16]='\0';
fengefu[17]='\0';
fengefu[18]='\0';
fengefu[19]='\0';
}
CMyAnylise::~CMyAnylise()
{
}
CMyAnylise::CMyAnylise(CString str)
{
// str.MakeUpper();
CheckCMDType = 0;
m_str = str;
index = 0;
count_success = count_false =0;
loc = count = error = 0;
memset(ch,0,MAXSIZE);
//init stack input
SETNULL(&stack);
SETNULL(&input);
//init word
int i=0;
for(i = 0;i < 100;i++)
{
word[i].kind = -1;
memset(word[i].name,0,10);
word[i].pointer = -1;
memset(word[i].mark,0,20);
}
// Symbol symbol[100];
for(i=0;i<100;i++)
{
memset(symbol[i].name,0,100);
}
// Constant constant[100];
for(i=0;i<100;i++)
{
constant[i].value=-1;
}
line=tokenval=0;
word_count=symbol_count=constant_count=name_count=key_count=0;
tokenfloat=0;
memset(name,0,10);
//key
strcpy(key[0],"CREATE");
strcpy(key[1],"TABLE");
strcpy(key[2],"VARCHAR");
strcpy(key[3],"CHAR");
strcpy(key[4],"INTEGER");
strcpy(key[5],"ALTER");
strcpy(key[6],"ADD");
strcpy(key[7],"DROP");
strcpy(key[8],"INDEX");
strcpy(key[9],"VIEW");
strcpy(key[10],"SELECT");
strcpy(key[11],"FROM");
strcpy(key[12],"AND");
strcpy(key[13],"OR");
strcpy(key[14],"WHERE");
strcpy(key[15],"INSERT");
strcpy(key[16],"INTO");
strcpy(key[17],"VALUES");
strcpy(key[18],"UPDATE");
strcpy(key[19],"SET");
strcpy(key[20],"DELETE");
strcpy(key[21],"GRANT");
strcpy(key[22],"REVOKE");
strcpy(key[23],"ON");
strcpy(key[24],"TO");
strcpy(key[25],"AS");
strcpy(key[26],"typedef");
strcpy(key[27],"union");
strcpy(key[28],"unsigned");
strcpy(key[29],"void");
strcpy(key[30],"volatile");
strcpy(key[31],"while");
// char yunsuanfu[20];
yunsuanfu[0]='=';
yunsuanfu[1]='<';
yunsuanfu[2]='>';
yunsuanfu[3]='+';
yunsuanfu[4]='-';
yunsuanfu[5]='*';
yunsuanfu[6]='/';
yunsuanfu[7]='&';
yunsuanfu[8]='%';
yunsuanfu[9]='!';
yunsuanfu[10]='|';
yunsuanfu[11]='~';
yunsuanfu[12]='\0';
yunsuanfu[13]='\0';
yunsuanfu[14]='\0';
yunsuanfu[15]='\0';
yunsuanfu[16]='\0';
yunsuanfu[17]='\0';
yunsuanfu[18]='\0';
yunsuanfu[19]='\0';
//char fengefu[20]="";
fengefu[0]=';';
fengefu[1]='.';
fengefu[2]=',';
fengefu[3]='(';
fengefu[4]=')';
fengefu[5]='\'';
fengefu[6]='[';
fengefu[7]=']';
fengefu[8]='{';
fengefu[9]='}';
fengefu[10]='?';
fengefu[11]='\"';
fengefu[12]='\0';
fengefu[13]='\0';
fengefu[14]='\0';
fengefu[15]='\0';
fengefu[16]='\0';
fengefu[17]='\0';
fengefu[18]='\0';
fengefu[19]='\0';
}
void CMyAnylise::SetIndex(int index)
{
this->index = index;
}
void CMyAnylise::SetString(CString str)
{
// str.MakeUpper();
m_str = str;
index = 0;
}
char CMyAnylise::PopChar()
{
return (index<m_str.GetLength())?m_str.GetAt(index++):NULL;
}
int CMyAnylise::isYunsuan(char a)
{
for(int i=0;i<20;i++)
{
if(a==yunsuanfu[i])
{
i=-1;
break;
}
}
return (i==20)?FALSE:TRUE;
}
int CMyAnylise::isFenge(char a)
{
for(int i=0;i<20;i++)
{
if(a==fengefu[i])
{
i=-1;
break;
}
}
return (i==20)?FALSE:TRUE;
}
void CMyAnylise::number(char w)
{
word[word_count].name[name_count]=w;name_count++;
tokenval=w-'0';
w=PopChar();
while(isdigit(w))/*整型数字处理*/
{
word[word_count].name[name_count]=w;name_count++;
tokenval=tokenval*10+w-'0';
w=PopChar();
}
// word[word_count].mark[0]='n';///做记号;
if(w=='.')/*浮点型数字处理*/
{
word[word_count].name[name_count]=w;name_count++;
w=PopChar();
int i=0;
while(isdigit(w))/*在数字范围内*/
{
word[word_count].name[name_count]=w;name_count++;
tokenval=tokenval*10+w-'0';
i++;
w=PopChar();
}
if(w==' '||w=='\n'||w=='\t'||w=='F'||w=='f'||w==','||w==';'||w=='+'||w=='-'||w=='*'||w=='/')
{
if(w=='\n')
{
line++;
}
tokenfloat=(float)tokenval;
for(int j=1;j<=i;j++)
{
tokenfloat=tokenfloat/10;
}
word[word_count].kind=2;
word[word_count].pointer=constant_count;
strcpy(word[word_count].mark,"num");
if(w=='f'||w=='F')
{
word[word_count].name[name_count]=w;
}
constant[constant_count].value=tokenfloat;
name_count=0;
word_count++;
constant_count++;
if(w!='f'&&w!='F')
{
//ungetc(w,stdin);
index--;
}
}
else
{
while(w!=' '&&w!='\n'&&w!='\t'&&!isYunsuan(w)&&!isFenge(w))
{
word[word_count].name[name_count]=w;
name_count++;
w=PopChar();
}
if(w=='\n')
{
line++;
}
if(isYunsuan(w)||isFenge(w))
{
//ungetc(w,stdin);
index--;
}
name_count=0;
CString m_sAlert;
m_sAlert.Format("Error at line %d : %s is wrong!",line,word[word_count].name);
//MessageBox(AfxGetMainWnd()->m_hWnd,m_sAlert,"错误!",MB_OK);
////cout<<"Error at line "<<line<<" : "<<word[word_count].name<<" is wrong!"<<endl;
word[word_count].kind=-1;
word_count++;
}
}
else if(w=='e'||w=='E')
{
word[word_count].name[name_count]=w;name_count++;
w=PopChar();
int token=0;
while(isdigit(w))/*在数字范围内*/
{
word[word_count].name[name_count]=w;name_count++;
token=token*10+w-'0';
w=PopChar();
}
if(w==' '||w=='\t'||w=='\n'||isYunsuan(w)||isFenge(w))
{
if(w=='\n')
{
line++;
}
else
//ungetc(w,stdin);
index--;
tokenfloat=(float)tokenval;
for(int j=0;j<token;j++)
{
tokenfloat=tokenfloat*10;
}
word[word_count].kind=2;
word[word_count].pointer=constant_count;
strcpy(word[word_count].mark,"n");
constant[constant_count].value=tokenfloat;
name_count=0;
word_count++;
constant_count++;
}
else
{
while(w!=' '&&w!='\n'&&w!='\t'&&!isYunsuan(w)&&!isFenge(w))
{
word[word_count].name[name_count]=w;
name_count++;
w=PopChar();
}
if(w=='\n')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -