?? syntax.cpp
字號(hào):
/*
語(yǔ)法分析外殼程序 0.2 (2003.10.23) [實(shí)現(xiàn)文件]
作者:Dwing
*/
#include "syntax.h" //For Shell
#include "zSyntax.h" //For Core Class
HINSTANCE hinst; //Recent Instance
HWND hwnd; //For Dialog
zSyntax *s; //語(yǔ)法分析類
char in[65536]; //輸入文法緩沖區(qū)
char out[65536]; //輸出結(jié)果緩沖區(qū)
char str[256],b[256]; //臨時(shí)字串緩沖區(qū)
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; //結(jié)尾清0防止溢出
out[65535]=0; //結(jié)尾清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("檢查產(chǎn)生式......");
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("有錯(cuò)誤!");
return 1;
}
if(!*p++) break;
}
printout("正確!\r\n驗(yàn)證文法及測(cè)試字串......");
if(i=s->check())
{
printout("錯(cuò)誤:");
switch(-i)
{
case 1:printout("非終結(jié)符集無(wú)元素!");break;
case 2:printout("終結(jié)符集無(wú)元素!");break;
case 3:printout("非終結(jié)符集和終結(jié)符集有交集!");break;
case 4:printout("沒有初始符!");break;
case 5:printout("初始符不是非終結(jié)符!");break;
case 6:printout("沒有產(chǎn)生式!");break;
case 7:printout("沒有以初始符為左部的產(chǎn)生式!");break;
case 8:printout("產(chǎn)生式左部有非法符號(hào)!");break;
case 9:printout("產(chǎn)生式右部有非法符號(hào)!");break;
case 10:printout("產(chǎn)生式有左遞歸!");break;
case 11:printout("測(cè)試字串包含非法字符!");break;
case 12:printout("測(cè)試字串不是以\'#\'結(jié)尾!");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("驗(yàn)證LL(1)文法......");
if(s->checkll1())
{
printout("失敗!\r\n輸入的文法不是LL(1)文法!");
break;
}
printout("合格!\r\n 文法預(yù)測(cè)分析表\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(" 對(duì)測(cè)試字串的分析過程\r\n");
printout("----------------------------------------\r\n");
printout("分析棧\t剩余輸入串\t所用產(chǎn)生式\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.輸入的文法不能含有#,空格,漢字,全角符號(hào).\n2.表示空時(shí)用\"@\".\n3.輸入的測(cè)試字串要以\"#\"結(jié)尾.","說(shuō)明",NULL);
break;
case ID_ABOUT:
MessageBox(hdlg,"LL(1)語(yǔ)法分析系統(tǒng) 0.2\n2003.10.23\n作者:Dwing","關(guān)于",NULL);
break;
default:
return 0;
}
return 1;
case WM_CLOSE:
EndDialog(hdlg,0);
}
return 0;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -