#include "check.h"
/*
static char *pKeyWord[3];
static const char key0[5] = {'e','x','i','t','\0'};//exit
static const char key1[6] = {'c','l','e','a','r','\0'};//clear
static const char key2[5] = {'l','i','s','t','\0'};//list
pKeyWord[0] = key0;
pKeyWord[1] = key1;
pKeyWord[2] = key2;*/
//"help"显示处理
static void HelpDisp(void)
{
printf("\n");
printf(" My help ^ ^\n");
printf("\n");
printf(" 目前支持如下几个功能:\n\n");
printf(" 1.表达式运算,支持括号\n");
printf(" 表达式输入方法与Matlab十分类似,形式灵活,支持错误检查,例如:\n");
printf(" >> a = 12.6*(1.0 +-- 5*(10.8-2))\n");
printf(" >> a + 9.5\n");
printf(" >> a\n\n");
printf(" 2.变量的定义与存储,定义的变量将自动保存,可使用的命令:\n");
printf(" list: 查看已定义变量\n");
printf(" clear: 清除所有已定义变量\n\n");
printf(" exit: 退出程序\n");
printf("\n");
}
//判断一个字符是否为数字(不包括'.')
extern bool bIsNum(char cha)
{
if((cha >= '0') && (cha <= '9'))
{
return true;
}
else
{
return false;
}
}
//判断一个字符是否为数值(包括'.')
extern bool bIsNumrc(char cha)
{
if((cha >= '0') && (cha <= '9'))
{
return true;
}
else if(cha == '.')
{
return true;
}
else
{
return false;
}
}
//判断一个字符是否为字母
extern bool bIsLetter(char cha)
{
if( ((cha >= 'A') && (cha <= 'Z')) || ((cha >= 'a') && (cha <= 'z')) )
{
return true;
}
else
{
return false;
}
}
//判断一个字符是否是'+'、'-'号
extern bool bIsPlusSub(char cha)
{
if((cha=='+') || (cha=='-'))
{
return true;
}
else
{
return false;
}
}
//判断一个字符是否是'*'、'/'号
static bool bIsMulDiv(char cha)
{
if((cha=='*') || (cha=='/'))
{
return true;
}
else
{
return false;
}
}
//判断一个字符是否为运算符
static bool bIsOpe(char cha)
{
if((cha=='+') || (cha=='-') || (cha=='*') || (cha=='/'))
{
return true;
}
else
{
return false;
}
}
//判断一个字符是否为括号
static bool bIsBrckt(char cha)
{
if((cha=='(') || (cha==')') )
{
return true;
}
else
{
return false;
}
}
//判断一个字符是否为是变量合法字符(字母、数字、'_')
extern bool bIsVarChar(char cha)
{
if((cha == '_') || bIsNum(cha) || bIsLetter(cha))
{
return true;
}
else
{
return false;
}
}
//判断一个字符是否为操作数合法字符(字母、数值、'_'、'['、']')
static bool bIsOpeChar(char cha)
{
if((cha == '_') || (cha == '[') || (cha == ']') || bIsNumrc(cha) || bIsLetter(cha))
{
return true;
}
else
{
return false;
}
}
//判断变量字符合法性
static bool bIsLawVar(char *pVar,int length)
{
int i;
int ForLoc;//前部非空格字符位置
int BckLoc;//尾部非空格字符位置
for(i=0; (pVar[i] == ' ') && (i < length); i++);//跳过前端的空格
ForLoc = i;
for(i=length-1; (pVar[i] == ' ') && (i >= 0); i--);//跳过尾部的空格
BckLoc = i;
//全部为空格
if(ForLoc > BckLoc)
{
return CHECK_ERR;
}
//首字符为数字
if(bIsNum(pVar[ForLoc]))
{
return CHECK_ERR;
}
//含有变量非法字符
for(i=ForLoc; i<=BckLoc; i++)
{
if(!bIsVarChar(pVar[i]))
{
return CHECK_ERR;
}
}
return CHECK_RGHT;
}
//判断表达式是否含有'='
extern bool bIncEquSign(char *form,int length)
{
int i;
for(i=0;i<length;i++)
{
if(form[i] == '=')
{
return true;
}
}
return false;
}
//检查表达式中的等号
static bool CheckEqual(char *form,int length,int *pErrLoc)
{
int i;
int NumEqu = 0;
char Varchar[32] = {'\0'};
for(i=0; i<length; i++)
{
if(form[i] == '=')
{
//等号数量检查
NumEqu++;
if(NumEqu > 1)
{
*pErrLoc = i;
return CHECK_ERR;
}
//'='右边是'*'、'/'操作符
if(bIsMulDiv(form[i+1]) || (i==length-1))
{
*pErrLoc = i+1;
return CHECK_ERR;
}
}
}
//无等号
if(NumEqu == 0)
{
return CHECK_RGHT;
}
//等号左侧变量名合法性检查
for(i=0; form[i] != '='; i++)//取出等号左侧部分
{
Varchar[i] = form[i];
}
Varchar[i] = '\0';
if(bIsLawVar(Varchar,strlen(Varchar)))//出现非法字符
{
*pErrLoc = i-1;
return CHECK_ERR;
}
return CHECK_RGHT;
}
/************************************************************************
**函数名称:CheckVar()
**函数说明:检查'='右边的变量是否已定义(或无'='表达式中的变量是否已定义)
**输入参数:char *form,表达式数组
** int length,表达式长度
** int *pErrLoc,错误位置记录
**输出参数:找到匹配变量返回true,否则返回false
*************************************************************************/
static bool CheckVar(char *form,int length,int *pErrLoc)
{
int i = 0;//
int j = 0;
char Var[32] = {'\0'};
//找到'='位置
if(bIncEquSign(form,strlen(form)))//有'='时
{
for(i=0; form[i] != '='; i++);
}
while(i < length)
{
//找到变量首字符
for(;i<length;i++)
{
if(bIsLetter(form[i]) || (form[i] == '_'))
{
break;
}
}
if(i >= length)
{
break;
}
//取出变量
for(j=0; i<length; i++,j++)
{
if(bIsVarChar(form[i]))
{
Var[j] = form[i];
}
else
{
break;
}
}
//判断变量是否已经定义
if(MatchVar(Var) == -1)//未定义
{
*pErrLoc = i-1;
return CHECK_ERR;
}
//已定义
ClearForm(Var,32);//清零变量数组
}
return CHECK_RGHT;
}
//检查表达式中的空格
static bool CheckBlank(char *form,int length,int *pErrLoc)
{
int i = 0;
char cFrntchar;
char cBackchar;
for(i=0; (i<length) && (form[i]==' '); i++);//跳过前端的空格
i++;
while(i < length)
{
if(form[i] == ' ')
{
//记录空格前、后的字符
cFrntchar = form[i-1];
for(; (i<length) && (form[i]==' '); i++);//跳过此段的所有空格
if(i < length)
{
cBackchar = form[i];
}
//若空格前后均为操作数
if(bIsOpeChar(cFrntchar) && bIsOpeChar(cBackchar))
{
*pErrLoc = i;
return CHECK_ERR;
}
}
i++;
}
return CHECK_RGHT;
}
//删除表达式两头的空格
static void DelBSideBlank(char *form,int length)
{
int i;
int j;
for(i=0; (i<length) && (form[i] == ' '); i++);//跳过左端空格
for(j=0; i<length; i++,j++)//拷贝
{
form[j] = form[i];
}
form[j] = '\0';
//删除尾部的空格
length = strlen(form);
for(i=(length-1); (form[i]==' ');i--)
{
form[i] = '\0';
}
}
//删除表达式中的空格
static void DelBlank(char *form,int length)
{
int i,j;
char cform[LENGTH] = {'\0'};
//删除空格
for(i=0,j=0;i<length;i++)
{
if(form[i] == ' ')
{
continue;
}
else
{
cform[j] = form[i];
j++;
}
}
//将计算结果保存到原数组中
for(i=0;i<j;i++)
{
form[i] = cform[i];
}
form[i] = '\0';
}
//检查表达式中的非法字符
static bool CheckUnlawChar(char *form,int length,int *pErrLoc)
{
int i;
for(i=0; i<length; i++)//含有非法字符
{
if(bIsOpeChar(form[i]) || bIsOpe(form[i]) || bIsBrckt(form[i]) || (form[i] == '='))
{
continue;
}
else
{
*pErrLoc = i;
return CHECK_ERR;
}
}
return CHECK_RGHT;
}
//检查表达式运算符含义
static bool CheckMeaning(char *form,int length,int *pErrLoc)
{
int i;
int opeRcrd = 1;
for(i=0;i<length;i++)
{
if(bIsOpe(form[i]))//运算符检查
{
if(((form[i+1]=='*') || (form[i+1]=='/')))//乘号、除号前出现加减乘除均为错
{
*pErrLoc = i;
return CHECK_ERR;
}
}
else
{
opeRcrd = 0;
}
}
return CHECK_RGHT;
}
//检查表达式中的操作数
static bool CheckOperator(char *form,int length,int *pErrLoc)
{
//最后的操作符后无操作数
if(bIsOpe(form[length-1]))
{
*pErrLoc = length-1;
return CHECK_ERR;
}
return CHECK_RGHT;
}
/***********************************************************************************
**函数名称:CheckBracket()
**函数功能:表达式中的括号检查
**函数说明:
** 括号使用规则:
** 1.前后括号数量相等,前括号必须出现在后括号的前面
** 2.不支持空括号,即括号内部不能无表达式
** 3.前括号后面不得出现运算符,后括号的前面不得出现运算符
** 4.前括号前面不能是数字、变量和后括号,后括号后面不能是数字、变量
**********