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

📄 wintest.cpp

📁 pl0的编译器
💻 CPP
字号:
///////////////////////////////////////////////////////////////
//ccy 2004.9修改,支持if then else ;repeat until;及数组
///////////////////////////////////////////////////////////////
#include <windows.h>
#include <commdlg.h>
#include"zCompile.h"
#include "resource.h"

HINSTANCE hinst;	//Recent Instance
OPENFILENAME ofn;	//For Open File Dialog
FILE *fp;			//For Open File
zCompile *cp;		//编译器对象指针
int asmnum=0;		//目标代码数量
int errnum=0;		//错误数量
char buf[65536];	//I/O Buffer
char str[512];		//File Name Buffer														
LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	Mydialog(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	hinst=hInstance;
	DialogBox(hInstance, (LPCTSTR)IDD_MYDIALOG, 0, (DLGPROC)Mydialog);
	return 0;
}
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_INITDIALOG:
		return TRUE;
		
	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
		{
			EndDialog(hDlg, LOWORD(wParam));
			return TRUE;
		}
		break;
	}
    return FALSE;
}
LRESULT CALLBACK Mydialog(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lParam)
{
		int i;
	switch(msg)
	{
	case WM_INITDIALOG:
		buf[65535]=0;	//结尾清0防止溢出
		//str[0]=0;		//Clear str[]
	//Set Window Text Font
		SendDlgItemMessage(hdlg,IDC_INPUT,WM_SETFONT,(DWORD)GetStockObject(ANSI_FIXED_FONT),0);
		SendDlgItemMessage(hdlg,IDC_ASM,WM_SETFONT,(DWORD)GetStockObject(SYSTEM_FIXED_FONT),0);
		SendDlgItemMessage(hdlg,IDC_ERR,WM_SETFONT,(DWORD)GetStockObject(SYSTEM_FIXED_FONT),0);
	//填充OPENFILENAME结构体
		memset(&ofn,0,sizeof(OPENFILENAME));	//Clear it First
		ofn.lStructSize=sizeof(OPENFILENAME);
		ofn.hwndOwner=hdlg; 
		ofn.hInstance=hinst;
		ofn.lpstrFilter="所有文件(*.*)\0*.*\0";
		ofn.nMaxFile=511;		//最大文件名缓冲区长度
		ofn.lpstrFile=str;		//使用临时字符串
		ofn.Flags=OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;
		ofn.lpstrTitle="PL/0文件";
		DialogBox(hinst,MAKEINTRESOURCE(IDD_ABOUTBOX),0,(DLGPROC)About);
		return 1;
	case WM_COMMAND:
		switch(LOWORD(wparam))
		{
		case ID_COMPILE:
			SetCursor(LoadCursor(0,IDC_WAIT));			//Please wait...
			GetDlgItemText(hdlg,IDC_INPUT,buf,65535);	//Get PL/0 Text
			cp=new zCompile;							//Let's begin to compile...
			cp->compile(buf);							//Do the most complex part
			errnum=cp->geterr(buf);						//Get Error Text
			SetDlgItemText(hdlg,IDC_ERR,buf);			//Display it
			asmnum=cp->getasm(buf);						//Get ASM Text
			SetDlgItemText(hdlg,IDC_ASM,buf);			//Display it
			delete cp;									//The end of Compiling
			SetCursor(LoadCursor(0,IDC_ARROW));	
			//Completed
			break;
		case ID_RUN:
			if(!asmnum)
				MessageBox(hdlg,"请先编译后再运行!","错误",MB_ICONERROR);
			else
				if(errnum)
					MessageBox(hdlg,"请先改正错误后再运行!","错误",MB_ICONERROR);
				else
				{
					fp=fopen("temp.pl0","wb");	//Write to temp file
					fprintf(fp,"%u\r\n",asmnum);
					fwrite(buf,1,strlen(buf),fp);
					fclose(fp);
					WinExec("pl0run",1);		//Call PL/0 Interpreter
				}
			break;
		case ID_OPEN:
			if(!GetOpenFileName(&ofn)) break;
			//str[512]=0;				//防止溢出
			if(!(fp=fopen(ofn.lpstrFile,"rb")))
				MessageBox(hdlg,str,"无法打开文件!",MB_ICONERROR);
			else
			{
				fseek(fp,0,SEEK_END);
				if((i=ftell(fp))>65535)
					MessageBox(hdlg,"文件过长(>=64K)!","错误",MB_ICONERROR);
				else
				{
					fseek(fp,0,SEEK_SET);
					fread(buf,1,i,fp);
					buf[i]=0;			//防止溢出
					SetDlgItemText(hdlg,IDC_INPUT,buf);
				}
				fclose(fp);
			}
			break;
		case ID_NEW:
			memset(buf,0,sizeof(buf));
			SetDlgItemText(hdlg,IDC_INPUT,buf);
			break;
		case ID_SAVE:
			if(!GetSaveFileName(&ofn))break;
			str[512]=0;	
			if(!(fp=fopen(ofn.lpstrFile,"wb")))
				MessageBox(hdlg,str,"无法创建文件!",MB_ICONERROR);
			else
			{
				GetDlgItemText(hdlg,IDC_INPUT,buf,65535);
				fprintf(fp,"%s",buf);
			}
			fclose(fp);
			break;
			
		case ID_ABOUT:
			DialogBox(hinst,MAKEINTRESOURCE(IDD_ABOUTBOX),0,(DLGPROC)About);
		}
		return 1;
	case WM_CLOSE:
		EndDialog(hdlg,0);
	}
	return 0;
}

⌨️ 快捷键说明

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