📄 regstring.cpp
字号:
#include <windows.h>
#include "commendef.h"
// 单引号 双引号 单字符 转义字符
enum STR_SYMBOL {STR_SINGLE_QUOTE,STR_DOUBLE_QUOTE,STR_CHAR,STR_ESC,STR_WRONG};
enum STR_STATE {STR_S0,STR_S1,STR_S2,STR_S3,STR_S4,STR_S5,STR_S6,STR_S7,STR_ERROR};
typedef struct
{
STR_STATE oldstate;
STR_SYMBOL input;
STR_STATE newstate;
}STR_STATE_CHANGE;
static int RULE_NUM = 16;
static STR_STATE_CHANGE StateChangeTable[] =
{
STR_S0,STR_SINGLE_QUOTE,STR_S1,
STR_S0,STR_DOUBLE_QUOTE,STR_S4,
STR_S1,STR_CHAR, STR_S2,
STR_S1,STR_ESC, STR_S6,
STR_S2,STR_SINGLE_QUOTE,STR_S3,
STR_S4,STR_CHAR, STR_S4,
STR_S4,STR_ESC, STR_S7,
STR_S4,STR_DOUBLE_QUOTE,STR_S5,
STR_S6,STR_CHAR, STR_S2,
STR_S6,STR_SINGLE_QUOTE,STR_S2,
STR_S6,STR_DOUBLE_QUOTE,STR_S2,
STR_S6,STR_ESC, STR_S2,
STR_S7,STR_CHAR, STR_S4,
STR_S7,STR_SINGLE_QUOTE,STR_S4,
STR_S7,STR_DOUBLE_QUOTE,STR_S4,
STR_S7,STR_ESC, STR_S4
};
static bool IsEndState(STR_STATE state)
{
if (state == STR_S3 || state == STR_S5)
return true;
else
return false;
}
static STR_SYMBOL GetSymbolType(char ch)
{
STR_SYMBOL type;
type = STR_WRONG;
if (ch == '\'') type = STR_SINGLE_QUOTE;
else if (ch == '\"') type = STR_DOUBLE_QUOTE;
else if (ch == '\\') type = STR_ESC;
else if (ch <= 160) type = STR_CHAR;
return type;
}
bool RecogniseString(char** pStr,RECOG_RESULT* pResult)
{
char *pInput;
STR_STATE state;
STR_SYMBOL symbol;
int i;
pResult->Right = false;
pInput = *pStr;
symbol = GetSymbolType(*pInput);
state = STR_S0;
while(*pInput && symbol != STR_WRONG && state != STR_ERROR)
{ // 查状态转换表
for(i = 0; i < RULE_NUM; i++)
if (StateChangeTable[i].oldstate == state &&
StateChangeTable[i].input == symbol)
{
state = StateChangeTable[i].newstate;
break;
}
if (i >= RULE_NUM) state = STR_ERROR; // 找不到输入条目
else
{
pInput++;
if (IsEndState(state)) break;
else symbol = GetSymbolType(*pInput);
}
}
if (IsEndState(state)) // 正确识别
{
pResult->Right = true;
pResult->WordType = WORD_STR;
CopyMemory(pResult->Value.String,*pStr + 1,(pInput - *pStr - 2) * sizeof(char));
pResult->Value.String[pInput - *pStr - 2] = 0;
if (**pStr == '\'')
if (*(*pStr + 1) = '\\') pResult->ChildType = CHILD_ESC; // 转义字符
else pResult->ChildType = CHILD_CHAR; // 单个字符
else
pResult->ChildType = CHILD_STR; // 字符串
*pStr = pInput;
return true;
}
else // 停止在非终止状态上,格式错误
{
*pStr = pInput;
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -