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

📄 regstring.cpp

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