#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]; //这时最终生成的分析表
};