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

📄 scannerdlg.cpp

📁 This program about compilers.This is the first section of compilers.Source routines after manual inp
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ScannerDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Scanner.h"
#include "ScannerDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
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()

/////////////////////////////////////////////////////////////////////////////
// CScannerDlg dialog

CScannerDlg::CScannerDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CScannerDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CScannerDlg)
	m_sourcefile = _T("");
	m_stoken = _T("");
	m_filepath = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	flag = 0;
}

void CScannerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CScannerDlg)
	DDX_Control(pDX, IDC_TOKEN, m_ctoken);
	DDX_Control(pDX, IDC_SOURCEFILE, m_csourfile);
	DDX_Control(pDX, IDC_LISTERROR, m_listerror);
	DDX_Control(pDX, IDC_STATICHIDE, m_tag);
	DDX_Text(pDX, IDC_SOURCEFILE, m_sourcefile);
	DDX_Text(pDX, IDC_TOKEN, m_stoken);
	DDX_Text(pDX, IDC_FILEPATH, m_filepath);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CScannerDlg, CDialog)
	//{{AFX_MSG_MAP(CScannerDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_COMMAND(ID_EXIT, OnExit)
	ON_WM_LBUTTONDBLCLK()
	ON_COMMAND(ID_OPENFILE, OnOpenfile)
	ON_COMMAND(ID_SAVEFILE, OnSavefile)
	ON_COMMAND(ID_CLEAR, OnClear)
	ON_COMMAND(ID_SCAN, OnScan)
	ON_COMMAND(ID_HIDETOKEN, OnHidetoken)
	ON_COMMAND(ID_HIDEERROR, OnHideerror)
	ON_COMMAND(ID_SHOWERROR, OnShowerror)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CScannerDlg message handlers

BOOL CScannerDlg::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
	//初始化关键字表
	InitKeyWord(); 
	list.totallen = 0;
	ExpandDlg(flag);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CScannerDlg::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 CScannerDlg::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 CScannerDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CScannerDlg::OnExit() 
{
	// TODO: Add your command handler code here
	OnOK();
}

void CScannerDlg::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	OnOK();	
	CDialog::OnLButtonDblClk(nFlags, point);
}

void CScannerDlg::OnOpenfile() 
{	
	m_sourcefile.Empty();
	CString filename;
	CFileDialog dFileOpen(TRUE);
	if(dFileOpen.DoModal() == IDOK)
	{
		filename = dFileOpen.GetPathName();
		CFile sourcefile;
		if(!sourcefile.Open(filename,CFile::modeRead))
		{
			MessageBox("文件不能打开","提示",MB_OK);
			return;
		}
		sourcefile.Read(m_sourcefile.GetBuffer(0),sourcefile.GetLength());
		sourcefile.Close();
		m_filepath = filename;
		UpdateData(FALSE);

	}
}

void CScannerDlg::OnSavefile() 
{
	CString sFolderPath;
	BROWSEINFO bi;
	char Buffer[MAX_PATH];
	//初始化入口参数bi开始
	bi.hwndOwner = NULL;
	bi.pidlRoot = NULL;
	bi.pszDisplayName = Buffer;//此参数如为NULL则不能显示对话框
	bi.lpszTitle = "李亚楠提示:文件导出路径";
	bi.ulFlags = 0;
	bi.lpfn = NULL;
	bi.iImage=IDR_MAINFRAME;
	//初始化入口参数bi结束
	LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
	if(pIDList)
	{
		SHGetPathFromIDList(pIDList, Buffer);
		//取得文件夹路径到Buffer里
		sFolderPath = Buffer;//将路径保存在一个CString对象里
		SaveFile(sFolderPath);
		
	}
	LPMALLOC lpMalloc;
	if(FAILED(SHGetMalloc(&lpMalloc))) return;
	//释放内存
	lpMalloc->Free(pIDList);
	lpMalloc->Release();			
}

void CScannerDlg::SaveFile(CString path)
{
	CString sFullPath;
	sFullPath.Format("%s%s",path,"sourcefile.txt");
	UpdateData(TRUE);
	CFile sourcefile;
	sourcefile.Open(sFullPath,CFile::modeCreate|CFile::modeWrite);
	sourcefile.Write(m_sourcefile.GetBufferSetLength(m_sourcefile.GetLength()),m_sourcefile.GetLength());
	sourcefile.Close();
}

void CScannerDlg::OnClear() 
{
	m_sourcefile = _T("");
	UpdateData(FALSE);
}

void CScannerDlg::ExpandDlg(int flag)
{
	CRect clientrect,rect;
	m_tag.GetWindowRect(&rect);
	ScreenToClient(&rect);
	AfxGetApp()->m_pMainWnd->GetWindowRect(&clientrect);
	if(flag == 0)
	{
		AfxGetApp()->GetMainWnd()->MoveWindow(clientrect.left,clientrect.top,320,420,TRUE);
		return;
	}
	if(flag == 1)
	{
		AfxGetApp()->m_pMainWnd->MoveWindow(clientrect.left,clientrect.top,rect.right,rect.top+55,TRUE);
		return;
	}
	if(flag == 2)
	{
		AfxGetApp()->GetMainWnd()->MoveWindow(clientrect.left,clientrect.top,320,420,TRUE);	
		return;
	}
	if(flag == 3)
	{
		AfxGetApp()->m_pMainWnd->MoveWindow(clientrect.left,clientrect.top,rect.right,rect.top+55,TRUE);
		return;
	}
	if(flag == 5)
	{
		AfxGetApp()->GetMainWnd()->MoveWindow(clientrect.left,clientrect.top,320,420,TRUE);
		return;
	}
	if(flag == 4)
	{
		AfxGetApp()->GetMainWnd()->MoveWindow(clientrect.left,clientrect.top,rect.right,rect.bottom+170,TRUE);
		return;
	}
	if(flag == 6)
	{
		AfxGetApp()->GetMainWnd()->MoveWindow(clientrect.left,clientrect.top,320,550,TRUE);
		return;
	}
}



void CScannerDlg::OnHidetoken() 
{
	flag = 2;
	ExpandDlg(flag);
}

void CScannerDlg::OnHideerror() 
{
	if(flag == 1 || flag == 4)
	{
		flag = 3;
		ExpandDlg(flag);
	}
	if(flag == 2 || flag == 0 || flag == 6)
	{
		flag = 5;
		ExpandDlg(flag);
	}
}

void CScannerDlg::OnShowerror() 
{
	if(flag == 1 || flag == 3)
	{
		flag = 4;
		ExpandDlg(flag);
	}
		
	if(flag == 2 || flag == 0 || flag == 5)
	{
		flag = 6;
		ExpandDlg(flag);
	}
}

void CScannerDlg::ReadLine()
{

	/*/////////////////////////////////////////////
	//对于CEdit中的文本的长度计算:
	//当只有一行没有换行时按照可见字符个数计算
	//当出现换行时每个会车换行加两个字符的长度0x0d,0x0a
	//程序设计每行都加换行
	*//////////////////////////////////////////////
	int i,j,length;
	//UpdateData(TRUE);
	if(m_sourcefile == "")
	{
		MessageBox("请选择或输入源程序","提示",MB_OK);
		return;
	}
	m_sourcefile += "\n";   //不加的话将读不出最后一行
	length = m_sourcefile.GetLength();  //取得源程序的长度
	j = 0;
	CString strcur;
	for(i=0;i<length;i++)             //分析出源程序的各个句子
	{
		char ch = m_sourcefile.GetAt(i);
		if( ch != 0x0a)//判断行结束符号
		{
			j++;
			continue;
		}
		else
		{
			
			strcur = m_sourcefile.Left(i-1).Right(j-1);//取得行字符串
			Scan(strcur);              //分析已经取出的句子
			m_stoken += 0x0d;
			m_stoken += 0x0a;
			j = 0;
			curhang++;
			UpdateData(FALSE);
			//AfxMessageBox(strcur);
		}
	}
}

void CScannerDlg::OnButton1() 
{
	UpdateData(TRUE);
	CString str;
	str.Format("%d",m_sourcefile.GetLength());
	AfxMessageBox(str);
}
BOOL CScannerDlg::GetChar(CString str,int index,char &curch)
{
	int length = str.GetLength();
	if(index >= length || str.GetAt(index) == '\n')
	{
		//AfxMessageBox("字符访问越界");
		curch = ' ';
		return FALSE;
	}
	else
	{
		curch = str.GetAt(index);
		return TRUE;
	}
}
void CScannerDlg::Scan(CString str)
{
	curline = str;
	int length = str.GetLength();
	coloumn = 0;  //当前列计数置0
	char firch;
	while(GetChar(str,coloumn,firch))
	{
		int type = CharType(firch);
		switch(type)
		{
		case 0://若第一个字符是字母,则识别标识符
			RecogID(firch);
			break;
		case 1://数字,则识别常数
			RecogDig(firch);
			break;
		case 2:
			HandleCom(firch);//处理注解或者界限符
			break;
		case 3:
			RecogStr(firch);//识别字符常数
			break;
		case 4:
			RecogDel(firch);//识别各种界限符
			break;
		case 5:
			++coloumn;
			break;
		case 6:
			++coloumn;
			break;
		default:
			callerror(firch);
			break;
		}
	}
}
void CScannerDlg::OnScan() 
{
	UpdateData(TRUE);   //取得当前输入的源程序
	flag = 1;
	curhang = 0;  //当前行计数置0
	coloumn = 0;
	m_stoken = _T("");  //清空token编辑框,以便进行多次扫描
	m_stoken.Empty();
	UpdateData(FALSE);
//	AfxMessageBox(m_stoken);
	ReadLine();
	ExpandDlg(flag);
}

int CScannerDlg::CharType(char ch)
{
	if((ch>='a' && ch<='z')||(ch>='A' && ch<='Z'))
		return 0;
	if(ch>='0' && ch<='9')
	{
		return 1;
	}
	if(ch == '/')
		return 2;
	if(ch == '"')
		return 3;
	if(ch=='('||ch==')'||ch=='+'||ch=='-'||ch=='*'||ch=='<'||ch=='>'||ch=='='||ch==':'||ch=='.'||ch=='{'||ch=='}'||ch=='['||ch==']'||ch==';'||ch==',')
		return 4;
	if(ch == ' ')
		return 5;
	if(ch == '\n')
		return 6;
	else                           //非法字符
		return 9;
}

void CScannerDlg::RecogID(char ch)//标识符识别
{
	char curch;
	CString word = _T("");
	CString chir = _T("");
	chir.Format("%c",ch);
	word += chir;
	coloumn ++;
	if(GetChar(curline,coloumn,curch))
	{
		while(CharType(curch) == 0 || CharType(curch) == 1)
		{
			chir.Format("%c",curch);
			word += chir;
			++coloumn;
			if(!GetChar(curline,coloumn,curch))
				break;	
		}
	}
	if(CharType(curch) == 9)
	{
		CString error;
		error.Format("第%d行 第%d列 %s",curhang,coloumn,"非法字符");
		m_listerror.AddString(error);
	}
//	else
//		coloumn --;         //在接到字符时并没有处理,与课本上有区别原因是GetChar函数的实现形式决定
	token key;
	if(IsKeyWord(word,key))
	{
		CString strtoken;
		strtoken.Format("(%d,%s)",key.kind,key.name);
		m_stoken += strtoken;
		//UpdateData(FALSE);
	}

⌨️ 快捷键说明

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