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

📄 regnumber.cpp

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