⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regidentifier.cpp

📁 C语言词法分析器 实现简单的词法分析
💻 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 + -