?? 預(yù)測(cè)分析法.txt
字號(hào):
#include <fstream.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
struct code_val
{
char code;char val[20];
};
const char *p[ ]= //指向產(chǎn)生式右部符號(hào)串
{"TD","+TD","","FS","*FS","","(E)","i","x","y"};
const char T[ ]="+*()ixy#"; //分析表的列符
const char NT[ ]="EDTSF"; //分析表的行符,行符為EE'TT'F。
/*在預(yù)測(cè)分析表M中存放指針數(shù)組p的下標(biāo)x,設(shè)M[i][j]=x,通過(guò)p[M[i][j]]=p[x]獲取右部符號(hào)串。*/
const int M[ ][8]=
{ {-1,-1,0,-1,0,0,0,-1}, //p[0]指向第0個(gè)產(chǎn)生式右部符號(hào)串"TD",-1表示出錯(cuò)。
{1,-1,-1,2,-1,-1,-1,2},
{-1,-1,3,-1,3,3,3,-1},
{5,4,-1,5,-1,-1,-1,5},
{-1,-1,6,-1,7,8,9,-1}
};
int lin(char c) //將EDTSF分別轉(zhuǎn)換為01234
{
for(int i=0;i<(int)strlen(NT);i++)
if(c==NT[i]) return i;
cout<<"Err in lin( ) >"<<c<<endl;exit(0);
}
int col(char c) //將+* ()ixy#分別轉(zhuǎn)換為01234567
{
for(int i=0;i<(int)strlen(T);i++)
if(c==T[i]) return i;
cout<<"Err in col( )>"<<c<<endl;exit(0);
}
bool isNT(char c) //是否是非終結(jié)符
{
for(int i=0;i<(int)strlen(NT);i++)
if(c==NT[i]) return true;
return false;
}
bool isT(char c) //是否是終結(jié)符(不包括'#')
{
for(int i=0;i<(int)strlen(T)-1;i++)
if(c==T[i]) return true;
return false;
}
void main(void)
{
int i,j=0;
ifstream cinf("lex_r.txt",ios::in); //從文件lex_r.txt輸入數(shù)據(jù)
ofstream cout("par_r.txt",ios::out); //結(jié)果輸出至文件par_r.txt(cout重定義)
struct code_val t; //定義結(jié)構(gòu)變量,存放單詞二元式。
cinf>>t.code>>t.val; //讀一個(gè)單詞的二元式
char stack[20]={'#','E'};int top=1; //棧賦初值
char X=' '; //用于顯示,并非必要。
cout<<"step"<<'\t'<<"stack"<<'\t'<<"X"<<'\t'<<"t.code"<<endl; //用于顯示,并非必要。
cout<<j<<')'; //用于顯示,并非必要。
while(1)
{
cout<<'\t'; //用于顯示,并非必要。
for(i=0;i<=top;i++) cout<<stack[i]; //用于顯示,并非必要。
cout<<'\t'<<' '<<'\t'<<t.code<<endl; //用于顯示,并非必要。
X=stack[top--]; //出棧
cout<<++j<<')'<<'\t'; //用于顯示,并非必要。
for(i=0;i<=top;i++) cout<<stack[i]; //用于顯示,并非必要。
cout<<'\t'<<X<<'\t'<<t.code<<endl; //用于顯示,并非必要。
if(X=='#')
{
if(X==t.code)
{
cout<<"\tAcc"<<endl;break;
}
else
{
cout<<"Err in #>"<<X<<'\t'<<t.code<<endl;exit(0);
}
}
if(isT(X)) //是否是終結(jié)符
{ if(X==t.code)
{
cinf>>t.code>>t.val; //讀下一單詞二元式
}
else
{
cout<<"Err in T>"<<X<<'\t'<<t.code<<endl;exit(0);
}
continue;
}
if(isNT(X))
{ //是否是非終結(jié)符
if(M[lin(X)][col(t.code)]==-1)
{
cout<<"Err in NT>"<<X<<'\t'<<t.code<<endl;exit(0);
}
else{
for(i=strlen(p[M[lin(X)][col(t.code)]])-1;i>=0;i--)
stack[++top]=*(p[M[lin(X)][col(t.code)]]+i);
}
continue;
}
cout<<"Err in main( )>"<<X<<endl;exit(0);
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -