📄 472.cpp
字号:
//4.7.2 预测分析控制程序
#include <fstream.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
struct code_val{
char code;char val[20];
};
const char *p[ ]={ //指向产生式右部符号串
"TD","+TD","","FS","*FS","","(E)","i","x","y"
};
//0. E→TD D代表E'
//1. D→+TD
//2. D→ε
//3. T→FS S代表T'
//4. S→*FS
//5. S→ε
//6. F→(E)
//7. F→i
//8. F→x
//9. F→y
const char T[ ]="+*()ixy#"; //分析表的列符
const char NT[ ]="EDTSF"; //分析表的行符,行符为EE'TT'F。
const int M[ ][8]={
/*在预测分析表M中存放指针数组p的下标x,设M[i][j]=x,通过p[M[i][j]]=p[x]获取右部符号串。*/
{-1,-1,0,-1,0,0,0,-1},//p[0]指向第0个产生式右部符号串"TD",-1表示出错。
{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 ); //非终结符转换为行号
int col(char ); //终结转换为列号
bool isNT(char); //isNT判断是否是非终结符
bool isT(char); //isT判断是否是终结符。
void main(void)
{
int i,j=0;
ifstream cinf("lex_r.txt",ios::in); //从文件lex_r.txt输入数据
ofstream cout("par_r.txt",ios::out); //结果输出至文件par_r.txt(cout重定义)
struct code_val t; //定义结构变量,存放单词二元式。
cinf>>t.code>>t.val; //读一个单词的二元式
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);
}
}//end of if(X=='#')
if(isT(X)){ //是否是终结符
if (X== t.code)
cinf>>t.code>>t.val; //读下一单词二元式
else{
cout<<"Err in T>"<<X<<'\t'<<t.code<<endl;exit(0);
}
continue;
}//end of if(isT(X))
if(isNT(X)){ //是否是非终结符
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;
}//end of if(isNT(X))
cout<<"Err in main( )>"<<X<<endl;exit(0);
}//end of while
}//end of main
int lin(char c) //将EDTSF分别转换为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#分别转换为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) //是否是非终结符
{
for(int i=0;i<(int)strlen(NT);i++)
if(c==NT[i])return true;
return false;
}
bool isT(char c) //是否是终结符(不包括'#')
{
for(int i=0;i<(int)strlen(T)-1;i++)
if(c==T[i])return true;
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -