📄 regnumber.cpp
字号:
#include <math.h>
#include "commendef.h"
enum NUM_SYMBOL{NUM_SIGN,NUM_DIGIT,NUM_DOT,NUM_EXP,NUM_WRONG};
enum NUM_STATE {NUM_S0,NUM_S1,NUM_S2,NUM_S3,NUM_S4,NUM_S5,NUM_S6,NUM_S7,NUM_ERROR};
typedef struct // 状态转换表项
{
NUM_STATE oldstate; // 原状态
NUM_SYMBOL input; // 输入符号
NUM_STATE newstate; // 新符号
}NUM_STATE_CHANGE;
static int RULE_NUM = 13;
static NUM_STATE_CHANGE StateChangeTable[] =
{
NUM_S0, NUM_SIGN, NUM_S1,
NUM_S0, NUM_DIGIT, NUM_S2,
NUM_S1, NUM_DIGIT, NUM_S2,
NUM_S2, NUM_DIGIT, NUM_S2,
NUM_S2, NUM_DOT, NUM_S3,
NUM_S2, NUM_EXP, NUM_S5,
NUM_S3, NUM_DIGIT, NUM_S4,
NUM_S4, NUM_DIGIT, NUM_S4,
NUM_S4, NUM_EXP, NUM_S5,
NUM_S5, NUM_SIGN, NUM_S6,
NUM_S5, NUM_DIGIT, NUM_S7,
NUM_S6, NUM_DIGIT, NUM_S7,
NUM_S7, NUM_DIGIT, NUM_S7
};
static bool IsEndState(NUM_STATE state)
{
if (state == NUM_S2 || state == NUM_S4 || state == NUM_S7)
return true;
else
return false;
}
static NUM_SYMBOL GetSymbolType(char ch)
{
NUM_SYMBOL type;
type = NUM_WRONG;
if (ch >= '0' && ch <= '9') type = NUM_DIGIT;
else if (ch == '+' || ch == '-') type = NUM_SIGN;
else if (ch == '.') type = NUM_DOT;
else if (ch == 'e' || ch == 'E') type = NUM_EXP;
return type;
}
bool RecogniseNumber(char** pStr,RECOG_RESULT *pResult)
{
char *pInput,ch;
NUM_STATE state;
NUM_SYMBOL symbol;
int i,Exp,ExpSign,RealSign;
double Value,Rate;
bool FloatNumber;
Value = 0.0; Rate = 1.0;
Exp = 0; ExpSign = 1; RealSign = 1;
FloatNumber = false;
pResult->Right = false;
pInput = *pStr; ch = *pInput;
symbol = GetSymbolType(*pInput);
state = NUM_S0;
while(*pInput && symbol != NUM_WRONG && state != NUM_ERROR)
{ // 查状态转换表
for(i = 0; i < RULE_NUM; i++)
if (StateChangeTable[i].oldstate == state &&
StateChangeTable[i].input == symbol)
{
switch(symbol)
{
case NUM_DIGIT:
if (state >= NUM_S5) // 指数部分
Exp = 10 * Exp + (ch - '0');
else if (state >= NUM_S3) // 小数部分
{
Rate = Rate / 10;
Value += (ch - '0') * Rate;
}
else if (state >= NUM_S0) // 整数部分
Value = 10 * Value + (ch - '0');
break;
case NUM_SIGN:
if (state == NUM_S0 && ch == '-') RealSign = -1; // 实数部分符号
if (state == NUM_S5 && ch == '-') ExpSign = -1; // 指数部分符号
break;
case NUM_DOT: case NUM_EXP: // 若有小数点或者指数部分,则是浮点数
FloatNumber = true;
break;
}
state = StateChangeTable[i].newstate;// 状态转换
break;
}
if (i >= RULE_NUM) state = NUM_ERROR; // 找不到输入条目
else
{
pInput++;
symbol = GetSymbolType(*pInput);
ch = *pInput;
}
}
*pStr = pInput;
if (IsEndState(state)) // 正确识别
{
pResult->Right = true;
pResult->WordType = WORD_NUM;
if (FloatNumber)
{
pResult->Value.RealValue = RealSign * Value * pow(10.0,ExpSign * Exp);
pResult->ChildType = CHILD_FLOAT;
}
else
{
pResult->Value.IntValue = (int)(RealSign * Value);
pResult->ChildType = CHILD_INT;
}
return true;
}
else return false; // 停止在非终止状态上,数格式错误
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -