- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算符优先算法
#includeiostream
#includestring
#includestdlib.h
#includemalloc.h
#includestdlib.h
#include stdio.h
using namespace std;
int main()
{
int lk(char );
int i,j,k,w=0,q=1,U=0,U1=0,U2=0;
int m,n;
string yuju[10]; //存放文法
string NT[10]; //存放非终结符
string VT[20]; //存放终结符
cout请输入文法(以#号结束):endl;
for(int e=0;e20;e++)
{
cinyuju[e];getchar();
U++; //U为文法规则的个数
if (yuju[e][0]==#)
{
U--;
cout文法规则的个数 U=Uendlendl;
break;
}
}
cout请输入此文法的非终结符(以#号结束):endl;
for(int e1=1;e120;e1++)
{
cinNT[e1];getchar();
U1++;
if (NT[e1][0]==#)
{ U1--; //U1为非终结符个数
cout非终结符个数 U1=U1endlendl;
NT[0]= ;
break;
}
}
cout请输入此文法终结符个数(第一个请输入空格,最后别忘输入$,以#号结束):endl;
for(int e2=1;e220;e2++)
{
cinVT[e2];getchar();
U2++; //U2为终结符个数
if (VT[e2][0]==#)
{ U2--;cout终结符个数 U2=U2endlendl;
VT[0]= ;
break;
}
}
int NV[10][10]={0}; //NV 数组存放FIRSTVT集
int NVL[10][10]={{0},{0},{0},{0}}; //NVL 数组存放LASTVT集
struct as //符号对结构体
{
char NT;
char VT;
};
struct stack //符号对堆栈
{
as *base;
as * top;
};
stack s;
stack s1;
s.base=(as *)malloc(11*sizeof(as));
s.top=s.base;
s1.base=(as *)malloc(11*sizeof(as));
s1.top=s1.base;
/*****************************以下求FIRSTVT集***************************/
coutFIRSTVT集为:endl;
for( i=0;iU;i++)
{
if(yuju[i][3]=A yuju[i][3]=Zyuju[i][4]==\0); //E-A型
else
{
if(yuju[i][3]A|| yuju[i][3]Z) //E-a...型
{
s.top-NT=yuju[i][0];
s.top-VT=yuju[i][3];
}
else if(yuju[i][4]A|| yuju[i][4]Z) //E-Aa...型
{
s.top-NT=yuju[i][0];
s.top-VT=yuju[i][4];
}
couts.top-NT;
for(j=1;jU1;j++)
{
if((NT[j][0]-s.top-NT)==0) break;
}
couts.top-VTendl;
for(k=1;kU2;k
文档评论(0)