#include<iostream>
using namespace std;
struct node{
char name;
node * next;
int num;
};
node VN[26];
node VT[100];
class Stack
{
public:
Stack()
{count=0;top=NULL;}
int empty()const;
void push(const node x);
void pop();
node * topelement();
private:
node * top;
int count;
};
int Stack::empty()const
{if(count==0&&top==NULL) return 1;
else return 0;
}
void Stack::push(const node x)
{node * s;s=new node;*s=x;s->next=top;top=s;count++;}
void Stack::pop()
{if(!empty()) {node * u=top;top=top->next;delete u;count--;}}
node * Stack::topelement()
{if(!empty()) return top;}
Stack sf;
Stack sl;
int F[26][100];
int L[26][100];
void insert1(node x,node y)
{
if(F[x.num][y.num]==0) {F[x.num][y.num]=1;sf.push(x);sf.push(y);}
}
void insert2(node x,node y)
{
if(L[x.num][y.num]==0) {L[x.num][y.num]=1;sl.push(x);sl.push(y);}
}
int Is_VT(node x)
{if(x.name<=90&&x.name>=65) return 0;
else return 1;
}
int main()
{
int n,i,j;
node *head[n];
cout<<"输入文法表达式的个数n及文法的表达式:"<<endl;
cin>>n;
for(i=0;i<n;i++)
{node *p;
p=new node;
cin>>p->name;
head[i]=p;
char a=p->name;
while(a!=59)
{ node *t;
t=new node;
p->next=t;
p=t;
cin>>t->name;
a=t->name;
}
if(a==59) {p->next=NULL;}
}//将文法转换成链表形式 ,并且将表头保存
int num1(0),num2(0);
for(i=0;i<n;i++)
{
node * s=head[i];
while(s->name!=';')
{
char a=s->name;
if(a!='#')
{
if(a<=90&&a>=65)
{for(j=0;j<num1;j++)
if(VN[j].name==s->name) {s->num=VN[j].num;break;}
if(j==num1){s->num=num1;VN[j]=*s;num1++;}
}
else{
for(j=0;j<num2;j++)
if(VT[j].name==s->name) {s->num=VT[j].num;break;}
if(j==num2){s->num=num2;VT[num2]=*s;num2++;}
}
}
s=s->next;
}
}//分开终结符和非终结符,分别用VT,VN存储
//cout<<num1<<" "<<num2<<endl;
for(i=0;i<num1;i++)
for(j=0;j<num2;j++)
{
F[i][j]=0;
L[i][j]=0;
}
for(i=0;i<n;i++)
{
node * P=head[i];
node s;
node * s1=(P->next->next);
node * s2=(s1->next);
if(s2->name!=';')
{
if(Is_VT(*s1)||(!Is_VT(*s1)&&Is_VT(*s2)))
{if(Is_VT(*s1)) s=*s1;
else s=*s2;
insert1(*P,s);
}
}
else {if(Is_VT(*s1)) {s=*s1;insert1(*P,s);}}
}//先初始化F[i][j],将形如:P->a...;或P->Qa....DO insert1(P,a);
for(i=0;i<n;i++)
{
node * P=head[i];
while(P->next->next->name!=';'){P=P->next;}
node s;
node *s1=P->next;
if(P->name!='#')
{//考虑P#a;的情况
if(Is_VT(*s1)||(!Is_VT(*s1)&&Is_VT(*P)))
{if(Is_VT(*s1)) s=*s1;
else s=*P;
insert2(*head[i],s);
}
}
else{if(Is_VT(*s1)) {s=*s1;insert2(*head[i],s);}}
}//先初始化L[i][j],将形如:P->...a;或P->....aQ;DO insert2(P,a);
//while(st.top!=NULL) {cout<<st.top->name;st.top=st.top->next;}
while(sf.empty()==0)
{
node a=*(sf.topelement());
sf.pop();
node Q=*(sf.topelement());
sf.pop();
for(i=0;i<n;i++)
{
node *P=head[i];
node s1=*(P->next->next);
if(Q.name==s1.name) insert1(*P,a);
}//对形如P->Q...的产生式,做 insert(P,a);
}
while(sl.empty()==0)
{
node a=*(sl.topelement());
sl.pop();
node Q=*(sl.topelement());
sl.pop();
for(i=0;i<n;i++)
{
node *P=head[i];
while(P->next->name!=';'){P=P->next;}
if(Q.name==P->name) insert2(*head[i],a);
}//对形如P->...Q;的产生式,做 insert(P,a);
}
cout<<endl;
for(i=0;i<num1;i++)
{ cout<<"FIRSTVT("<<VN[i].name<<")"<<"="<<"{";
for(j=0;j<num2;j++)
{if(F[VN[i].num][VT[j].num]==1) {cout<<VT[j].name;if(j!=num2-1) cout<<" ";}}
cout<<"}"<<endl;
}
for(i=0;i<num1;i++)
{ cout<<"LASTVT("<<VN[i].name<<")"<<"="<<"{";
for(j=0;j<num2;j++)
{if(L[VN[i].num][VT[j].num]==1) {cout<<VT[j].name;if(j!=num2-1) cout<<" ";}}
cout<<"}"<<endl;
}
//构造算符优先表
char A[num2][num2];
for(i=0;i<num2;i++)
for(j=0;j<num2;j++)
A[i][j]=' ';
node Firstvt[num1][num2+1];
node Lastvt[num1][num2+1];
for(i=0;i<num1;i++)
{int k1(0),k2(0);
for(j=0;j<num2;j++)
{
if(F[VN[i].num][VT[j].num]==1){Firstvt[i][k1]=VT[j];k1++;}
if(L[VN[i].num][VT[j].num]==1){Lastvt[i][k2]=VT[j];k2++;}
}
Firstvt[i][num2].num=k1;
Lastvt[i][num2].num=k2;
}
//system("pause");
for(i=0;i<n;i++)
{
node * p=head[i]->next->next;
if(p->next->name==';') continue;
else
{ while(p->next->next->name!=';')
{
node x1=*p;
node x2=*(p->next);
node x3=*(p->next->next);
if(Is_VT(x1)&&Is_VT(x2)) A[x1.num][x2.num]='=';
if(Is_VT(x1)&&Is_VT(x3)&&!Is_VT(x2)) A[x1.num][x3.num]='=';
//cout<<Firstvt[x2.num][num2].num;
if(Is_VT(x1)&&!Is_VT(x2))
for(j=0;j<Firstvt[x2.num][num2].num;j++)
{node temp=Firstvt[x2.num][j];
A[x1.num][temp.num]='<';
}
if(!Is_VT(x1)&&Is_VT(x2))
for(j=0;j<Lastvt[x1.num][num2].num;j++)
{ node temp=Lastvt[x1.num][j];
A[temp.num][x2.num]='>';
}
p=p->next;
}
if(p->next->next->name==';')
{node x1=*p;node x2=*(p->next);if(Is_VT(x1)&&Is_VT(x2)) A[x1.num][x2.num]='=';
if(Is_VT(x1)&&!Is_VT(x2))
for(j=0;j<Firstvt[x2.num][num2].num;j++)
{node temp=Firstvt[x2.num][j];
A[x1.num][temp.num]='<';
}
if(!Is_VT(x1)&&Is_VT(x2))
for(j=0;j<Lastvt[x1.num][num2].num;j++)
{ node temp=Lastvt[x1.num][j];
A[temp.num][x2.num]='>';
}
}
}
}
cout<<endl;
cout<<"该文法的算符优先表是:"<<endl;
cout<<" ";
for(i=0;i<num2;i++){cout<<VT[i].name<<" ";}
cout<<endl;
for(i=0;i<num2;i++)
{
cout<<VT[i].name<<" ";
for(j=0;j<num2;j++) cout<<A[i][j]<<" ";
cout<<endl;
}
system("pause");
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
酒店管理系统课程设计
共145个文件
dfm:20个
dcu:20个
pas:20个
需积分: 10 28 下载量 149 浏览量
2008-09-14
10:46:21
上传
评论
收藏 1.49MB RAR 举报
温馨提示
本程序是我数据库的课程设计,程序用的是Delphi+Access。
资源推荐
资源详情
资源评论
收起资源包目录
酒店管理系统课程设计 (145个子文件)
Hotel.cfg 434B
First&Lastvt1.cpp 7KB
First&Lastvt.cpp 3KB
MaxNum.cpp 546B
Roominfor_Refer.dcu 10KB
Customerinfor_Refer.dcu 9KB
Set_RoomInfo.dcu 7KB
Set_CustomerInfo.dcu 7KB
Add_NewCustomer.dcu 7KB
CustomerInformation.dcu 6KB
login.dcu 6KB
Add_NewRoom.dcu 6KB
Create_NewUser.dcu 6KB
Adm_Form.dcu 6KB
User_Modify.dcu 6KB
Main.dcu 5KB
Confirm_Password.dcu 5KB
User_Authority.dcu 5KB
User_oldpassword.dcu 5KB
RoomInformation.dcu 5KB
Modify_Password.dcu 4KB
About.dcu 4KB
Unit1.dcu 4KB
Unit2.dcu 3KB
RoomInformation.ddp 51B
About.ddp 51B
dataadd.ddp 51B
Confirm_Password.ddp 51B
Adm_Form.ddp 51B
Add_NewRoom.ddp 51B
Set_CustomerInfo.ddp 51B
Add_NewCustomer.ddp 51B
Main.ddp 51B
Create_NewUser.ddp 51B
login.ddp 51B
Modify_Password.ddp 51B
Roominfor_Refer.ddp 51B
User_Authority.ddp 51B
CustomerInformation.ddp 51B
User_Modify.ddp 51B
Set_RoomInfo.ddp 51B
Reside.ddp 51B
Customerinfor_Refer.ddp 51B
Main.dfm 230KB
CustomerInformation.dfm 64KB
User_Modify.dfm 62KB
Adm_Form.dfm 16KB
Set_RoomInfo.dfm 11KB
Set_CustomerInfo.dfm 10KB
Reside.dfm 9KB
Roominfor_Refer.dfm 8KB
Customerinfor_Refer.dfm 5KB
Add_NewRoom.dfm 5KB
Add_NewCustomer.dfm 5KB
About.dfm 4KB
Create_NewUser.dfm 4KB
dataadd.dfm 4KB
User_Authority.dfm 4KB
login.dfm 3KB
RoomInformation.dfm 2KB
Confirm_Password.dfm 1KB
User_oldpassword.dfm 1KB
Modify_Password.dfm 918B
Hotel.dof 2KB
Hotel.dpr 2KB
Hotel.exe 1.18MB
First&Lastvt1.exe 421KB
firstvtandlastvt.exe 417KB
First&Lastvt.exe 417KB
MaxNum.exe 415KB
Project1.exe 365KB
Roominfor_Refer.pas 5KB
Customerinfor_Refer.pas 4KB
dataadd.pas 4KB
Set_RoomInfo.pas 4KB
login.pas 3KB
Set_CustomerInfo.pas 3KB
Add_NewCustomer.pas 3KB
Add_NewRoom.pas 3KB
Create_NewUser.pas 2KB
CustomerInformation.pas 2KB
Adm_Form.pas 2KB
Main.pas 2KB
Confirm_Password.pas 2KB
User_Modify.pas 2KB
User_oldpassword.pas 1KB
User_Authority.pas 1KB
RoomInformation.pas 1KB
Reside.pas 1KB
Modify_Password.pas 900B
About.pas 578B
Hotel.res 62KB
Set_RoomInfo.~ddp 51B
Modify_Password.~ddp 51B
Customerinfor_Refer.~ddp 51B
Adm_Form.~ddp 51B
User_Authority.~ddp 51B
Add_NewRoom.~ddp 51B
Set_CustomerInfo.~ddp 51B
Add_NewCustomer.~ddp 51B
共 145 条
- 1
- 2
资源评论
de_l_phi
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 设计1.ms14
- vscode-1.64.1.tar源码文件
- vscode-1.64.0.tar源码文件
- vscode-1.52.0.tar源码文件
- Music-Player +PlayerActivity+ rockplayer+ SeeJoPlayer 播放器JAVA源码
- vscode-1.46.0.tar源码文件
- 最近很火植物大战僵尸杂交版2.08苹果+安卓+PC+防闪退工具V2+修改工具+高清工具+通关存档整合包更新
- 超级好用的截图工具PixPin,可录制Gif图
- Screenshot_2024-05-21-17-06-42-64_2332cb9b27b851b548ba47a91682926c.jpg
- 毕业设计参考 - 基于树莓派、OpenCV及Python的人脸识别
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功