语法分析表产生器的代码之二:自定义类的声明文件myclass.h

#include<iostream>
#include<fstream>
#include<string>
using namespace std;

//产生式单元,存放一个产生式
class production{
public:
 production();
 void setRight(int);
 int left;
 int right[100];    //够大了吧,这是产生式右部
 int length;
};
//项目单元,存放一个具体项目
class item{
public: 
 item();
 int productionID;
 int pointPosition;
 bool operator==(const item&);
};
//状态单元,存放一个项目集
class state{
public:
 state();
 void operator=(const state&);
 bool operator==(const state&);
 int itemCount;
 item items[100]; 
};
//分析表单元,组成一个分析表
class tableItem{
public:
 char ch;
 int  number;//e.g."r3","s5"
 tableItem();
};
//这是后加的一个类,代替了原来的char notation[50],以处理多个字符的非终结符
class notationclass{
public:
 notationclass();
 friend ostream& operator<<(ostream&,const notationclass&);
 void operator=(char *);
 char& operator[](int);
 int operator==(char *);
 static int replacecount;
 char charray[50];
 char replaced[50];
};
int static replacecount = 1;
//存放终结符或非终结符的单元
class sign{
public:
 sign();
 void addfirst(int);
 void addfollow(int);
 void operator=(char *);

 int  theEmptyProductionID;
 notationclass notation;
 //char notation[50];
 int first[100];
 int follow[100];
};
//文法类
class syntaxG{
public:
 syntaxG();
 void stateEmerge();       //产生各个状态(项目集)
 void closure(state&);      //求某个已有的状态集的闭包
 state* gotofunc(const state&,int);   //goto(state,X)状态转移函数
 int isThisStateAlreadyGotten(const state&);
 void tableConstruction();     //构造分析表
 void constructFirstfor(sign&,int);   //构造first集
 void constructFollowFor();     //构造follow集(仅非终结符有follow集)
 void printG();        //打印文法G的产生式

 int prodCount;     //产生式个数
 production productions[500]; //这是存产生式的
 
 int stateCount;     //状态(项目集)个数
 state states[100];    //这是存状态(项目集)的

 int termCount;     //终结符个数
 int nontermCount;    //非终结符个数
 sign signs[500];    //这是存终结符与非终结符的(最后一个为'/0')
  
 tableItem table[100][100];  //这时最终生成的分析表
 
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值