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

📄 recognise.cpp

📁 这是一个编译原理中
💻 CPP
字号:

#include <windows.h>
#include "DFA.h"

static SYMBOL  GetSymbolType(TCHAR);
static TCHAR   RecogniseState[][30] = 
{
	TEXT("未完成的数"),
	TEXT("正确的整数形式"),
	TEXT("未完成的小数"),
	TEXT("正确的小数形式"),
	TEXT("未完成的指数"),
	TEXT("正确的指数形式"),
	TEXT("错误的输入")
};

static int GetRecogniseState(STATE state)
{
	switch(state)
	{
	case Q0: case Q1:   return 0;
	case Q2:            return 1;
	case Q3:            return 2;
	case Q4:            return 3;
	case Q5:case Q6:    return 4;
	case Q7:            return 5;
	case MISTAKE:       return 6;
	}
	return 6;
}

static SYMBOL  GetSymbolType(TCHAR ch)
{
	SYMBOL type;

	type = WRONG;
	if (ch == '+' || ch == '-')      type = SIGN;
	else if (ch >= '0' && ch <= '9') type = DIGIT;
	else if (ch == '.')              type = DOT;
	else if (ch == 'e' || ch == 'E') type = EXP;

	return type;
}

LRESULT CALLBACK RecogniseWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{	
	PAINTSTRUCT ps;
	HDC         hdc;
	RECT        rect;
	static  TCHAR szInput[BUFFER_LEN + 1];
	static  int   nSymbols;

	static STATE oldstate,newstate;
	static DFA machine;
	int    highlight;
	SYMBOL input;
	TCHAR  ch;
	TCHAR  szOut[MAX_PATH];
	HFONT  hFont;

	switch(msg)
	{
	case WM_CREATE:
		ZeroMemory(szInput,sizeof(TCHAR) * (BUFFER_LEN + 1));
		nSymbols = 0;
		oldstate = newstate = machine.GetState();
		return 0;

	case WM_CHAR:
		ch = (TCHAR)wParam;
		input = GetSymbolType(ch);
		if (input != WRONG) // 输入的符号合法
		{
			if (nSymbols < BUFFER_LEN) szInput[nSymbols++]  = ch;
			else                      
			{
				ZeroMemory(szInput,sizeof(TCHAR) * (BUFFER_LEN + 1));
				nSymbols = 0;
				szInput[nSymbols++] = ch;
			}	
			oldstate = newstate;
			highlight = machine.Input(input);// 向自动机输入
			newstate = machine.GetState();   // 取回新状态

			PostMessage(GetDlgItem(GetParent(hwnd),2),WM_HIGHLIGHT,0,highlight);
			InvalidateRect(hwnd,NULL,FALSE);
		}

		if (ch == VK_ESCAPE || ch == VK_RETURN)
		{
			ZeroMemory(szInput,sizeof(TCHAR) * (BUFFER_LEN + 1));
			nSymbols = 0;
			oldstate = newstate = machine.Reset();
			InvalidateRect(hwnd,NULL,FALSE);
			highlight = -1;
			PostMessage(GetDlgItem(GetParent(hwnd),2),WM_HIGHLIGHT,0,highlight);		
		}
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd,&ps);
		GetClientRect(hwnd,&rect);
		FillRect(hdc,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH));
		// 准备设备描述表
		SetMapMode(hdc,MM_ISOTROPIC);
		SetWindowExtEx(hdc,-200,-200,NULL);
		SetViewportExtEx(hdc,rect.right,rect.bottom,NULL);
		SetViewportOrgEx(hdc,rect.right,rect.bottom / 2,NULL);
		
		hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
		SelectObject(hdc,hFont);
		SetTextColor(hdc,RGB(0,255,0));
		SetTextAlign(hdc,TA_RIGHT);
		SetBkMode(hdc,TRANSPARENT);
		// 原状态
		rect.left  = 5;   rect.top = 20;
		rect.right = 80;  rect.bottom = 35;
		if (oldstate != MISTAKE)
			wsprintf(szOut,TEXT("原状态: Q%d"),oldstate);
		else
		{
			rect.right = 120;
			SetTextColor(hdc,RGB(255,0,0));
			wsprintf(szOut,TEXT("原状态: ERROR"));
		}
		DrawText(hdc,szOut,-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		// 新状态
		rect.left  = 5;   rect.top = -20;
		rect.right = 80;  rect.bottom = -35;
		if (newstate != MISTAKE)
			wsprintf(szOut,TEXT("新状态: Q%d"),newstate);
		else
		{
			rect.right = 120;
			SetTextColor(hdc,RGB(255,0,0));
			wsprintf(szOut,TEXT("新状态: ERROR"));
		}
		DrawText(hdc,szOut,-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		// 输入的字符串
		if (nSymbols != 0)
		{
			TextOut(hdc,5,8,szInput,lstrlen(szInput));
			SetTextColor(hdc,RGB(255,0,0));
			TextOut(hdc,5,8,szInput + lstrlen(szInput) - 1,1);
		}
		// 识别状态
		rect.left  = 50;  rect.top     = -80;
		rect.right = 180;  rect.bottom  = -50;
		SetTextColor(hdc,RGB(0,255,255));
		DeleteObject(SelectObject(hdc,GetStockObject(SYSTEM_FONT)));
		if (newstate != Q0)
		{
			int  i;
			i = GetRecogniseState(newstate);
			if (i % 2 == 0) SetTextColor(hdc,RGB(255,0,0));
			DrawText(hdc,RecogniseState[i],-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);			
		}
		else
			DrawText(hdc,TEXT("等待输入……"),-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);			

		DeleteObject(SelectObject(hdc,GetStockObject(NULL_PEN)));		
		EndPaint(hwnd,&ps);
		return 0;
	case WM_NCHITTEST:
		return HTTRANSPARENT;
	}
	return DefWindowProc(hwnd,msg,wParam,lParam);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -