⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 472.cpp

📁 学习编译原理的实用教程.教程共分7章: 第1章 编译系统概述 第2章 词法分析 第3章 程序设计语言的语法描述 第4章 自上而下的语法分析 第5章 自下而上的语法分析 第6章 语法制导翻译
💻 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 + -