📄 projectdlg.cpp
字号:
// ProjectDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Project.h"
#include "ProjectDlg.h"
#include "Dia.h"
#include "Dia2.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
char tokenfile_char[200][13];
char charfile_char[200][13];
struct fours_list fourslist[300];
struct varst_list varstlist[100];
int resent_vs=0;
int old_vs=resent_vs;
int resent_fl=0;
int and_pos=0;
struct entry keyword[]={"and",1,"array",2,"begin",3,"bool",4,"call",5,
"case",6,"char",7,"constant",8,"do",9,"else",10,"end",11,"false",12,
"for",13,"if",14,"input",15,"integer",16,"not",17,"of",18,"or",19,
"output",20,"procedure",21,"program",22,"read",23,"real",24,"repeat",
25,"set",26,"then",27,"to",28,"true",29,"until",30,"var",31,"while",
32,"write",33};
struct entry delimeter[]={"'",38,"(",39,")",40,"*",41,"*/",42,"+",43,
",",44,"-",45,"、",46,"..",47,"/",48,"/*",49,":",50,":=",51,";",52,
"<",53,"<=",54,"<>",55,"=",56,">",57,"=>",58,"[",59,"]",60,".",61};
struct entry selfdef[]={"identity",34,"intconst",35,"digit",36,"charconst",37};
CString tokenfile="\0",charfile="\0";
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()
/////////////////////////////////////////////////////////////////////////////
// CProjectDlg dialog
CProjectDlg::CProjectDlg(CWnd* pParent /*=NULL*/)
: CDialog(CProjectDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CProjectDlg)
m_content = _T("");
m_TOKEN = _T("");
m_CHAR = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_sizeWin = CRect(0,0,0,0);
m_nAdd = 5;
m_bIsReSize = FALSE;
}
void CProjectDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CProjectDlg)
DDX_Text(pDX, IDC_EDIT1, m_content);
DDX_Text(pDX, IDC_TOKEN, m_TOKEN);
DDX_Text(pDX, IDC_CHAR, m_CHAR);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CProjectDlg, CDialog)
//{{AFX_MSG_MAP(CProjectDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_COMMAND(ID_read, Onread)
ON_COMMAND(ID_Word_Analyse, OnWordAnalyse)
ON_COMMAND(ID_Word_Save, OnWordSave)
ON_COMMAND(ID_Grammer_Analyse, OnGrammerAnalyse)
ON_COMMAND(ID_Grammer_Save, OnGrammerSave)
ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
ON_COMMAND(ID_d, Ond)
ON_COMMAND(ID_S, OnS)
ON_WM_TIMER()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CProjectDlg message handlers
BOOL CProjectDlg::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
SetTimer(2,50,0);
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CProjectDlg::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 CProjectDlg::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 CProjectDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
/////////////////////////////////////// 是否是标识符 ///////////////////////////////
bool CProjectDlg::isidentifier(char *token)
{
for(int i=0;charfile_char[i][0]!='\0';i++)
if(!strcmp(token,charfile_char[i]))
return true;
if(charfile_char[i][0]=='\0')
return false;
}
/////////////////////////////////////// 从TOKEN 文件中取下一个字符///////////////////////////
int next=0;
char *CProjectDlg::getnexttoken()
{
char *temp;
temp=tokenfile_char[next++];////////////////一定要用[next++]这种方式
return temp;
}
/////////////////////////////////////// 关键字 识别//////////////////////////////////////////
int CProjectDlg::iskeyword(CString str,struct entry keyword[])
{
int i=0;
while(i<33)
if(!strcmp(str,keyword[i].word))
return keyword[i].token;
else
i++;
return false;
}
//////////////////////////////////////// 界符 识别///////////////////////////////////////////
int CProjectDlg::isdelimeter(CString str,struct entry delimeter[])
{
int i=0;
while(i<24)
if(!strcmp(str,delimeter[i].word))
return delimeter[i].token;
else
i++;
return false;
}
//////////////////////////////////////整型 与 浮点型 识别///////////////////////////////////
int CProjectDlg::digitsort(char str[])
{
char state='0';
int i=0;
while(state!=7)
{
switch (state)
{
case '0': if(isdigit(str[0])) state='1';else return false;
case '1':
if(i!=0&&(str[i]==32||str[i]==0)){ i--; return 35;}
else if(isdigit(str[i])) {state='1';break;}
else if(str[i]=='.') {state='2';break;}
else if(str[i]=='e'||str[i]=='E') {state='4';break;}
case '2': if(isdigit(str[i])) {state='3';break;}
else return false;
case '3': if(isdigit(str[i])) {state='3';break;}
else if(str[i]=='e'||str[i]=='E') {state='4';break;}
else{ i--; return 36;}
case '4':if(isdigit(str[i])) {state='6';break;}
else if(str[i]=='+'||str[i]=='-') {state='5';break;}
else return false;
case '5':if(isdigit(str[i])) {state='6';break;}
else return false;
case '6':if(isdigit(str[i])) {state='6';break;}
else{ i--;return 36;}
}
i++;
}
}
/////////////////////////////////////////标识符 与 关键字 识别//////////////////////////////////
int CProjectDlg::charsort(char str[])
{
char state='0';
int i=0,token;
while(state!='2')
{
switch(state)
{
case '0':if(i!=0&&(str[i]==32||str[i]==0))
{
if(token=iskeyword(str,keyword))
return token;
else
return 34;
}
else if(isalpha(str[i])) {state='0';break;}
else if(isalnum(str[i])) {state='1';break;}
case '1':if(isalnum(str[i]) &&(i<7)) {state='1';break;}
else if(i!=0&&(str[i]==32||str[i]==0))
{
state=2;
return 34;
i--;
}
}
i++;
}
}
////////////////////////////////////多位数转换成字符串函数//////////////////////////////////////
char *CProjectDlg::transvert(int num)
{
int flag=num/10;
char totle[2];
if(flag)
{
totle[0]=char(flag+48);
totle[1]=char(num%10+48);
totle[2]='\0';
return totle;
}
else
{
totle[0]=char(flag+48);
totle[1]='\0';
return totle;
}
}
////////////////////////////////////////////变量说明函数
void CProjectDlg::varst(char *token)
{
while(1)
{
if(isidentifier(token))
{
varstlist[resent_vs].no=resent_vs;
varstlist[resent_vs].name=token;
}
token=getnexttoken();
if(!strcmp(token,":="))
{
token=getnexttoken();
varstlist[resent_vs].VAL=token;
token=getnexttoken();
}
resent_vs++;
if(token[0]==',')
token=getnexttoken();
else
if(token[0]==58)///////////////是否是 :
break;
else
{ AfxMessageBox("错误:变量名后只能出现 ':'和','!");}
}
char *type=getnexttoken();
if(strcmp(type,"integer")&&
strcmp(type,"real")&&
strcmp(type,"bool")&&
strcmp(type,"char"))
{ AfxMessageBox("变量类型说明有误!");}
else
{
for(int temp=old_vs;temp<resent_vs;temp++)
varstlist[temp].TYPE=type;
old_vs=resent_vs;
}
if(strcmp(token=getnexttoken(),";"))
{ AfxMessageBox("错误:缺少';'");}
token=getnexttoken();
if(isidentifier(token))
varst(token);
else if(!strcmp(token,"begin"))
return;
else
{ AfxMessageBox("错误:缺少begin';'");}
varstlist[resent_vs].no=999;
}
//////////////////////////////////////语句分类
char *CProjectDlg::ST_SORT(char *token)
{
if(!strcmp(token,"if"))
token=ifs(token);
else if(!strcmp(token,"while"))
token=whiles(token);
else if(!strcmp(token,"repeat"))
token=repeats(token);
else if(!strcmp(token,"for"))
token=fors(token);
else
token=assign(token);
return token;
}
////////////////////////////////////// if
char *CProjectDlg::ifs(char *token)
{
token=getnexttoken();
bexp(token);
token=getnexttoken();
if(strcmp(token,"then"))
{ AfxMessageBox("错误:then,缺少 !");}
token=getnexttoken();
token=ST_SORT(token);
if(!strcmp(token,";"))
resent_fl++;
token=getnexttoken();
if(!strcmp(token,"else"))
{token=getnexttoken();
ST_SORT(token);}// AfxMessageBox("错误:缺少 else !");}
return token;
}
////////////////////////////////////// while
char *CProjectDlg::whiles(char *token)
{
token=getnexttoken();
bexp(token);
token=tokenfile_char[next-1];
if(strcmp(token,"do")&&isidentifier(tokenfile_char[next]))
{ AfxMessageBox("错误:缺少 do !");}
token=ST_SORT(token);
return token;
}
///////////////////////////////////// repeat
char *CProjectDlg::repeats(char *token)
{
token=getnexttoken();
token=ST_SORT(token);
token=getnexttoken();
if(!strcmp(token,"until"))
{
token=getnexttoken();
token=bexp(token);
}
else if(!strcmp(token,";"))
token=ST_SORT(token);
else
{ AfxMessageBox("错误:缺少 until !");}
return token;
}
///////////////////////////////////// for
char *CProjectDlg::fors(char *token)
{
token=getnexttoken();
if(isidentifier(token))
{
token=getnexttoken();
if(!strcmp(token,":="))
{
token=getnexttoken();
token=cal(token);
}
}
if(!strcmp(token,"to")||!strcmp(token,"downto"))
{
token=getnexttoken();
token=cal(token);
}
if(strcmp(token,"do")&&isidentifier(tokenfile_char[next]))
{ AfxMessageBox("错误:缺少 do !");}
else
{
token=getnexttoken();
while(token[0]>='0'&&token[0]<='9')
token=getnexttoken(); ////////////// to 后面的常数
if(!strcmp(token,"do"))
token=getnexttoken();
token=ST_SORT(token);
}
return token;
}
///////////////////////////////////// 赋值语句
char *CProjectDlg::assign(char *token)
{
if(isidentifier(token))
{
fourslist[resent_fl].RESULT=token;
token=getnexttoken();
if(!strcmp(token,":="))
{
fourslist[resent_fl].no=resent_fl;
fourslist[resent_fl].op=token;
token=getnexttoken();
token=cal(token);
}
}
return token;
}
/////////////////////////////////////逻辑表达式处理
char *CProjectDlg::bexp(char *token)
{
bt(token);
if(!strcmp(token,"or"))
{
token=getnexttoken();
bexp(token);
}
else
return token=tokenfile_char[next-2];
}
/////////////////////////////////////and处理
void CProjectDlg::bt(char *token)
{
bf(token);
if(!strcmp(tokenfile_char[next],"then"))
{next--;fourslist[and_pos].AG2=fourslist[resent_fl-1].RESULT;}
token=getnexttoken();
if(!strcmp(token,"and"))
{
and_pos=resent_fl;
fourslist[resent_fl].op=token;
CString temp;
temp.Format("%d",resent_fl-1);
fourslist[resent_fl].no=resent_fl;
fourslist[resent_fl].AG1="temp"+temp;
temp.Format("%d",resent_fl);
fourslist[and_pos].RESULT="temp"+temp;
resent_fl++;
token=getnexttoken();
bt(token);
}
else
return;
}
/////////////////////////////////////not处理
void CProjectDlg::bf(char *token)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -