//g.cpp,文件中设计了文法的数据结构
#include<string.h>
#include<iostream.h>
typedef struct Snode{
char* s;
struct Snode *nexts;
}Snode;
typedef struct Cnode{
char c;
struct Cnode *nextc;
struct Snode *define;
}Cnode;
class G{
public:
Cnode *vn,*vt,*s,*p;
G(){
vn=0;
vt=0;
s=0;
p=0;
}
void insert_into_vn(char newc){
Cnode *p;
Cnode *lastvn;
p=new Cnode;
p->c=newc;
p->nextc=0;
p->define=0;
if(!vn){
vn=p;
set_s(vn);
set_p(vn);
}else{
lastvn=vn;
while(lastvn->nextc)
lastvn=lastvn->nextc;
lastvn->nextc=p;
}
}
void insert_into_vt(char newc){
Cnode *p;
Cnode *lastvt;
p=new Cnode;
p->c=newc;
p->nextc=0;
p->define=0;
if(!vt)
vt=p;
else{
lastvt=vt;
while(lastvt->nextc)
lastvt=lastvt->nextc;
lastvt->nextc=p;
}
}
void insert_into_s(char leftvn,char* rights){
Cnode* pc;
Snode *ps,*lasts;
ps=new Snode;
ps->s=rights;
ps->nexts=0;
pc=find_char_inq(vn,leftvn);
if(!pc){
insert_into_vn(leftvn);
pc=find_char_inq(vn,leftvn);
}
lasts=pc->define;
if(!lasts)
pc->define=ps;
else{
while(lasts->nexts) lasts=lasts->nexts;
lasts->nexts=ps;
}
}
void set_s(Cnode* nows){
s=nows;
}
void set_p(Cnode* nowp){
p=nowp;
}
Cnode* find_char_inq(Cnode* q,char c){
Cnode* p=q;
if(!p) return 0;
while(p&&p->c!=c)
p=p->nextc;
if(!p) return 0; else return p;
}
void printG(){
Cnode *pc;
Snode *ps;
pc=vn;
while(pc){
cout<<pc->c<<"->";
ps=pc->define;
while(ps){
cout<<ps->s;
ps=ps->nexts;
if(ps) cout<<"|";
}
cout<<"/n";
pc=pc->nextc;
}
}
};
//试验一测试文件
//test.cpp文件,测试上面定义的数据结构
#include<iostream.h>
#include"g.cpp"
void main(){
G g;
g.insert_into_vn('S');
g.insert_into_vn('Q');
g.insert_into_vn('R');
g.insert_into_vt('a');
g.insert_into_vt('b');
g.insert_into_vt('c');
g.insert_into_s('S',"Qc");
g.insert_into_s('S',"c");
g.insert_into_s('Q',"Rb");
g.insert_into_s('Q',"b");
g.insert_into_s('R',"Sa");
g.insert_into_s('R',"a");
g.printG();
}