📄 regidentifier.cpp
字号:
#include <windows.h>
#include "commendef.h"
enum ID_SYMBOL {ID_UNDERLINE,ID_LETTER,ID_DIGIT,ID_WRONG};
enum ID_STATE {ID_S0,ID_S1,ID_ERROR};
typedef struct // 状态转换表项
{
ID_STATE oldstate; // 原状态
ID_SYMBOL input; // 输入符号
ID_STATE newstate; // 新符号
}ID_STATE_CHANGE;
static int KEYWORD_NUM = 32;
static char KEYWORDS[][20]=
{
"auto", "break", "case", "char", "const",
"continue","default", "do", "double", "else",
"enum", "extern", "float", "for", "goto",
"if", "int", "long", "register", "return",
"short", "signed", "sizeof", "static", "struct",
"switch", "typedef", "union", "unsigned", "void",
"volatile","while"
};
static int RULE_NUM = 5;
static ID_STATE_CHANGE StateChangeTable[] =
{
ID_S0,ID_UNDERLINE,ID_S1,
ID_S0,ID_LETTER, ID_S1,
ID_S1,ID_UNDERLINE,ID_S1,
ID_S1,ID_LETTER, ID_S1,
ID_S1,ID_DIGIT, ID_S1
};
static bool IsKeyword(char *p)
{
int i;
for(i = 0; i < KEYWORD_NUM; i++)
if (strcmp(p,KEYWORDS[i]) == 0) return true;
return false;
}
static bool IsEndState(ID_STATE state)
{
if (state == ID_S1)
return true;
else
return false;
}
static ID_SYMBOL GetSymbolType(char ch)
{
ID_SYMBOL type;
type = ID_WRONG;
if (ch >= '0' && ch <= '9') type = ID_DIGIT;
else if (ch == '_') type = ID_UNDERLINE;
else if ((ch >= 'a' && ch <= 'z') ||
(ch >= 'A' && ch <= 'Z'))
type = ID_LETTER;
return type;
}
bool RecogniseIdentifier(char** pStr,RECOG_RESULT *pResult)
{
char *pInput;
ID_STATE state;
ID_SYMBOL symbol;
int i;
pResult->Right = false;
pInput = *pStr;
state = ID_S0;
symbol = GetSymbolType(*pInput);
while(*pInput && symbol != ID_WRONG && state != ID_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 = ID_ERROR; // 找不到输入条目
else
{
pInput++;
symbol = GetSymbolType(*pInput);
}
}
CopyMemory(pResult->Value.Identifier,*pStr,(pInput - *pStr) * sizeof(char));
pResult->Value.Identifier[pInput - *pStr] = 0;
*pStr = pInput;
if (IsEndState(state)) // 正确识别
{
pResult->Right = true;
pResult->WordType = WORD_ID;
if (IsKeyword(pResult->Value.Identifier))
pResult->ChildType = CHILD_KEYWORD;
else
pResult->ChildType = CHILD_USERID;
return true;
}
else return false; // 停止在非终止状态上,格式错误
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -