当前位置: 首页 > news >正文

F - 算符优先分析

Description

E→E+T |T

T→T*F |F

    F→(E) | i

该表达式文法是算符优先文法,其算符优先分析表为: 

注意:构造算符优先分析表前,请先拓广文法,例如引入非终结符Q,令Q→#E#。

Input

输入数据有多行。
第一行为一个整数n(n<=50),代表文法中产生式的个数,其中不包括拓广文法增加的产生式。
接下来的n行,每行给出一个产生式。
最后一行给出待分析的输入串,长度不超过50个符号。

Output

要求输出该文法的算符优先分析表,输出格式请参考上面的表格。
算符优先分析表中算符的排列顺序为输入文法时终结符出现的顺序,#出现在最后。
算符之间的优先关系,分别用=、<和>表示,代表相同、低于和高于的优先关系。
第一行先输出一个空格,然后按顺序输出所有算符。
第二行开始第一列为对应的算符,接着输出对应算法之间的优先关系。
输出的最后一行表示对输入串的分析是否成功结束,如果成功分析结束输出Success,表示该输入串是文法的一个句子,否者输出Fail,表示该输入串不是文法的一个句子。

Samples

Sample #1
Input 
6
E->E+T
E->T
T->T*F
T->F
F->(E)
F->i
i+i*i
Output 
+*()i#
+><<><>
*>><><>
(<<<=< 
)>> > >
i>> > >
#<<< <=
Success
#include <iostream>
#include <string.h>
using namespace std;
string str[30][100];
char st[30][100],st1[30][100],order[60],st2[100][2],st3[100],st4[100][2];
int num[30],num1[30],bj1[30],bj2[150],sum[100][100],st3l,st4l;
char Stack[100],sta[100];
int top,top1,end1,number,bj0[150];
void print(char a)
{int b=a-'A';for(int i=0;i<num[b];i++){if(st[b][i]>='A'&&st[b][i]<='Z')print(st[b][i]);else st3[st3l++]=st[b][i];}
}
void print1(char a)
{int b=a-'A';for(int i=0;i<num1[b];i++){if(st1[b][i]>='A'&&st1[b][i]<='Z')print1(st1[b][i]);else st3[st3l++]=st1[b][i];}
}
void print_stack()
{for(int i=0;i<=top;i++)cout<<Stack[i];
}
void print_sta()
{if(top1+1==end1) cout<<"#";for(int i=top1+1;i<end1;i++)cout<<sta[i];
}
int main()
{int i,j,k,kk,m,n,nn,mm,bj,l,ll,bj3;char s;while(cin>>m){memset(bj0,0,sizeof(bj0));    //test9l=ll=bj3=st4l=0;for(i=0;i<150;i++)bj2[i]=0;for(i=0;i<30;i++){num[i]=0; num1[i]=0; bj1[i]=0;}string str1,str2;for(i=0;i<m;i++){cin>>str1;if(i==0) s=str1[0];mm=str1[0]-'A';n=str1.size();str2=str1.substr(3,n);char *p=&str2[0];//const char *d="|";//p=strtok(str3,d);//while(p!=NULL)//{bj=0;nn=strlen(p);if(nn==1){st[mm][num[mm]]=p[0];num[mm]++;st1[mm][num1[mm]]=p[0];num1[mm]++;if(p[0]<'A'||p[0]>'Z'){bj0[p[0]]=1;     //test9if(p[0]!='#'){order[l++]=p[0]; bj2[p[0]]=1;}else bj3=1;}}else{int aa=0;char bb;for(j=0;j<nn;j++){if(p[j]<'A'||p[j]>'Z'){bj0[p[j]]=nn;       //test9if(aa==0){bb=p[j];aa=1;}else{st4[st4l][0]=bb;st4[st4l++][1]=p[j];}if(bj2[p[j]]==0){if(p[j]!='#'){order[l++]=p[j];bj2[p[j]]=1;}else bj3=1;}if(bj!=1){bj=1;st[mm][num[mm]]=p[j];num[mm]++;}}if(j>0){if((p[j]<'A'||p[j]>'Z')&&p[j-1]>='A'&&p[j-1]<='Z'){st2[ll][0]=p[j-1];st2[ll++][1]=p[j];continue;}if((p[j-1]<'A'||p[j-1]>'Z')&&p[j]>='A'&&p[j]<='Z'){st2[ll][0]=p[j-1];st2[ll++][1]=p[j];}}}if(bj==0){st[mm][num[mm]]=p[0];num[mm]++;}bj=0;for(j=nn-1;j>=0;j--){if(p[j]<'A'||p[j]>'Z'){bj=1;st1[mm][num1[mm]]=p[j];num1[mm]++;break;}}if(bj==0){st1[mm][num[mm]]=p[0];num1[mm]++;}}//p=strtok(NULL,d);//}}order[l++]='#';bj2['#']=1;st2[ll][0]='#';st2[ll++][1]=s;st2[ll][0]=s;st2[ll++][1]='#';memset(sum,0,sizeof(sum));for(i=0;i<ll;i++){st3l=0;if(st2[i][0]>='A'&&st2[i][0]<='Z'){print1(st2[i][0]);for(j=0;j<l;j++){if(st2[i][1]==order[j]){for(k=0;k<st3l;k++){for(kk=0;kk<l;kk++){if(st3[k]==order[kk]){sum[kk][j]=3;break;}}}break;}}}else{print(st2[i][1]);for(j=0;j<l;j++){if(st2[i][0]==order[j]){for(k=0;k<st3l;k++){for(kk=0;kk<l;kk++){if(st3[k]==order[kk]){sum[j][kk]=1;break;}}}break;}}}}for(i=0;i<st4l;i++){for(j=0;j<l;j++){if(st4[i][0]==order[j]){for(k=0;k<l;k++){if(st4[i][1]==order[k]){sum[j][k]=2;break;}}break;}}}sum[l-1][l-1]=2;//test9cin>>sta;cout<<" ";for(i=0;i<l;i++)cout<<order[i];cout<<endl;for(i=0;i<l;i++){cout<<order[i];for(j=0;j<l;j++){if(sum[i][j]==1)cout<<"<";else if(sum[i][j]==2)cout<<"=";else if(sum[i][j]==3)cout<<">";else cout<<" ";}cout<<endl;}int flag=0;end1=strlen(sta);sta[end1]='#';end1++;top=number=top1=0;Stack[0]='#';bj0['#']=1;/*for(i=0;i<150;i++)cout<<bj0[i]<<" ";cout<<endl;*/for(i=0;i<end1;i++){if(bj0[sta[i]]==0){flag=1;break;}}while(top>=0){if(flag==1) break;//number++;//cout<<number<<"\t";//print_stack();mm=-1;for(i=top;i>=0;i--){if(Stack[i]<'A'||Stack[i]>'Z'){mm=i;break;}}if(mm==-1) {flag=1;break;}k=kk=-1;for(i=0;i<l;i++){if(order[i]==Stack[mm]){k=i;}if(order[i]==sta[top1]){kk=i;}}if(k==-1||kk==-1){flag=1;break;}//cout<<"\t";if(sum[k][kk]==1){//cout<<"<\t";}else if(sum[k][kk]==2){//cout<<"=\t";}else if(sum[k][kk]==3){//cout<<">\t";}else{flag=1;break;}//if(sta[top1]!='#') cout<<sta[top1]<<"\t";//else cout<<" \t";//print_sta();//cout<<"\t";if(sum[k][kk]==1){//cout<<"移进"<<endl;top1++;Stack[++top]=sta[top1-1];}else if(sum[k][kk]==2){if(sta[top1]!='#'){//cout<<"移进"<<endl;top1++;Stack[++top]=sta[top1-1];}else if(Stack[mm]=='#'){//cout<<"接受"<<endl;break;}}else if(sum[k][kk]==3){//cout<<"归约"<<endl;top-=(bj0[Stack[mm]]-1);Stack[top]='N';}}if(flag==0) cout<<"Success"<<endl;else cout<<"Fail"<<endl;}return 0;
}

http://www.dtcms.com/a/499652.html

相关文章:

  • 深入剖析RocketMQ3-底层原理
  • 网站建设所出现的问题电影网站域名
  • ROS趣味题25-26-1版本
  • 网络编程的基础知识
  • 【GESP】C++三级、四级练习 luogu-P1597 语句解析-系列题目3
  • 广告公司网站源码下载巴西网站域名
  • Java基础入门
  • 网站建设的价code wordpress
  • 自己做的网站项目面试为什么要做营销型的网站建设
  • 网站开发公众号开发网易企业邮箱网页版登录入口
  • 斯坦福大学生物医学数据科学(BMDS)项目概览
  • 手机转SIP-手机做中继网关-落地线路对接软交换呼叫中心
  • Redis 在订单系统中的实战应用:防重、限流与库存扣减
  • flex 做网站去成都旅游攻略怎么做
  • PHP网站开发涉及的工具有哪些秦皇岛市海港区建设局网站
  • 如何定期清理电脑垃圾文件
  • 网站怎么做现场直播视频全国企业信息公示系统查询
  • JAVA村里租房系统小区租售系统源码支持微信小程序 + H5
  • 【图像处理】图像色彩空间 Lab、YCbCr、HSV
  • 怎么自己在电脑上做网站win2008做的网站打不开
  • 嘉兴外贸网站建网站备案号含义
  • 一个虚拟主机可以做几个网站个人网站备案填写要求
  • 通过ssh连接GitHub远程仓库
  • venv - python新手推荐的轻量化环境隔离方式
  • 网站核验单中国外包加工网
  • Ubuntu解决Github无法访问的问题
  • 关于 Qt5.11/12/15的QtCreator中对conncet宏SIGNAL不提示 的解决方法
  • C语言入门(十一)续:函数的深入认识
  • wordpress站点路径网上购物商城官网入口
  • 告别“手绘”图表:Illustrator与XD联动的数据可视化(Data Viz)工作流