这一部分是比较贴近实用的,目的是将字符串划分并且识别为一个个的表达式元件(Atom),使用正则表达式会很简单,但是,怎么说来着,咱们这次要求的不高,只要实现就好,所以额外的支持我都没有使用(比如hash和正则神马的,使用的只有标准C库)
int GetFromNumber(char *str,Atom *ele)
{
int i=0;
ele->type=Is_Value;
ele->data=(myFac*)new myValue;
ele->data->vlu=atof(str);
while(str[i]>='0' && str[i]<='9')i++;
if(str[i]=='.')
{
if(str[i+1]>='0' && str[i+1]<='9')i++;else return i;
while(str[i]>='0' && str[i]<='9')i++;
}
if(str[i]=='e')
{
if((str[i+1]=='-' || str[i+1]=='+')&&(str[i+2]>='0' && str[i+2]<='9'))i+=2;else if(str[i+1]>='0' && str[i+1]<='9')i++;else return i;
while(str[i]>='0' && str[i]<='9')i++;
}
return i;
}
int GetFromString(char *str,Atom *ele)
{
char u[8];
int i=0;
while((str[i]>='0' && str[i]<='9')||(str[i]>='a' && str[i]<='z')||(str[i]>='A' && str[i]<='Z')||str[i]=='_')(u[i]=str[i],i++);
u[i]='\0';
if(GetParam(u))
{
ele->type=Is_Param;
ele->data=(myFac*)new myParam;
ele->data->adr=GetParam(u);
}
else if(GetFun1p(u))
{
ele->type=Is_Fun1p;
ele->data=(myFac*)new myFun1p;
ele->data->fc1=GetFun1p(u);
}
else if(GetFun2p(u))
{
ele->type=Is_Fun2p;
ele->data=(myFac*)new myFun2p;
ele->data->fc2=GetFun2p(u);
}
else i=0;
return i;
}
int GetFromOthers(char *str,Atom *ele)
{
char u[3];
int i,j;
switch(str[0])
{
case '+':
case '-':
case '*':
case '/':
case '>':
case '<':
case '=':
case '!':
u[0]=str[0];
if(str[1]=='=')(u[1]='=',u[2]='\0';,i=2);else (u[1]='\0',i=1);
break;
case '&':
u[0]=u[1]='&';u[2]='\0';
if(str[1]=='&')i=2;else i=1;
break;
case '|':
u[0]=u[1]='|';u[2]='\0';
if(str[1]=='|')i=2;else i=1;
break;
case '$':
case '@':
case '#':
case '(':
case ',':
case ')':
u[0]=str[0];u[1]='\0';
i=1;
break;
default:
return 0;
break;
}
j=GetOpert(u);
switch(j)
{
case 1:
ele->type=Is_Setvr;
ele->data=(myFac*)new mySetvr;
strcpy(ele->data->opr,u);
break;
case 2:
case 3:
case 4:
case 5:
ele->type=Is_Opr2p;
ele->data=(myFac*)new myOpr2p;
strcpy(ele->data->opr,u);
break;
case 6:
ele->type=Is_Opr1p;
ele->data=(myFac*)new myOpr1p;
strcpy(ele->data->opr,u);
break;
default:
switch(u[0])
{
case '(':
ele->type=Is_Lquot;
ele->data=new myFac;
strcpy(ele->data->opr,u);
break;
case ',':
ele->type=Is_Comma;
ele->data=new myFac;
strcpy(ele->data->opr,u);
break;
case ')':
ele->type=Is_Rquot;
ele->data=new myFac;
strcpy(ele->data->opr,u);
break;
default:break;
}
break;
}
return i;
}
int GetAtom(char *str,Atom *ele)
{
char c=*str;
if(c>='0' && c<='9')
{
return GetFromNumber(str,ele);
}
else if((c>='a' && c<='z')||(c>='A' && c<='Z')||(c=='_'))
{
return GetFromString(str,ele);
}
else
{
return GetFromOthers(str,ele);
}
return 0;
}