📄 intepretor.cpp
字号:
{
case I:
tmin.IntValue = atoi(StrNow->str);
NextStr();
PassCommon("and");
tmax.IntValue = atoi(StrNow->str);
NextStr();
pColtemp->SetColValint(optype,tmin.IntValue,tmax.IntValue);
break;
case F:
tmin.FloatValue = atof(StrNow->str);
NextStr();
PassCommon("and");
tmax.FloatValue = atof(StrNow->str);
NextStr();
pColtemp->SetColValfloat(optype,tmin.FloatValue,tmax.FloatValue);
break;
case C:
tmin.pCharValue = FilterQuota(StrNow->str);
NextStr();
PassCommon("and");
tmax.pCharValue = FilterQuota(StrNow->str);
pColtemp->SetColValstr(optype,tmin.pCharValue,tmax.pCharValue);
break;
}
}
else //<--- 非Between的操作类型,就可以直接设置
{SetMin_Max(tmin,tmax,optype,coltype);
pColtemp->SetColVal(optype,tmin,tmax);
} //<--- 善后工作
PassCommon(")");
if(CompStrEver(StrNow->str,","))
NextStr();
else
if(CompStrEver(StrNow->str,")"))
*NotEnd = 0;
}
EOPE_TYPE Ch_csVstrBlk::GetOptype()
{
/*****************************************************************
** 功能描述:得到一个列的操作类型
enum Operator_Type {B, BE, L, LE, E, NE,BETWEEN};
****************************************************************/
VSTR_BLK_PTR StrTemp = StrNow;
EOPE_TYPE ret;
if(CompStrEver(StrNow->str,"between"))
ret = BETWEEN;
else
if(CompStrEver(StrNow->str,"="))
{
NextStr();
ret = E;}
else
if(CompStrEver(StrNow->str,"!"))
{NextStr();
PassCommon("=");
ret = NE;
}
else
if(CompStrEver(StrNow->str,">"))
{NextStr();
if(CompStrEver(StrNow->str,"="))
{NextStr();
ret = BE;}
else
ret = B;
}
else
if(CompStrEver(StrNow->str,"<"))
{NextStr();
if(CompStrEver(StrNow->str,"=")) //<--- 但是<时还要判断后面有没有=
{
NextStr();
ret = LE;}
else
ret = L;
}
else
ThrowStrErr(GET_OP_ERR,iNumNowInVstr);
return ret;
}
pCreate_Column Ch_csVstrBlk::GetColForCheck(char* str,pCreate_Column pHead)
{
/*****************************************************************
** 已知check中的列名,在前面已经只好的pHead列表中寻找该列的各个相关信息
****************************************************************/
pCreate_Column pCol = pHead,pTemp;
bool bNotFind = 1;
for(;pCol != 0 && bNotFind; pCol = pCol->next)
{bNotFind = !(CompStrEver(pCol->ColumnName,str));
pTemp = pCol;
} //<--- 在列链表中搜索所要找的列名
NextStr();
if(bNotFind)
ThrowStrErr(COLNAMEERR_IN_CHECK,iNumNowInVstr);//<--- check的列名实际上并不存在
return pTemp;
}
pCreate_Column Ch_csVstrBlk::GetColumnInfo(bool* NotEnd,bool& bPriKeyExist)
{
char strColName[NAMEMAXLEN];
bool bError = 0,isnulltemp = 0,ispritemp = 0,ColNotEnd = 1;
VSTR_BLK_PTR StrTemp = 0;
pCreate_Column csOneCol = 0;
ECOL_TYPE coltypetemp;
int iStrlen = 0;
strcpy(strColName,StrNow->str); //<--- 得到一列的列名信息
NextStr();
if(CompStrEver(StrNow->str,"char"))
{ //<--- 针对字段类型是char
coltypetemp = C;
NextStr();
PassCommon("(");
if(CompStrEver(StrNow->str,")"))
iStrlen = 0;
else
{iStrlen = atoi(StrNow->str);
NextStr();} //<--- 如将har(8)中的8取得
PassCommon(")");
}
else
if(CompStrEver(StrNow->str,"int"))
{ //<--- 针对字段类型是int
coltypetemp = I;
NextStr();
}
else
if(CompStrEver(StrNow->str,"float"))
{ //<--- 针对字段类型是float
coltypetemp = F;
NextStr();
}
else
bError = 1;
if(bError == 1)
ThrowStrErr(COLUMNTYPE,iNumNowInVstr);
do
{
if(CompStrEver(StrNow->str,"notnull")) //<--- 有关一个列的定义之后如带有notnull或primary则记录下信息
{isnulltemp = 0;
NextStr();}
else
if(CompStrEver(StrNow->str,"primary"))
{ispritemp = 1;
bPriKeyExist = 1; //<--- primary key exists
NextStr();}
else
if(CompStrEver(StrNow->str,","))
{
ColNotEnd = 0;
NextStr();
}
else
if(CompStrEver(StrNow->str,")"))
{ColNotEnd = 0;
*NotEnd = 0;}
else
ThrowStrErr(KEYWORD,iNumNowInVstr);
}while(ColNotEnd);
csOneCol = new Create_Column(strColName,coltypetemp,iStrlen,isnulltemp,ispritemp);
return csOneCol;
}
void Ch_csVstrBlk::NextStr()
{
/*****************************************************************
** 功能描述: 转到下一个StrNow(即StrNow = StrNow->Next)
****************************************************************/
iNumNowInVstr++;
StrNow = StrNow->next;
}
char* Ch_csVstrBlk::GetTBName()
{ //<--- 取得表名
char* strTBName = new char[NAMEMAXLEN];
strcpy(strTBName,StrNow->str);
NextStr();
return strTBName;
}
void Ch_csVstrBlk::PassCommon(char* pStrIn)
/*****************************************************************
对StrNow当前所指的字串是否和输入的字串一致,一致---
则iNumNowInVstr++,StrNow = StrNow->next;
不一致--- ThrowStrErr(COMMON,iNumNowInVstr);
COMMON--意为所处理的是一般的关键字解析
****************************************************************/
{
if(CompStrEver(pStrIn,StrNow->str))
NextStr();
else
ThrowStrErr(COMMON,iNumNowInVstr);
}
ECMD_TYPE Ch_csVstrBlk::ResolveCmd()
/*****************************************************************
** 功能描述:解析取得命令
//<--- enum MSG { CREATE, SELECT, INSERT, UPDATE, DELETE, DROP, QUIT} ;
****************************************************************/
{
ECMD_TYPE ReturnValue = HELP;
bool bError = 0;
if(CompStrEver(StrNow->str,"HELP"))
{ReturnValue = HELP;}
else
if(CompStrEver(StrNow->str,"QUIT"))
{ReturnValue = QUIT;}
else
if(CompStrEver(StrNow->str,"EXIT"))
{ReturnValue = QUIT;}
else
if(CompStrEver(StrNow->str,"DROPDB"))
ReturnValue = DROPDB;
else
if(CompStrEver(StrNow->str,"SHOWDB"))
ReturnValue = SHOWDB;
else
if(CompStrEver(StrNow->str,"USE"))
ReturnValue = USE;
else
if(CompStrEver(StrNow->str,"NEW"))
ReturnValue = NEW;
else
if(CompStrEver(StrNow->str,"DROP"))
ReturnValue = DROP;
else
{
if(CompStrEver(StrNow->str,"CREATE"))
ReturnValue = CREATE;
else
if(CompStrEver(StrNow->str,"SELECT"))
ReturnValue = SELECT;
else
if(CompStrEver(StrNow->str,"INSERT"))
ReturnValue = INSERT;
else
if(CompStrEver(StrNow->str,"UPDATE"))
ReturnValue = UPDATE;
else
if(CompStrEver(StrNow->str,"DELETE"))
ReturnValue = DELETE;
else
if(CompStrEver(StrNow->str,"SHOWTABLE"))
ReturnValue = SHOWTABLE;
else
bError = 1;}
if(bError == 1)
ThrowStrErr(RESOLVE,iNumNowInVstr);
else
NextStr(); //<--- 第一个有意字串不出错,则iNumNowInVstr+1
return ReturnValue;
}
void Ch_csVstrBlk::ThrowStrErr(int type,int iNum)
{ //<--- 负责构造一个错误类并将它抛出来,由主函数来处理
ErrInfo eiTemp;
int iLine = 0;
int i = 0;
char* str = new char[NAMEMAXLEN];
VSTR_BLK_PTR StrTemp = StrHead;
for(;iNum > iLineNum[iLine][1];iLine++)
;
i = iNum; //<--- 查找出错在那一行
for(; i != 0;i--)
StrTemp = StrTemp->next; //<--- 查找出错在哪个有意字串
eiTemp.iErrType = type;
eiTemp.iLineNo = iLine;
strcpy(str,StrTemp->str);
eiTemp.pErrStr = str;
throw(eiTemp);
}
//<--- 设置好列中的Min&Max约束
void Ch_csVstrBlk::SetMin_Max(COLVAL temp,COLVAL& min,COLVAL& max,EOPE_TYPE optype,ECOL_TYPE coltype)
{
switch(optype)
{
case E:
case NE:
switch(coltype)
{case I:
min = temp;
max = min;
break;
case F:
min = temp;
max = min;
break;
case C:
min = temp;
max = min;
break;
}
case LE:
case L:
switch(coltype)
{case I:
max = temp;
break;
case F:
max = temp;
break;
case C:
max.pCharValue = FilterQuota(temp.pCharValue);
break;
}
case B:
case BE:
switch(coltype)
{case I:
min = temp;
break;
case F:
min = temp;
break;
case C:
min.pCharValue = FilterQuota(temp.pCharValue);
break;
}
}
}
void Ch_csVstrBlk::SetMin_Max(COLVAL& min,COLVAL& max,EOPE_TYPE optype,ECOL_TYPE coltype,bool next)
{
/*******************************************************************
功能描述:根据optype给min和max赋值
当前StrNow必须处在处理的有意字串上
enum Operator_Type {B, BE, L, LE, E, NE,BETWEEN};
****************************************************************/
switch(optype)
{
case E:
case NE:
switch(coltype)
{case I:
min.IntValue = atoi(StrNow->str);
max.IntValue = min.IntValue;
break;
case F:
min.FloatValue = atof(StrNow->str);
max.FloatValue = min.FloatValue;
break;
case C:
min.pCharValue = FilterQuota(StrNow->str);
max.pCharValue = min.pCharValue;
break;
}
case LE:
case L:
switch(coltype)
{case I:
max.IntValue = atoi(StrNow->str);
break;
case F:
max.FloatValue = atof(StrNow->str);
break;
case C:
max.pCharValue = FilterQuota(StrNow->str);
break;
}
case B:
case BE:
switch(coltype)
{case I:
min.IntValue = atoi(StrNow->str);
break;
case F:
min.FloatValue = atof(StrNow->str);
break;
case C:
min.pCharValue = FilterQuota(StrNow->str);
break;
}
}
if(next)
NextStr();
}
/***********************结构体TB_Create_Info***********************/
TB_Create_Info::TB_Create_Info(int i,pCreate_Column p,char* str):TotalColumn(i),head(p)
{
strcpy(TableName,str);
}
/***********************结构体Create_Column***********************/
Create_Column::Create_Column(char* str,ECOL_TYPE coltype,int strlen,bool is_null,bool ispri):
ColType(coltype),length(strlen),IsNull(is_null),isprimary(ispri),next(0)
{
strcpy(ColumnName,str);
switch(coltype)
{case C ://<--- 即该列为字符
min.pCharValue = new char[2];
strcpy(min.pCharValue,"z");
max.pCharValue = new char[2];
strcpy(max.pCharValue,"a");
break;
case F ://<--- 即该列为浮点数
min.FloatValue = 1.0;
max.FloatValue = 0;
break;
case I ://<--- 即该列为整数
min.IntValue = 1;
max.IntValue = -1;
break;
default :
break;
}
}
void Create_Column::SetColVal(EOPE_TYPE optype,COLVAL &tMin ,COLVAL &tMax)
{
OperType = optype;
min = tMin;
max = tMax;
}
void Create_Column::SetColValstr(EOPE_TYPE optype,char* chMin = 0,char* chMax = 0)
{
/*****************************************************************
将Create_Column()里未根据实际初始的min.pCharValue,max.pCharValue初始一下,并设定好长度
****************************************************************/
int iStrLen = length;
OperType = optype;
if(chMin != 0) //<--- 如果min.pCharValue和max.pCharValue有范围限制
{delete min.pCharValue;
delete max.pCharValue;
if(length == 0)
iStrLen = NAMEMAXLEN;
min.pCharValue = new char[iStrLen];
max.pCharValue = new char[iStrLen];
strcpy(min.pCharValue,chMin);
strcpy(max.pCharValue,chMax);
}
}
void Create_Column::SetColValint(EOPE_TYPE optype,int iMin,int iMax)
{
/*****************************************************************
将Create_Column()里未根据实际初始的min.IntValue,max.IntValue初始一下
****************************************************************/
min.IntValue = iMin;
max.IntValue = iMax;
OperType = optype;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -