实验3-源文件(g.cpp+subg.h+subg.cpp+test.cpp)

//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;
   }

  }
};

//subg.h

#include<fstream.h>
#include "g.cpp"

class sub_G:public G{//此类的实现在文件subg.cpp中
public:
 void read_G_from(ifstream &infile);
 //此函数用于将文法从文件输入流infile读入到本类对象中
 
 void write_G_to(ofstream &outfile);
 //此函数用于将本对象表示的文法写入到文本文件的输出流outfile中

 int remove_leftDG();
 /*本对象文法左递归消除函数
   实现方法参考书中70页算法,
   在此处用C++实现书中算法即可*/


};

//subg.cpp

#include"subg.h"

void sub_G::read_G_from(ifstream &infile){
 
}

void sub_G::write_G_to(ofstream &outfile){
 
}

int sub_G::remove_leftDG(){
 //
 return 0;
}

//test.cpp

#include<iostream.h>
#include"subg.h"

void main(){
 //利用此处main函数实现实验3测试。
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验2 文法读入、判定和处理 一、实验目的 熟悉文法构,了解文法在计算机内的表示方法。 二、实验内容 1、 设计一个表示文法数据结构; 2、 从文本文件读入文法利用定义数据结构存放文法,并输出; 3、 本实验果将来还有用。 三、实验要求 1、 了解文法定义的4个部分: G(Vn, Vt, S, P) Vn 文法的非终符号集合,在实验用大写的英文字母表示; Vt 文法的终符号集合,在实验用小写的英文字母表示; S 开始符号,在实验是Vn集合一个元素; P 产生式,分左部和右部,左部为非终符号一个,右部为终符号或非终符号组成的字符串,如S->ab|c 2、 根据文法各个部分的性质,设计一个合理的数据结构用来表示文法, 1) 若使用C语言编写,则文法可以设计构体形式,构体应包含上述的4部分, 2) 若使用C++语言或java语言编写,则文法可以设计文法类形式,类至少含有4个数据成员,分别表示上述4个部分 文法数据结构的具体设计由学生根据自己想法完成,并使用C或C++语言或Java实现设计数据结构。 3、 利用完成的数据结构完成以下功能: 1) 从文本文件读入文法文法事先应写入文本文件); 2) 根据文法产生式的构,分析出文法的4个部分,分别写入定义好的文法数据结构的相应部分; 3) 整理文法构,判断该文法文法类型,是否为0型,1型,2型或3型文法,并输出判断果; 4) 在计算机屏幕或者文本框输出文法文法输出按照一个非终符号一行,开始符号引出的产生式写在第一行,同一个非终符号的候选式用“|”分隔的方式输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值