📄 lr分析过程模拟dlg.cpp
字号:
// LR分析过程模拟Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "LR分析过程模拟.h"
#include "LR分析过程模拟Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
stack<int> StackState; // 定义栈
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLR0Dlg dialog
CLR0Dlg::CLR0Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CLR0Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CLR0Dlg)
m_code = _T("");
m_stack_code = _T("");
m_stack_state = _T("");
m_temp = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
num=0;
}
void CLR0Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLR0Dlg)
// DDX_Control(pDX, IDC_LIST2, m_list2);
DDX_Control(pDX, IDC_LIST1, m_list1);
DDX_Control(pDX, IDC_LIST, m_list);
DDX_Text(pDX, IDC_CODE, m_code);
DDX_Text(pDX, IDC_STACK_CODE, m_stack_code);
DDX_Text(pDX, IDC_STACK_STATE, m_stack_state);
DDX_Text(pDX, IDC_TEMP, m_temp);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CLR0Dlg, CDialog)
//{{AFX_MSG_MAP(CLR0Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_ANAYLIZE, OnAnaylize)
ON_BN_CLICKED(IDC_SINGLE, OnSingle)
ON_BN_CLICKED(IDC_EXAMPLE, OnExample)
ON_NOTIFY(NM_CLICK, IDC_LIST1, OnList1)
ON_NOTIFY(NM_CLICK, IDC_LIST2, OnList2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLR0Dlg message handlers
BOOL CLR0Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
////////////////////////////////////////////////////////////////////////
/* LR分析表*/
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_list.SetHeadings(_T("状态,40;i,40;+,40;*,40;(,40;),40;#,40;E,40;T,40;F,40"));
m_list.AddItem(_T("0"),_T("s5"),_T(" "),_T(" "),_T("s4"),_T(" "),_T(" "),
_T("1"),_T("2"),_T("3"));
m_list.AddItem(_T("1"),_T(" "),_T("s6"),_T(" "),_T(" "),_T(" "),_T("acc"),
_T(" "),_T(" "),_T(" "));
m_list.AddItem(_T("2"),_T(" "),_T("r2"),_T("s7"),_T(" "),_T("r2"),_T("r2"),
_T(" "),_T(" "),_T(" "));
m_list.AddItem(_T("3"),_T(" "),_T("r4"),_T("r4"),_T(" "),_T("r4"),_T("r4"),
_T(" "),_T(" "),_T(" "));
m_list.AddItem(_T("4"),_T("s5"),_T(" "),_T(" "),_T("s4"),_T(" "),_T(" "),
_T("8"),_T("2"),_T("3"));
m_list.AddItem(_T("5"),_T(" "),_T("r6"),_T("r6"),_T(" "),_T("r6"),_T("r6"),
_T(" "),_T(" "),_T(" "));
m_list.AddItem(_T("6"),_T("s5"),_T(" "),_T(" "),_T("s4"),_T(" "),_T(" "),
_T(" "),_T("9"),_T("3"));
m_list.AddItem(_T("7"),_T("s5"),_T(" "),_T(" "),_T("s4"),_T(" "),_T(" "),
_T(" "),_T(" "),_T("10"));
m_list.AddItem(_T("8"),_T(" "),_T("s6"),_T(" "),_T(" "),_T("s11"),_T(" "),
_T(" "),_T(" "),_T(" "));
m_list.AddItem(_T("9"),_T(" "),_T("r1"),_T("s7"),_T(" "),_T("r1"),_T("r1"),
_T(" "),_T(" "),_T(" "));
m_list.AddItem(_T("10"),_T(" "),_T("r3"),_T("r3"),_T(" "),_T("r3"),_T("r3"),
_T(" "),_T(" "),_T(" "));
m_list.AddItem(_T("11"),_T(" "),_T("r5"),_T("r5"),_T(" "),_T("r5"),_T("r5"),
_T(" "),_T(" "),_T(" "));
///////////////////////////////////////////////////////////////////////////////////
/*句型分析过程表*/
m_list1.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_list1.InsertColumn(0,"步骤",LVCFMT_LEFT,50);
m_list1.InsertColumn(1,"状态栈",LVCFMT_LEFT,80);
m_list1.InsertColumn(2,"符号栈",LVCFMT_LEFT,80);
m_list1.InsertColumn(3,"输入字符串",LVCFMT_LEFT,100);
m_list1.InsertColumn(4,"ACTION",LVCFMT_LEFT,50);
m_list1.InsertColumn(5,"GOTO",LVCFMT_LEFT,50);
m_list1.InsertItem(1,"1");
///////////////////////////////////
bFlag = true;
state = 0;
// num=0;
x = 0;
y = 0;
x2=0;
y2=0;
//m_stack_state="0";
return TRUE; // return TRUE unless you set the focus to a control
}
void CLR0Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CLR0Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CLR0Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
/////////////////////////////////////////////
/*重置,清空分析过程表*/
void CLR0Dlg::OnAnaylize()
{
// TODO: Add your control notification handler code here
UpdateData();
StackState.push(0);
num=0;
/////////////////////////////////////////////////////////////////////////
m_list1.DeleteAllItems();
m_list1.InsertItem(1,"1");
bFlag = true;
//Invalidate();
}
bool CLR0Dlg::OnSingle()
{
// TODO: Add your control notification handler code here
int state;
//num++;
CString str;
str.Format("%d",num+2);
num++;
m_list1.InsertItem(num,str);
if(bFlag)
{
bFlag = false;
UpdateData();
strTemp = m_code + "#";
m_stack_state ="0";;
SetDlgItemText(IDC_STACK_STATE,"0");
m_list1.SetItemText(0,1,m_stack_state);
StackState.push(0);
//SetDlgItemText(IDC_STACK_CODE,"#");
m_list1.SetItemText(0,2,"#");
SetDlgItemText(IDC_TEMP,strTemp);
m_list1.SetItemText(0,3,strTemp);
UpdateData();
}
//----------------------------------------------------------------//
m_list.SetItemColor(y,x,RGB(0,0,0),RGB(255,255,255));
x = GetSubItem(m_temp[0]);
if(x == 0)
{
bFlag = true;
return true;
}
y = StackState.top();
//-----------------------------------------------------------------//
strTemp = m_list.GetItemText(y,x);
if(strTemp == "acc")
{
UpdateData();
m_list1.DeleteItem(num);
m_list1.SetItemText(num-1,4,"acc");
MessageBox("分析成功!");
//MessageBox(num);
UpdateData();
bFlag = true;
return true;
}
else if(strTemp == " ")
{
MessageBox("分析失败!");
bFlag = true;
num=0;
return true;
}
else if(strTemp[0] == 's')
{
strTemp.Delete(0);
state = GetNumber(strTemp);
StackState.push(state);
m_stack_code += m_temp[0];
m_temp.Delete(0);
strTemp.Format("%d",state);
// m_stack_state="0";
m_stack_state +=strTemp;
strAction="s"+strTemp;
m_list1.SetItemText(num-1,4,strAction);
show(num);
}
else if(strTemp[0] == 'r')
{
strTemp.Delete(0);
state = GetNumber(strTemp);
DoR(state);
strTemp.Format("%d",state);
strAction="r"+strTemp;
m_list1.SetItemText(num-1,4,strAction);
m_list1.SetItemText(num-1,5, m_list.GetItemText(y,x));
//m_list1.SetItemText(num,4,"acc");
show(num);
}
return false;
}
/////////////////////////////////////////////
/* 给符号在分析表中的位置编号,以便获取其位置*/
int CLR0Dlg::GetSubItem(char c)
{
switch(c)
{
case 'i':
return 1;
break;
case '+':
return 2;
break;
case '*':
return 3;
break;
case '(':
return 4;
break;
case ')':
return 5;
break;
case '#':
return 6;
break;
case 'E':
return 7;
break;
case 'T':
return 8;
break;
case 'F':
return 9;
break;
default:
MessageBox("存在非法字符!");
return 0;
}
}
////////////////////////////////////////
/*获取所在位置的数字,字符删除*/
int CLR0Dlg::GetNumber(CString str)
{
int n = 0;
int mutiple = 1;
while(str.GetLength() > 0)
{
n *= mutiple;
n += (str[0] - 48);
mutiple *= 10;
str.Delete(0);
}
return n;
}
/*显示到分析过程表中*/
void CLR0Dlg::show(int num)
{
;
m_list.SetItemColor(y,x,RGB(0,0,0),RGB(255,0,0)); //填充颜色
////////////////////////////////////////////////////
m_list1.SetItemText(num,1,m_stack_state); //填写状态栈这列
m_list1.SetItemText(num,2,m_stack_code); //填写符号栈这列
m_list1.SetItemText(num,3,m_temp); //填写剩余符号这列
}
void CLR0Dlg::DoR(int state)
{
switch(state)
{
case 1:
m_stack_code.Delete(m_stack_code.GetLength() - 3,3);
m_stack_code += "E";
x = GetSubItem('E');
PopOut();
PopOut();
PopOut();
y = StackState.top();
m_stack_state += m_list.GetItemText(y,x);
StackState.push(GetNumber(m_list.GetItemText(y,x)));
break;
case 2:
// pDC->LineTo(20,100);
m_stack_code.Delete(m_stack_code.GetLength() - 1);
m_stack_code += "E";
x = GetSubItem('E');
PopOut();
y = StackState.top();
m_stack_state += m_list.GetItemText(y,x);
StackState.push(GetNumber(m_list.GetItemText(y,x))); //压栈
//MessageBox("E2");
break;
case 3:
// pDC->LineTo(20,300);
m_stack_code.Delete(m_stack_code.GetLength() - 3,3);
m_stack_code += "T";
x = GetSubItem('T');
PopOut();
PopOut();
PopOut();
y = StackState.top(); //获取栈顶元素
m_stack_state += m_list.GetItemText(y,x); //在原状态栈里的字符在加当前获取的字符用于显示
StackState.push(GetNumber(m_list.GetItemText(y,x)));//获取的字符压栈
break;
case 4:
// pDC->LineTo(20,400);
m_stack_code.Delete(m_stack_code.GetLength() - 1);
m_stack_code += "T";
x = GetSubItem('T'); //获取"T"在表中的位子
PopOut();
y = StackState.top(); //获取栈顶元素
m_stack_state += m_list.GetItemText(y,x); //在原状态栈里的字符在加当前获取的字符用于显示
StackState.push(GetNumber(m_list.GetItemText(y,x)));//获取的字符压栈
break;
case 5:
m_stack_code.Delete(m_stack_code.GetLength() - 3,3);
m_stack_code += "F";
x = GetSubItem('F');
PopOut();
PopOut();
PopOut();
y = StackState.top();
m_stack_state += m_list.GetItemText(y,x);
StackState.push(GetNumber(m_list.GetItemText(y,x)));
break;
case 6:
m_stack_code.Delete(m_stack_code.GetLength() - 1);
m_stack_code += "F";
x = GetSubItem('F');
PopOut();
y = StackState.top();
m_stack_state += m_list.GetItemText(y,x);
StackState.push(GetNumber(m_list.GetItemText(y,x)));
break;
default:
MessageBox("表格出错!");
}
}
/////////////////////////////////////////////////////////
/*状态栈出栈*/
void CLR0Dlg::PopOut()
{
int nTemp = StackState.top();
StackState.pop();
if(nTemp >= 10)
{
m_stack_state.Delete(m_stack_state.GetLength() - 2,2);
}
else
{
m_stack_state.Delete(m_stack_state.GetLength() - 1);
}
}
void CLR0Dlg::OnExample()
{
// TODO: Add your control notification handler code here
SetDlgItemText(IDC_CODE,"i*i+i");
}
void CLR0Dlg::OnList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
*pResult = 0;
}
void CLR0Dlg::OnList2(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
*pResult = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -