预测分析法.txt

来自「目的是在栈、表以及预测分析法原理的基础上」· 文本 代码 · 共 102 行

TXT
102
字号
#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"}; 
const char T[ ]="+*()ixy#";			//分析表的列符
const char NT[ ]="EDTSF";			//分析表的行符,行符为EE'TT'F。
/*在预测分析表M中存放指针数组p的下标x,设M[i][j]=x,通过p[M[i][j]]=p[x]获取右部符号串。*/
const int M[ ][8]=
{   {-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 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;
}
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);
			}
		}
		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;
		}
		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;
		}
		cout<<"Err in main( )>"<<X<<endl;exit(0);
    }
}

⌨️ 快捷键说明

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