主题:[原创]LR(0)自底向上语法分析程序
/*-------------------main.cpp-----------------------*/
///////////////////////////////////////////////////////
// 文法G[S']: S'->A A->aA A->b //
// 题目:LR(0)自底向上分析文法 G[S'] //
// 作者:liuanggh //
// 邮箱:liangnews@163.com //
// 时间:2005.11.22 //
//////////////////////////////////////////////////////
#include"node.h"
#include"node1.h"
#include <iostream>
#include<string>
#include <fstream>
#include <iomanip>
using namespace std;
#define n1 3 //规则的条数
#define n2 1 //非终极符的个数
#define n3 2 //终极符的个数
#define n4 10 //项目族集个数
#define left 1 //点在左边
#define middle 2 //点在中间
#define right 3 //点在右边
FILE *f; //定义一个文件变量
linklist G[n1]; //文法的规则
linklist G_temp[n1]; //文法的规则副本
string N[n2]; //非终结符
string T[n3]; //终结符
linklist I[n4]; //项目集
linklist i_temp[n4]; //项目集副本
stack S; //分析栈
string line;
enum VT{a,b,O};
enum VN{A};
node item[n4]; //项目
int number = 1; //计数器
struct Form
{
string first;
int second;
};
struct Form ACTION[5][3]; //action表
int GOTO[5] = {0}; //goto表
struct Form_dfa
{
string first; //字母
int second; //ID号
int flags; //有效标志位
};
struct Form_dfa DFA[5][5]; //G[S']活前缀的DFA
void closure(node*); //生成新的项目集
void GO(linklist&, string); //生成新的项目集族
node *check(linklist &l, string s); //生成新的项目
node *DFA_check(linklist &l, string s);//生成新的项目
void Init(); //数据初始化部分
bool Same_check(node&, node*); //查找是否有相同的项目
void new_item(int j,node *pp); //生成I0后面的项目集
void make_DFA(); //构造 G[S']活前缀的DFA
void make_ActionForm(); //填写action表
void make_GotoForm(linklist &l); //填写goto表
bool control(); //语法分析主控程序
void copy_item(linklist&,linklist&); //复制
///////////////////////////////////////////////////////
// 文法G[S']: S'->A A->aA A->b //
// 题目:LR(0)自底向上分析文法 G[S'] //
// 作者:liuanggh //
// 邮箱:liangnews@163.com //
// 时间:2005.11.22 //
//////////////////////////////////////////////////////
#include"node.h"
#include"node1.h"
#include <iostream>
#include<string>
#include <fstream>
#include <iomanip>
using namespace std;
#define n1 3 //规则的条数
#define n2 1 //非终极符的个数
#define n3 2 //终极符的个数
#define n4 10 //项目族集个数
#define left 1 //点在左边
#define middle 2 //点在中间
#define right 3 //点在右边
FILE *f; //定义一个文件变量
linklist G[n1]; //文法的规则
linklist G_temp[n1]; //文法的规则副本
string N[n2]; //非终结符
string T[n3]; //终结符
linklist I[n4]; //项目集
linklist i_temp[n4]; //项目集副本
stack S; //分析栈
string line;
enum VT{a,b,O};
enum VN{A};
node item[n4]; //项目
int number = 1; //计数器
struct Form
{
string first;
int second;
};
struct Form ACTION[5][3]; //action表
int GOTO[5] = {0}; //goto表
struct Form_dfa
{
string first; //字母
int second; //ID号
int flags; //有效标志位
};
struct Form_dfa DFA[5][5]; //G[S']活前缀的DFA
void closure(node*); //生成新的项目集
void GO(linklist&, string); //生成新的项目集族
node *check(linklist &l, string s); //生成新的项目
node *DFA_check(linklist &l, string s);//生成新的项目
void Init(); //数据初始化部分
bool Same_check(node&, node*); //查找是否有相同的项目
void new_item(int j,node *pp); //生成I0后面的项目集
void make_DFA(); //构造 G[S']活前缀的DFA
void make_ActionForm(); //填写action表
void make_GotoForm(linklist &l); //填写goto表
bool control(); //语法分析主控程序
void copy_item(linklist&,linklist&); //复制