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

📄 main.cpp

📁 这是一个用c++写的预测分析法程序,是编译原理课程设计的内容,可以预测分析语言
💻 CPP
字号:

#include <windows.h>
#include <commctrl.h>
#include "resource.h"
#include "RuleSet.h"

#define   WM_ADDRULE   WM_USER + 9000

BOOL CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK AddRuleDlgProc(HWND,UINT,WPARAM,LPARAM);

void InitRuleList(HWND);
void InsertRuleToList(HWND,RULE,SIGN);
void FillForecastList(HWND,TABLE&);
TABLE  GetForecastAnalyseTable(HWND hList);
bool ForecastAnalyse(SIGN_SET& InputString,HWND hRuleList,HWND hTableList,HWND hResultList);


HWND hAddDlg = NULL;

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpCmdLine,int nShowCmd)
{
	HWND hMain;
	MSG  msg;

	InitCommonControls();	
	hMain = CreateDialog(hInst,MAKEINTRESOURCE(IDD_MAINDLG),NULL,MainWndProc);
	ShowWindow(hMain,SW_SHOW);

	while(GetMessage(&msg,NULL,0,0))
		if (!IsDialogMessage(hMain,&msg) && !IsDialogMessage(hAddDlg,&msg))
			DispatchMessage(&msg);	

	return 0;
}

BOOL CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	TABLE   Table;
	RULE	Rule;
	SIGN	StartSign;
	HWND    hRuleList,hTableList,hResultList;
	SIGN_SET  InputString;
	TCHAR     szInput[MAX_PATH];
	HICON     hIcon;

	switch(msg)
	{
	case WM_INITDIALOG:
		InitRuleList(GetDlgItem(hwnd,IDC_RULE_LIST));
		hIcon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_ICON1));
		SendMessage(hwnd,WM_SETICON,ICON_SMALL,(LPARAM)hIcon);		
		return FALSE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDC_ADDRULE)
		{	// 添加规则
			if (hAddDlg == NULL)
			{
				hAddDlg = CreateDialog(NULL,MAKEINTRESOURCE(IDD_INPUTRULE),hwnd,AddRuleDlgProc);
				ShowWindow(hAddDlg,SW_SHOW);
			}
			SetFocus(hAddDlg);
		}		
		else if (LOWORD(wParam) == IDC_ANALYSE) // 进行预测分析
		{
			hRuleList    = GetDlgItem(hwnd,IDC_RULE_LIST);
			hTableList   = GetDlgItem(hwnd,IDC_FORECAST_LIST);
			hResultList  = GetDlgItem(hwnd,IDC_ANALYSE_LIST);
			GetDlgItemText(hwnd,IDC_INPUT,szInput,MAX_PATH);
			InputString = (char *)szInput;

			ForecastAnalyse(InputString,hRuleList,hTableList,hResultList);
		}
		else if (LOWORD(wParam) == IDC_RESET)
		{	// 重新来过	
			Table.Reset();
			InitRuleList(GetDlgItem(hwnd,IDC_RULE_LIST));			
			FillForecastList(GetDlgItem(hwnd,IDC_FORECAST_LIST),Table);
			ListView_DeleteAllItems(GetDlgItem(hwnd,IDC_ANALYSE_LIST));
		}
		return TRUE;
	
	case WM_ADDRULE: // 添加规则
		Rule = *((RULE *)lParam);
		StartSign = (SIGN)wParam;
		InsertRuleToList(GetDlgItem(hwnd,IDC_RULE_LIST),Rule,StartSign);		
		return TRUE;

	case WM_CLOSE:
		if (hAddDlg) DestroyWindow(hAddDlg);
		PostQuitMessage(0);
		EndDialog(hwnd,0);		
		return TRUE;
	}
	return FALSE;
}

BOOL CALLBACK AddRuleDlgProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	TCHAR   Left[2];
	TCHAR   Right[MAX_PATH];
	TCHAR   StartSign[2];
	RULE    Rule;

	switch(msg)
	{
	case WM_COMMAND:
		if (LOWORD(wParam) == IDC_ADD)
		{	// 取得各项输入
			GetDlgItemText(hwnd,IDC_LEFT,Left,2);
			GetDlgItemText(hwnd,IDC_RIGHT,Right,MAX_PATH);
			GetDlgItemText(hwnd,IDC_START,StartSign,2);
			// 错误检查
			if (lstrlen(Left) == 0 && lstrlen(StartSign) == 0)
			{
				MessageBox(hwnd,TEXT("请输入规则式的左部或者输入开始符号!\n"),
					TEXT("输入不正确"),MB_OK | MB_ICONWARNING);
				return TRUE;
			}			
			// 向父窗口发送消息
			if (Left[0] != 0)
			{
				Rule.Left = Left[0];
				strcpy(Rule.Right,Right);			
			}
			else   
				Rule.Left = END_SIGN;
			if (StartSign[0] == 0) 
				StartSign[0] = END_SIGN;

			SendMessage(GetParent(hwnd),WM_ADDRULE,StartSign[0],(LPARAM)&Rule);
			// 清空各控件
			SendMessage(GetDlgItem(hwnd,IDC_LEFT),EM_SETSEL,0,-1);
			SetDlgItemText(hwnd,IDC_RIGHT,TEXT(""));
			SetDlgItemText(hwnd,IDC_START,TEXT(""));
			SetFocus(GetDlgItem(hwnd,IDC_LEFT));
		}
		else if (LOWORD(wParam) == IDC_CANCEL)
		{
			hAddDlg = NULL;
			EndDialog(hwnd,0);
		}
		return TRUE;
	case WM_CLOSE:
		hAddDlg = NULL;
		EndDialog(hwnd,0);
		return TRUE;
	}
	return FALSE;
}

⌨️ 快捷键说明

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