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

📄 winapp.cpp

📁 扩充PL0语言的编译器
💻 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 + -