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

📄 syntax.cpp

📁 很好玩的一个小游戏
💻 CPP
字号:
/*
	语法分析外壳程序 0.2 (2003.10.23) [实现文件]
	作者:Dwing
*/
#include "syntax.h"		//For Shell
#include "zSyntax.h"	//For Core Class

HINSTANCE hinst;		//Recent Instance
HWND hwnd;				//For Dialog
zSyntax *s;				//语法分析类
char in[65536];			//输入文法缓冲区
char out[65536];		//输出结果缓冲区
char str[256],b[256];	//临时字串缓冲区

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	s=new zSyntax;
	hinst=hInstance;
	DialogBox(hinst,MAKEINTRESOURCE(IDD_MAINDLG),NULL,(DLGPROC)dlgproc);
	delete s;
	return 0;
}

void printout(char *b)	//串行化输出
{
	strcat(out,b);
	SetDlgItemText(hwnd,IDC_OUTPUT,out);
}

BOOL CALLBACK dlgproc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam)
{
	int i,j;char *p;
	switch(msg)
	{
	case WM_INITDIALOG:
		hwnd=hdlg;
		in[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_INPUT,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(in,"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(in,"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_INPUT,in);
		SetDlgItemText(hdlg,IDC_BEGIN,"E");
		SetDlgItemText(hdlg,IDC_TEST,"i+i*i#");
		break;
	case WM_COMMAND:
		switch(LOWORD(wparam))
		{
		case ID_START:
			SetCursor(LoadCursor(NULL,IDC_WAIT));
			s->reset();
			*out=0;
			printout("检查产生式......");
			GetDlgItemText(hdlg,IDC_VN,in,65535);
			s->setvn(in);
			GetDlgItemText(hdlg,IDC_VT,in,65535);
			s->setvt(in);
			GetDlgItemText(hdlg,IDC_BEGIN,in,2);
			s->setstart(*in);
			GetDlgItemText(hdlg,IDC_TEST,in,65535);
			s->settest(in);
			GetDlgItemText(hdlg,IDC_INPUT,in,65535);
			p=in;
			while(1)
			{
				i=0;
				while(*p>32)
					str[i++]=*p++;
				str[i]=0;
				if(i&&s->addp(str))
				{
					printout("有错误!");
					return 1;
				}
				if(!*p++) break;
			}
			printout("正确!\r\n验证文法及测试字串......");
			if(i=s->check())
			{
				printout("错误:");
				switch(-i)
				{
				case 1:printout("非终结符集无元素!");break;
				case 2:printout("终结符集无元素!");break;
				case 3:printout("非终结符集和终结符集有交集!");break;
				case 4:printout("没有初始符!");break;
				case 5:printout("初始符不是非终结符!");break;
				case 6:printout("没有产生式!");break;
				case 7:printout("没有以初始符为左部的产生式!");break;
				case 8:printout("产生式左部有非法符号!");break;
				case 9:printout("产生式右部有非法符号!");break;
				case 10:printout("产生式有左递归!");break;
				case 11:printout("测试字串包含非法字符!");break;
				case 12:printout("测试字串不是以\'#\'结尾!");break;
				}
				break;
			}
			printout("正确!\r\n    FIRST集合:\r\n");
			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");
			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");
			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)文法......");
			if(s->checkll1())
			{
				printout("失败!\r\n输入的文法不是LL(1)文法!");
				break;
			}
			printout("合格!\r\n    文法预测分析表\r\n");
			s->doform();
			printout("--------------------------------------------------\r\n");
			for(i=0;i<s->vt->getnum();i++)
			{
				wsprintf(b,"\t%c",s->vt->getdata()[i]);
				printout(b);
			}
			printout("\t@");
			for(i=0;i<s->vn->getnum();i++)
			{
				wsprintf(b,"\r\n%c",s->vn->getdata()[i]);
				printout(b);
				for(j=0;j<=s->vt->getnum();j++)
				{
					printout("\t");
					if(s->m[i][j])
					{
						s->m[i][j]->print(b);
						printout(b);
					}
				}
			}
			printout("\r\n--------------------------------------------------\r\n");
			printout("    对测试字串的分析过程\r\n");
			printout("----------------------------------------\r\n");
			printout("分析栈\t剩余输入串\t所用产生式\r\n");
			i=s->dotest(in);
			printout(in);
			if(i) printout("\t不匹配!\r\n");
			printout("----------------------------------------\r\n");
			SetCursor(LoadCursor(NULL,IDC_ARROW));
			break;
		case ID_HOWTO:
			MessageBox(hdlg,"1.输入的文法不能含有#,空格,汉字,全角符号.\n2.表示空时用\"@\".\n3.输入的测试字串要以\"#\"结尾.","说明",NULL);
			break;
		case ID_ABOUT:
			MessageBox(hdlg,"LL(1)语法分析系统 0.2\n2003.10.23\n作者:Dwing","关于",NULL);
			break;
		default:
			return 0;
		}
		return 1;
	case WM_CLOSE:
		EndDialog(hdlg,0);
	}
	return 0;
}

⌨️ 快捷键说明

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