📄 compiler.cpp
字号:
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 + -