/*本实验参照学校实验报告册的算法所作,行事仓促,有很多不足,望加指正*/
/*验证文法1:
E->E+T|T
T->T*F|F
F->(E)|a
语句示例:a+a$
验证文法2:
S->a|b|(T)
T->T,S|S
语句示例:(a,(a,a))$
因未加入对'|'的拆分,所以输入文法是需手动拆分产生式.
本程序所输文法,必须为算符优先文法
*/
/*结束符号是$;
vn[]中第一个字符是开始符号;
FIRST集、FOLLOW集和优先分析表T的字符顺序和vt[]及vn[]一致
*/
#include<iostream>
#include<stdio.h>
#include<fstream>
#include<malloc.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define N 200
#define Y 10
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
int vtnum,vnnum,pronum;//依次是终结符、非终结符、产生式个数
int FIRST[N][N];//FIRSTVT集
int LAST[N][N];//LASTVT集
int T[N][N];//优先关系表
char vt[N];
char vn[N]; //终结符和非终结符集
char old[N][N];//用于存储产生式
typedef struct{
char VN;
char VT;
}SqE;
typedef struct{
SqE *base;
SqE *top;
int stacksize;
}SqStack;//定义堆栈用于求FIRSTVT和LASTVT
void InitStack(SqStack &);
void Push(SqStack &,char,char);
int Pop(SqStack &,char &,char &);
bool Empty(SqStack &);
void first();
int test(char);
void insertf(char,char,SqStack &);
void last();
int tail(int);
void insertl(char,char,SqStack &);
void printf_ff();
void table();
void printf_t();
int control();
void main()
{
int i,j;
ifstream in("input1.txt",ios_base::in);
for(i=0;i<N;i++)
for(j=0;j<N;j++)
old[i][j]='/0';
in>>pronum>>vnnum>>vtnum;
in>>vn;
in>>vt;
for(i=0;i<pronum;i++)
in>>old[i];//从文件中读入pronum,vtnum,vnnum以及产生式
for(i=0;i<vnnum;i++)
for(j=0;j<vtnum;j++)
FIRST[i][j]=0;
for(i=0;i<vnnum;i++)
for(j=0;j<vtnum;j++)
LAST[i][j]=0;//初始化FIRSTVT和LASTVT,0意味着不存在
for(i=0;i<N;i++)
for(j=0;j<N;j++)
T[i][j]=3;//初始化T[][],3意味着不存在
first();
last();
printf_ff();
table();
printf_t();
control();
}
void InitStack(SqStack &S1)//堆栈操作,分别是初始化堆栈,压栈,弹出栈顶元素和判断是否为空
{
<