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

📄 lr分析过程模拟dlg.cpp

📁 编译课设
💻 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 + -