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

📄 compiler.cpp

📁 vc实现的pl0编译器,有读取输出功能-read() -write(),这个源码对初学编译原理者有很好的指导作用,我当初学的时候用了3天看懂了源码,也对编译原理更加理解了,毕竟只学理论不看代码是不可能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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_ABOUT:
			DialogBox(hinst,MAKEINTRESOURCE(IDD_ABOUT),0,(DLGPROC)abtproc);
		
		}
		return 1;
	case WM_CLOSE:
		EndDialog(hdlg,0);
	}
	return 0;
}
///////////////////////////////////////////////////////////////
//For ABOUT DialogBox
BOOL CALLBACK abtproc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam)
{
	switch(msg)
	{
	case WM_LBUTTONDOWN:												//When dragging me...
		PostMessage(hdlg,WM_NCLBUTTONDOWN,2,0);
		return 1;
	case WM_COMMAND:
		if(LOWORD(wparam)==IDOK)
			EndDialog(hdlg,0);
	}
	return 0;
}
///////////////////////////////////////////////////////////////
//for input dialogbox
BOOL CALLBACK inputproc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam)
{
	switch(msg)
	{
	case WM_LBUTTONDOWN:												//When dragging me...
		PostMessage(hdlg,WM_NCLBUTTONDOWN,2,0);
		return 1;
	case WM_COMMAND:
		if(LOWORD(wparam)==IDOK)
		{
            GetDlgItemText(hdlg,IDC_IN,in,16);

			EndDialog(hdlg,0);
		}
	}
	return 0;
}
void printout(char *b)	//串行化输出
{
	strcat(out,b);
	
}
//语法分析过程
BOOL CALLBACK synproc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam)
{
	int i,j;char *p;s=new zSyntax ;
	switch(msg)
	{
	case WM_INITDIALOG:
//		hwnd=hdlg;
		text[65535]=0;	//结尾清0防止溢出
		out[65535]=0;	//结尾清0防止溢出
	//	SendMessage(hdlg,WM_SETICON,ICON_BIG,(LPARAM)LoadIcon(hinst,MAKEINTRESOURCE(IDI_ICON)));
		SendDlgItemMessage(hdlg,IDC_VN,WM_SETFONT,(DWORD)GetStockObject(ANSI_FIXED_FONT),0);
		SendDlgItemMessage(hdlg,IDC_VT,WM_SETFONT,(DWORD)GetStockObject(ANSI_FIXED_FONT),0);
		SendDlgItemMessage(hdlg,IDC_INPUTSYN,WM_SETFONT,(DWORD)GetStockObject(ANSI_FIXED_FONT),0);
		SendDlgItemMessage(hdlg,IDC_OUTPUT,WM_SETFONT,(DWORD)GetStockObject(SYSTEM_FIXED_FONT),0);
		SendDlgItemMessage(hdlg,IDC_TEST,WM_SETFONT,(DWORD)GetStockObject(ANSI_FIXED_FONT),0);
//		SetDlgItemText(hdlg,IDC_VN,"ABCDS");//Another Example.
//		SetDlgItemText(hdlg,IDC_VT,"abc");
//		strcpy(text,"S->AB\r\nS->cC\r\nA->@\r\nA->b\r\nB->@\r\nB->aD\r\nC->AD\r\nC->@\r\nD->aS\r\nD->c");
		SetDlgItemText(hdlg,IDC_VN,"EeTtF");
		SetDlgItemText(hdlg,IDC_VT,"i+*()");
		strcpy(text,"E->Te\r\ne->+Te\r\ne->@\r\nT->Ft\r\nt->*Ft\r\nt->@\r\nF->i\r\nF->(E)\r\n");
		SetDlgItemText(hdlg,IDC_INPUTSYN,text);
		SetDlgItemText(hdlg,IDC_BEGIN,"E");
		SetDlgItemText(hdlg,IDC_TEST,"i+i*i#");
		break;
	case WM_COMMAND:
		
		switch(LOWORD(wparam))
		{
		case ID_SYNBEGIN:
			
			SetCursor(LoadCursor(NULL,IDC_WAIT));
			s->reset();
			*out=0;
			printout("检查产生式......");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			GetDlgItemText(hdlg,IDC_VN,text,65535);
			s->setvn(text);
			GetDlgItemText(hdlg,IDC_VT,text,65535);
			s->setvt(text);
			GetDlgItemText(hdlg,IDC_BEGIN,text,2);
			s->setstart(*text);
			GetDlgItemText(hdlg,IDC_TEST,text,65535);
			s->settest(text);
			GetDlgItemText(hdlg,IDC_INPUTSYN,text,65535);
			p=text;
			while(1)
			{
				i=0;
				while(*p>32)
					str1[i++]=*p++;
				str1[i]=0;
				if(i&&s->addp(str1))
				{
					printout("有错误!");
					SetDlgItemText(hdlg,IDC_OUTPUT,out);
					return 1;
				}
			if(!*p++) break;
			}
			printout("正确!\r\n验证文法及测试字串......");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			if(i=s->check())
			{
				printout("错误:");
				SetDlgItemText(hdlg,IDC_OUTPUT,out);
				switch(-i)
				{
				case 1:printout("非终结符集无元素!");SetDlgItemText(hdlg,IDC_OUTPUT,out);break;
				case 2:printout("终结符集无元素!");SetDlgItemText(hdlg,IDC_OUTPUT,out);break;
				case 3:printout("非终结符集和终结符集有交集!");SetDlgItemText(hdlg,IDC_OUTPUT,out);break;
				case 4:printout("没有初始符!");SetDlgItemText(hdlg,IDC_OUTPUT,out);break;
				case 5:printout("初始符不是非终结符!");SetDlgItemText(hdlg,IDC_OUTPUT,out);break;
				case 6:printout("没有产生式!");SetDlgItemText(hdlg,IDC_OUTPUT,out);break;
				case 7:printout("没有以初始符为左部的产生式!");SetDlgItemText(hdlg,IDC_OUTPUT,out);break;
				case 8:printout("产生式左部有非法符号!");SetDlgItemText(hdlg,IDC_OUTPUT,out);break;
				case 9:printout("产生式右部有非法符号!");SetDlgItemText(hdlg,IDC_OUTPUT,out);break;
				case 10:printout("产生式有左递归!");SetDlgItemText(hdlg,IDC_OUTPUT,out);break;
				case 11:printout("测试字串包含非法字符!");SetDlgItemText(hdlg,IDC_OUTPUT,out);break;
				case 12:printout("测试字串不是以\'#\'结尾!");SetDlgItemText(hdlg,IDC_OUTPUT,out);break;
				}
				break;
			}
			printout("正确!\r\n    FIRST集合:\r\n");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			s->dofirst();
			for(i=0;i<s->vn->getnum();i++)
			{
				s->first[i]->print(b);
				wsprintf(p,"First(%c) =%s\r\n",s->vn->getdata()[i],b);
				strcat(out,p);
			}
			printout("    FOLLOW集合:\r\n");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			s->dofollow();
			for(i=0;i<s->vn->getnum();i++)
			{
				s->follow[i]->print(b);
				wsprintf(p,"Follow(%c)=%s\r\n",s->vn->getdata()[i],b);
				strcat(out,p);
			}
			printout("    SELECT集合:\r\n");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			s->doselect();
			for(i=0;i<s->pnum;i++)
			{
				s->right[i]->print(b);
				wsprintf(p,"Select(%c->%s)",s->left[i],b);
				strcat(out,p);
				s->select[i]->print(b);
				wsprintf(p,"=%s\r\n",b);
				strcat(out,p);
			}
			printout("验证LL(1)文法......");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			if(s->checkll1())
			{
				printout("失败!\r\n输入的文法不是LL(1)文法!");
				SetDlgItemText(hdlg,IDC_OUTPUT,out);
				break;
			}
			printout("合格!\r\n    文法预测分析表\r\n");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			s->doform();
			printout("--------------------------------------------------\r\n");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			for(i=0;i<s->vt->getnum();i++)
			{
				wsprintf(b,"\t%c",s->vt->getdata()[i]);
				printout(b);
				SetDlgItemText(hdlg,IDC_OUTPUT,out);
			}
			printout("\t@");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			for(i=0;i<s->vn->getnum();i++)
			{
				wsprintf(b,"\r\n%c",s->vn->getdata()[i]);
				printout(b);
				SetDlgItemText(hdlg,IDC_OUTPUT,out);
				for(j=0;j<=s->vt->getnum();j++)
				{
					printout("\t");
					SetDlgItemText(hdlg,IDC_OUTPUT,out);
					if(s->m[i][j])
					{
						s->m[i][j]->print(b);
						printout(b);
						SetDlgItemText(hdlg,IDC_OUTPUT,out);
					}
				}
			}
			printout("\r\n--------------------------------------------------\r\n");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			printout("    对测试字串的分析过程\r\n");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			printout("----------------------------------------\r\n");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			printout("分析栈\t剩余输入串\t所用产生式\r\n");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			i=s->dotest(text);
			printout(text);
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			if(i) printout("\t不匹配!\r\n");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			printout("----------------------------------------\r\n");
			SetDlgItemText(hdlg,IDC_OUTPUT,out);
			SetCursor(LoadCursor(NULL,IDC_ARROW));
	        
			break;
		case IDC_HOWtoUSE:
			MessageBox(hdlg,"1.输入的文法不能含有#,空格,汉字,全角符号.\n2.表示空时用\"@\".\n3.输入的测试字串要以\"#\"结尾.","说明",NULL);
			break;
		default:
			return 0;
		}
		return 1;

	case WM_CLOSE:
		EndDialog(hdlg,0);
		return true;
	}
	delete s;
	return 0;
  
}

⌨️ 快捷键说明

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