bianyidlg.cpp
来自「编译原理的实验--设计一个词法分析器,可以识别C中的关键字和各种符号」· C++ 代码 · 共 540 行
CPP
540 行
// bianyiDlg.cpp : implementation file
//
#include "stdafx.h"
#include "bianyi.h"
#include "bianyiDlg.h"
#include<ctype.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()
/////////////////////////////////////////////////////////////////////////////
// CBianyiDlg dialog
CBianyiDlg::CBianyiDlg(CWnd* pParent /*=NULL*/)
: CDialog(CBianyiDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CBianyiDlg)
m_show = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CBianyiDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBianyiDlg)
DDX_Control(pDX, IDC_EDIT_SHOW, m_com);
DDX_Control(pDX, IDC_EDIT_GET, m_get);
DDX_Text(pDX, IDC_EDIT_SHOW, m_show);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBianyiDlg, CDialog)
//{{AFX_MSG_MAP(CBianyiDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_EN_CHANGE(IDC_EDIT_GET, OnChangeEditGet)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBianyiDlg message handlers
BOOL CBianyiDlg::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
return TRUE; // return TRUE unless you set the focus to a control
}
void CBianyiDlg::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 CBianyiDlg::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 CBianyiDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CBianyiDlg::OnButton1()
{
CString GetString;
m_get.GetWindowText(GetString);
GetString=GetString+'\0';
Saomiao(GetString);
UpdateData(0);
}
void CBianyiDlg::OnButton2()
{
m_show=_T("");
m_get.SetWindowText("");
UpdateData(0);
// TODO: Add your control notification handler code here
}
void CBianyiDlg::Saomiao(CString GetString)
{
int i=0,Temp,Sum=117,START=2000,SZTemp=0;
char Ch=' ';
CString MidString,Ms,s=_T(""),ID,CS;
CString KEYWORDS[117]={"else","main","struct","enum","switch","auto","template","explicit",
"this","bool","extern","mutable","break","false","throw","case","namespace","true",
"catch","new","try","float","noreturn","char","for","operator","typedef",
"class","friend","private","typeid","const","goto","protected","typename","const_cast",
"if","public","union","continue","inline","register","unsigned","reinterpret_cast",
"using","default","int","return","uuid","delete","short","signed","virtual","sizeof",
"void","do","static","volatile","double","static_cast","dynamic_cast","long","while",
"<<=","<","<=","<<",">>",">>=",">",">=","->*","-","--","-=","->",
"+=","+","++","^=","^","&=","&&","&","|","|=","||","*=","*","/=","/","//","/*","*/","%=","%",
"=","==","!=","!",".*",".","::",":","{","}","(",")","[","]","~",",","?","#",";","'","\""};
while(Ch!='\0')
{
Ch=GetString[i];
while(Empty(Ch))Ch=GetString[++i];
s.Format(_T("%c"),Ch);
Ms=s;
if(ZOrX(Ch))
{
SZTemp=0;
while(ZOrXOrS(GetString[i+1]))
{
Ch=GetString[++i];
s.Format(_T("%c"),Ch);
Ms=Ms+s;
}
// Temp=MyCompare(KEYWORDS,Ms,Sum);
// if(Temp==-1)ID="BIANLIANG";
// else ID.Format(_T("%d"),Temp+START);
// CS=CS+Ms+" "+ID+"\r\n";
// ID=_T("");
}
else if(Shuzi(Ch))
{
while(Shuzi(GetString[i+1]))
{
Ch=GetString[++i];
s.Format(_T("%c"),Ch);
Ms=Ms+s;
}
if(GetString[i+1]=='.')
{
Ch=GetString[++i];
s.Format(_T("%c"),Ch);
Ms=Ms+s;
while(Shuzi(GetString[i+1]))
{
Ch=GetString[++i];
s.Format(_T("%c"),Ch);
Ms=Ms+s;
}
}
SZTemp=1;
// ID="CHANGLIANG";
// CS=CS+Ms+" "+ID+"\r\n";
// ID=_T("");
}
else switch(Ch) //////// 字符
{
case '<': //////// <<= <= << <
if(GetString[i+1]=='=')
{
Ms="<=";i++;
}
else if(GetString[i+1]=='<')
{
if(GetString[i+2]=='=')
{
Ms="<<=";i+=2;
}
else Ms="<<";
i++;
}
else Ms="<";break;
case '>': //////// >= > >>= >>
if(GetString[i+1]=='=')
{
Ms=">=";i++;
}
else if(GetString[i+1]=='>')
{
if(GetString[i+2]=='=')
{
Ms=">>=";i+=2;
}
else Ms=">>";
i++;
}
else Ms=">";break;
case '-': /// ->* -= -- -> -
if(GetString[i+1]=='>')
{
if(GetString[i+2]=='*')
{
Ms="->*";i+=2;
}
else Ms="->";i++;
}
else if(GetString[i+1]=='=')
{
Ms="-=";i++;
}
else if(GetString[i+1]=='-')
{
Ms="--";i++;
}
/////////////////////
else if(Shuzi(GetString[i+1]))
{
while(Shuzi(GetString[i+1]))
{
Ch=GetString[++i];
s.Format(_T("%c"),Ch);
Ms=Ms+s;
}
if(GetString[i+1]=='.')
{
Ch=GetString[++i];
s.Format(_T("%c"),Ch);
Ms=Ms+s;
while(Shuzi(GetString[i+1]))
{
Ch=GetString[++i];
s.Format(_T("%c"),Ch);
Ms=Ms+s;
}
}
SZTemp=1;
}
////////////
else Ms="-";break;
case '+': ////// += ++ +
if(GetString[i+1]=='+')
{
Ms="++";i++;
}
else if(GetString[i+1]=='=')
{
Ms="+=";i++;
}
else Ms="+";break;
case '&': ///////// && &= &
if(GetString[i+1]=='&')
{
Ms="&&";i++;
}
else if (GetString[i+1]=='=')
{
Ms="&=";i++;
}
else Ms="&";break;
case '^': /////// ^= ^
if(GetString[i+1]=='=')
{
Ms="^=";i++;
}
else Ms="^";break;
case '!': //// != !
if(GetString[i+1]=='=')
{
Ms="!=";i++;
}
else Ms="!";break;
case '|': //////// || | |=
if(GetString[i+1]=='|')
{
Ms="||";i++;
}
else if(GetString[i+1]=='=')
{
Ms="|=";i++;
}
else Ms="|";break;
case '*': // * *=
if(GetString[i+1]=='=')
{
Ms="*=";i++;
}
else if(GetString[i+1]=='/')
{
Ms="*/";i++;
}
else Ms="*";break;
case '/': ///// /=
if(GetString[i+1]=='=')
{
Ms="/=";i++;
}
else if(GetString[i+1]=='*')
{
i++;
while(GetString[i+1]!='\0'&&!(GetString[i+1]=='*'&&GetString[i+2]=='/'))i++;
Ms="/*";
}
else if(GetString[i+1]=='/')
{
while(GetString[1+i]!='\n'&&GetString[i+1]!='\0')++i;
Ms="//";
}
else Ms="/";break;
case '=': /// == =
if(GetString[i+1]=='=')
{
Ms="==";i++;
}
else Ms="=";break;
case '%':
if(GetString[i+1]=='=')
{
Ms="%=";i++;
}
else Ms="%";break;
case '.':
if(GetString[i+1]=='*')
{
Ms=".*";i++;
}
else Ms=".";break;
case '(':
Ms="(";break;
case ')':
Ms=")";break;
case ':':
if(GetString[i+1]==':')
{
Ms="::";i++;
}
else Ms=":";break;
case '{':
Ms="{";break;
case '}':
Ms="}";break;
case '[':
Ms="[";break;
case ']':
Ms="]";break;
case '~':
Ms="~";break;
}
if(SZTemp==1)ID="数字常量";
else if(Ms=="\0")ID="\r\r\r\n---编译结束-----";
else
{
Temp=MyCompare(KEYWORDS,Ms,Sum);
if(GetString[i+1]=='\0')ID=_T("");
else if(Temp==-1)ID="变量";
else ID.Format(_T("%d"),Temp+START);
}
CS=CS+Ms+" "+ID+"\r\n";
ID=_T("");SZTemp=0;
i++;
}
m_show=CS;
UpdateData(0);
}
int CBianyiDlg::MyCompare(CString KEYWORDS[],CString Ms,int Sum)
{
int loop,result=1;
for(loop=0;loop<Sum;loop++)
if(!strcmp(KEYWORDS[loop],Ms) )return loop;
return -1;
}
BOOL CBianyiDlg::Empty(char Ch)
{
if(Ch=='\r'||Ch=='\n'||Ch==' '||Ch=='\b'||Ch=='\t')return TRUE;
else return FALSE;
}
BOOL CBianyiDlg::Shuzi(char Ch)
{
if(Ch>='0'&&Ch<='9')return TRUE;
else return FALSE;
}
BOOL CBianyiDlg::ZOrX(char Ch)
{
if(Ch>='a'&&Ch<='z' || Ch>='A'&&Ch<='Z' || Ch=='_')return TRUE;
else return FALSE;
}
BOOL CBianyiDlg::ZOrXOrS(char Ch)
{
if(Ch>='a'&&Ch<='z' || Ch>='A'&&Ch<='Z' || Ch=='_'||Ch>='0'&&Ch<='9')return TRUE;
else return FALSE;
}
void CBianyiDlg::OnButton3()
{
// TODO: Add your control notification handler code here
CFileDialog m_File(true);
ofstream myFile;
CString Get,Ms=_T(""),s;
if (m_File.DoModal() == IDOK)
{
Get= m_File.GetFileName();
ifstream OpenFile(Get);
char ch;
while(!OpenFile.eof())
{
OpenFile.get(ch);
if(ch=='\n')Ms=Ms+'\r'+'\n';
else Ms=Ms+ch;
}
int length=Ms.GetLength();
m_get.SetWindowText(Ms);
UpdateData(0);
m_str=Ms;
OpenFile.close();
}
// Get=file->;
// myFile.open(Get,ios::out,filebuf::openprot);
//
}
void CBianyiDlg::OnChangeEditGet()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
m_get.ModifyStyle(0, ES_WANTRETURN);
// m_Edit.ModifyStyle(0, ES_WANTRETURN);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?