📄 list.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 + -