📄 winapp.cpp
字号:
#include "winapp.h"
#include "getsym.h"
HINSTANCE hinst;
OPENFILENAME ofn;
FILE *fp;
zCompile *cp; //编译器对象指针
int asmnum=0; //目标代码数量
int errnum=0; //错误数量
char buf[65536];
char str[512];
SYMINFO s; //词法分析信息结构
char in[65536]; //源程序缓冲区
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
hinst=hInstance;
return(DialogBox(hInstance,MAKEINTRESOURCE(IDD_MAINDLG),NULL,(DLGPROC)dlgproc));
}
BOOL CALLBACK dlgproc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam)
{
int i,j;
switch(msg)
{
case WM_INITDIALOG:
in[65535]=0; //结尾清0防止溢出
// SendMessage(hdlg,WM_SETICON,ICON_BIG,(LPARAM)LoadIcon(hinst,MAKEINTRESOURCE(IDI_ICON)));
SendDlgItemMessage(hdlg,IDC_INPUT,WM_SETFONT,(DWORD)GetStockObject(ANSI_FIXED_FONT),0);
SendDlgItemMessage(hdlg,IDC_OUTPUT,WM_SETFONT,(DWORD)GetStockObject(SYSTEM_FIXED_FONT),0);
SendDlgItemMessage(hdlg,IDC_ERRPUT,WM_SETFONT,(DWORD)GetStockObject(SYSTEM_FIXED_FONT),0);
memset(&ofn,0,sizeof(OPENFILENAME));
ofn.lStructSize=sizeof(OPENFILENAME);
ofn.hwndOwner=hdlg;
ofn.hInstance=hinst;
ofn.lpstrFilter="所有文件(*.*)\0*.*\0";
ofn.nMaxFile=255; //最大文件名缓冲区长度
ofn.lpstrFile=str; //使用临时字符串
return 1;
case WM_COMMAND:
switch(LOWORD(wparam))
{
case ID_LISTKEY:
SendDlgItemMessage(hdlg,IDC_OUTPUT,LB_RESETCONTENT,0,0);
SendDlgItemMessage(hdlg,IDC_OUTPUT,LB_ADDSTRING,0,(DWORD)"关键字:");
for(i=0;i<MAX_KEYWORD;i++)
{
wsprintf(str,"[%-2d]%s",i,keytxt[i]);
SendDlgItemMessage(hdlg,IDC_OUTPUT,LB_ADDSTRING,0,(DWORD)str);
}
SendDlgItemMessage(hdlg,IDC_OUTPUT,LB_ADDSTRING,0,(DWORD)"运算符:");
for(i=0;i<MAX_OPWORDA;i++)
{
wsprintf(str,"[%-2d]%c",i,opatxt[i]);
SendDlgItemMessage(hdlg,IDC_OUTPUT,LB_ADDSTRING,0,(DWORD)str);
}
for(i=0;i<MAX_OPWORDB;i++)
{
wsprintf(str,"[%-2d]%s",MAX_OPWORDA+i,opbtxt[i]);
SendDlgItemMessage(hdlg,IDC_OUTPUT,LB_ADDSTRING,0,(DWORD)str);
}
SendDlgItemMessage(hdlg,IDC_OUTPUT,LB_ADDSTRING,0,(DWORD)"界符:");
for(i=0;i<MAX_ENDWORD;i++)
{
wsprintf(str,"[%-2d]%c",i,eoptxt[i]);
SendDlgItemMessage(hdlg,IDC_OUTPUT,LB_ADDSTRING,0,(DWORD)str);
}
SendDlgItemMessage(hdlg,IDC_ERRPUT,LB_RESETCONTENT,0,0);
SendDlgItemMessage(hdlg,IDC_ERRPUT,LB_ADDSTRING,0,(DWORD)"出错信息:");
for(i=1;i<MAX_ERROR;i++)
{
wsprintf(str,"[%-2d]%s",i,errtxt[i]);
SendDlgItemMessage(hdlg,IDC_ERRPUT,LB_ADDSTRING,0,(DWORD)str);
}
break;
case ID_START:
SetCursor(LoadCursor(NULL,IDC_WAIT));
SendDlgItemMessage(hdlg,IDC_OUTPUT,LB_RESETCONTENT,0,0);
SendDlgItemMessage(hdlg,IDC_ERRPUT,LB_RESETCONTENT,0,0);
GetDlgItemText(hdlg,IDC_INPUT,in,65535);
if(getsyminfo(in,&s))
MessageBox(hdlg,"发现严重错误!","错误",MB_ICONERROR);
for(i=0,j=0;i<s.num;i++)
{
if(s.sym[i].type==TYPE_ERROR)
{
j++;
wsprintf(str,"%-2d(ERROR%d)[line:%d]",i,s.sym[i].id,s.sym[i].line);
SendDlgItemMessage(hdlg,IDC_OUTPUT,LB_ADDSTRING,0,(DWORD)str);
wsprintf(str,"No.%d ERROR%d[line:%d]:%s:\"%s\"",i,s.sym[i].id,s.sym[i].line,errtxt[s.sym[i].id],s.sym[i].name);
SendDlgItemMessage(hdlg,IDC_ERRPUT,LB_ADDSTRING,0,(DWORD)str);
}
else
{
wsprintf(str,"%-2d(%d,%d)%s",i,s.sym[i].type,s.sym[i].id,s.sym[i].name);
SendDlgItemMessage(hdlg,IDC_OUTPUT,LB_ADDSTRING,0,(DWORD)str);
}
}
wsprintf(str,"%d Symbol(s) Found.",s.num-j);
SendDlgItemMessage(hdlg,IDC_ERRPUT,LB_ADDSTRING,0,(DWORD)str);
wsprintf(str,"%d Error(s) Found.",j);
SendDlgItemMessage(hdlg,IDC_ERRPUT,LB_ADDSTRING,0,(DWORD)str);
SetCursor(LoadCursor(NULL,IDC_ARROW));
break;
case ID_OPEN:
ofn.Flags=OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;
ofn.lpstrTitle="打开源程序文件...";
str[0]=0; //无初始文件名
if(!GetOpenFileName(&ofn)) break;
str[255]=0; //防止溢出
fp=fopen(ofn.lpstrFile,"rb");
if(!fp)
MessageBox(hdlg,str,"无法打开文件!",MB_ICONERROR);
else
{
fseek(fp,0,SEEK_END);
i=ftell(fp); //取文件长度
fseek(fp,0,SEEK_SET);
if(i>65535)
MessageBox(hdlg,"文件太长(>=64K)!","错误",MB_ICONERROR);
else
{
fread(in,1,i,fp);
in[i]=0; //防止溢出
SetDlgItemText(hdlg,IDC_INPUT,in);
}
fclose(fp);
}
break;
case ID_SAVE:
ofn.Flags=OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY;
ofn.lpstrTitle="保存结果到文件...";
str[0]=0;
if(!GetSaveFileName(&ofn)) break;
str[255]=0;
fp=fopen(ofn.lpstrFile,"wb");
if(!fp)
MessageBox(hdlg,str,"无法打开文件!",MB_ICONERROR);
else
{
SetDlgItemText(hdlg,IDC_INPUT,in);
for(i=0,j=0;i<s.num;i++)
{
if(s.sym[i].type==TYPE_ERROR)
{
fprintf(fp,"%-2d(ERROR%d)[line:%d]:%s:\"%s\"\r\n",i,s.sym[i].id,s.sym[i].line,errtxt[s.sym[i].id],s.sym[i].name);
j++;
}
else
fprintf(fp,"%-2d(%d,%d)%s\r\n",i,s.sym[i].type,s.sym[i].id,s.sym[i].name);
}
fprintf(fp,"\r\n%d Symbol(s) Found.",s.num-j);
fprintf(fp,"\r\n%d Error(s) Found.\r\n",j);
fclose(fp);
SendDlgItemMessage(hdlg,IDC_ERRPUT,LB_ADDSTRING,0,(DWORD)"File Saved.");
}
break;
case ID_COMPILE:
SetCursor(LoadCursor(0,IDC_WAIT));
GetDlgItemText(hdlg,IDC_INPUT,buf,65535);
cp=new zCompile;
cp->compile(buf);
errnum=cp->geterr(buf);
SetDlgItemText(hdlg,IDC_ERR,buf);
asmnum=cp->getasm(buf);
SetDlgItemText(hdlg,IDC_ASM,buf);
delete cp;
SetCursor(LoadCursor(0,IDC_ARROW));
break;
case ID_RUN:
if(!asmnum)
MessageBox(hdlg,"请先编译后再运行!","错误",MB_ICONERROR);
else
if(errnum)
MessageBox(hdlg,"请先改正错误后再运行!","错误",MB_ICONERROR);
else
{
fp=fopen("temp.txt","wb");
fprintf(fp,"%u\r\n",asmnum);
fwrite(buf,1,strlen(buf),fp);
fclose(fp);
WinExec("E://大三下学期//词法分析//Debug//pl0run",1);
// _main();
}
break;
case ID_ABOUT:
MessageBox(hdlg,"编译系统 1.0\n2007.5.11\n作者:刘伟","帮助",NULL);
break;
}
return 1;
case WM_CLOSE:
EndDialog(hdlg,0);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -