LR(0)文法如下:
G[E]:
E→aA∣bB
A→cA∣d
B→cB∣d
改写为扩展文法后进行分析。
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
//初始化,包括读取文件中的文法及初始化
void init();
//创建文法的有限状态自动机,并以表格形式打印到屏幕
void creatFA();
//创建文法的LR(0)分析表,并以表格形式打印到屏幕
void creatLRTable();
//分析字符串是否为合法字符串,并以表格形式输出分析过程
void analysis();
//打印单步分析过程
void printline(int i, vector
state, vector sign, string s,
string action, int nextstate);
//求出后继状态集
vector
follow(vector s, char
x);
//求出闭包
vector
closure(vector s);
//具体分析过程,根据栈顶符号和余留字符串得出下一状态
string getAction(int &step,
vector &state,
vector &sign,
string &temp, int
&nextstate);
//判断str是否在集合s中
bool isContained(vector s,
string str);
//判断符号c是否为终结符号
bool isVt(char c);
//判断状态s是否已在项目规范族中
int isInstatus(vector
s);
//获取符号id
int getId(char c);
//获取产生式s的id
int getIdinP(string s);
vector itemsets; //项目集
vector p; //产生式集
vector vn, vt;
//终极符号集、非终结符号集
vector>
status; //项目集规范族
vector>
GO; //状态转移表
int** table; //LR(0)分析表
char** secondtable; //LR(0)辅助分析表
示例: