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

📄 list.cpp

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

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

/*---------------------------- 初始化规则列表 ----------------------------*/
void InitRuleList(HWND hList)
{	
	LVCOLUMN  colinfo;
	LVITEM    item;
	int       count;	
	HWND      hHead;	

	ListView_DeleteAllItems(hList);
	hHead = ListView_GetHeader(hList);
	count = Header_GetItemCount(hHead);
	if (count == 0)
	{	// 设置表头
		colinfo.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
		colinfo.fmt  = LVCFMT_CENTER;
		colinfo.cx   = 60;
		colinfo.pszText = TEXT("左部");
		ListView_InsertColumn(hList,0,&colinfo);

		colinfo.cx   = 150;
		colinfo.pszText = TEXT("右部");
		ListView_InsertColumn(hList,1,&colinfo);		
	}
	// 头两行
	item.mask     = LVIF_TEXT;
	item.iItem    = 0;
	item.iSubItem = 0;
	item.pszText  = TEXT("开始符号");	
	ListView_InsertItem(hList,&item);

	item.iSubItem = 1;
	item.pszText  = TEXT("未设置");
	ListView_SetItem(hList,&item);
}

/*--------------- 向规则列表添加一条规则 ----------------------*/
void InsertRuleToList(HWND hList,RULE Rule,SIGN StartSign)
{
	int       count;
	LVITEM    item;
	TCHAR     szText[MAX_PATH];	
	// 开始状态
	item.mask     = LVIF_TEXT;
	if (StartSign != END_SIGN)
	{
		item.iItem    = 0;
		item.iSubItem = 1;
		wsprintf(szText,TEXT("%c"),StartSign);
		item.pszText  = szText;	
		ListView_SetItem(hList,&item);
	}
	// 规则式
	if (Rule.Left != END_SIGN)
	{
		count = ListView_GetItemCount(hList);		
		item.iItem    = count;
		item.iSubItem = 0;
		wsprintf(szText,TEXT("%c"),Rule.Left);
		item.pszText  = szText;	
		ListView_InsertItem(hList,&item);

		item.iSubItem = 1;
		wsprintf(szText,TEXT("%s"),Rule.Right);
		item.pszText  = szText;	
		ListView_SetItem(hList,&item);
	}
}

/*-------------- 从规则列表创建规则集合,然后取得预测分析表 -----------*/
TABLE  GetForecastAnalyseTable(HWND hList)
{
	int		 i,count;	
	SIGN     StartSign;
	RULE     Rule;
	RULE_SET RuleSet;	
	TABLE    SelectTable;	
	
	LVITEM    item;
	TCHAR     szText[MAX_PATH];	
	// 开始状态
	item.mask     = LVIF_TEXT;
	item.iItem    = 0;
	item.iSubItem = 1;	
	item.pszText  = szText;	
	item.cchTextMax = MAX_PATH;
	ListView_GetItem(hList,&item);	
	StartSign = szText[0];
	RuleSet.SetStartSign(StartSign);
	// 各规则式
	count = ListView_GetItemCount(hList);

	for(i = 1; i < count; i++)
	{
		item.iItem    = i;
		item.iSubItem = 0;	
		item.pszText  = szText;	
		item.cchTextMax = MAX_PATH;

		ListView_GetItem(hList,&item);		
		Rule.Left = szText[0];

		item.iSubItem = 1;	
		ListView_GetItem(hList,&item);		
		strcpy(Rule.Right,szText);
		
		RuleSet.AddRule(Rule);
	}	

	SelectTable.LeftRecursive = RuleSet.IsLeftRecursive();
	if (!SelectTable.LeftRecursive)
	{
		SelectTable = RuleSet.CreateSELECTTable();	
		SelectTable.StartSign = StartSign;
	}	
	
	return SelectTable;
}

/*-------------- 用预测分析表 Table 填充列表窗口 hList ----------------*/
void FillForecastList(HWND hList,TABLE& Table)
{
	LVCOLUMN  colinfo;
	LVITEM    item;
	int       i,count,InputNum;	
	HWND      hHead;
	TCHAR     szText[MAX_PATH],szTemp[MAX_PATH];	
	// 设置表头
	ListView_DeleteAllItems(hList);
	hHead = ListView_GetHeader(hList);
	count = Header_GetItemCount(hHead);
	if (count == 0)
	{
		colinfo.mask = LVCF_TEXT | LVCF_WIDTH;		
		colinfo.cx   = 0;
		colinfo.pszText = TEXT("");
		ListView_InsertColumn(hList,0,&colinfo);
	}
	else 
	{
		for(i = 0; i < count - 1; i++)
			ListView_DeleteColumn(hList,1);
	}
	if (Table.nGrids == 0) return;

	colinfo.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;		
	colinfo.fmt  = LVCFMT_CENTER;
	colinfo.cx   = 50;
	colinfo.pszText = TEXT("栈顶");
	ListView_InsertColumn(hList,1,&colinfo);
	// 各输入符号(终极符)	
	InputNum = Table.InputSignSet.GetSignNum();
	colinfo.cx   = 75;
	for(i = 0; i < InputNum; i++)
	{
		wsprintf(szText,TEXT("%c"),Table.InputSignSet[i]);
		colinfo.pszText = szText;
		ListView_InsertColumn(hList,i + 2,&colinfo);
	}
	// 依次填写各个格子	
	int   j,cur,StackNum;
	SIGN  TopSign;
	RULE  Rule;
	GRID  grid;	

	StackNum = Table.StackTopSignSet.GetSignNum();
	for(i = 0; i < StackNum; i++)
	{	
		TopSign = Table.StackTopSignSet[i];
		
		item.mask     = LVIF_TEXT | LVIF_PARAM;
		item.iItem    = i;
		item.iSubItem = 0;
		item.pszText  = TEXT("");
		item.lParam   = TopSign;
		ListView_InsertItem(hList,&item);		
		// 非终极符(第一列)
		wsprintf(szText,TEXT("%c"),TopSign);
		item.mask     = LVIF_TEXT;		
		item.iSubItem = 1;
		item.pszText  = szText;		
		ListView_SetItem(hList,&item);		
		// SELECT 集
		item.mask = LVIF_TEXT;
		cur = 0;
		do
		{
			grid = Table.Grid[cur++];
			if (grid.StackTopSign == TopSign)
			{
				Rule = grid.SelectableRule;				
				for(j = 0; j < InputNum; j++)
					if (Table.InputSignSet[j] == grid.InputSign)
					{
						item.pszText    = szText;
						item.cchTextMax = MAX_PATH;
						item.iSubItem   = j + 2;
						ListView_GetItem(hList,&item);
						if (strlen(szText) != 0) 	strcat(szText,"   ");
						wsprintf(szTemp,TEXT("%c --> %s"),Rule.Left,Rule.Right);				
						strcat(szText,szTemp);
						item.pszText  = szText;
						item.iSubItem = j + 2;
						ListView_SetItem(hList,&item);
						break;
					}				
			}			
		}while(cur < Table.nGrids);		
	}
}

⌨️ 快捷键说明

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