📄 yacc.h
字号:
#ifndef PARSETABLE_H
#define PARSETABLE_H
#include<iostream>
#include<map>
#include<vector>
#include<set>
#include<string.h>
#include<stack>
using namespace std;
struct node
{
string s; //这是终极符
int n; //这是第几个表达式
node* next;
};
struct Production //一条产生式的存储结构
{
string LProduction; //非终极符,也就是产生式的左边
vector <string> RProduction; //产生式右边
};
class YACC
{
private:
map<string,set<string > >First; //First集
map<string,set<string> > Follow; //Follow 集
map<string,node* > ParseTable; //分析表
vector <string> NonTerminal; //非终极符
//为了写程序的方便,先初始化一个起点" ",这样好判断有没有重复的元素
set <string> Terminal; //终极符
vector<Production> P; //存全部的产生式
// P[0].LProduction 为整个文法的开始符号
int union_set(set<string>& s1,set<string>& s2,bool & update);
//用来求每一个非终结符出现的位置的。第几行的下标是第几。
int solvePosition(vector< vector<pair<int,int> > > &position );
int displayPosition( vector< vector<pair<int,int> > >& position);
//专门用来为分析表加入一个结点的,i表示第几条产生式,s表示First集
int insert_node(set<string>& s,int i);
//用来查在邻接表中遇到终极符s 是要对应哪条产生式,没找到时返回-1,找到返回 产生式编号
int find(node* start,const string& s);
//为了输出整个分析的过程,写了这个打印的函数
int printf_stack(stack<string>& s,int i,vector<string>& v,FILE* fp);
public:
YACC() ;//默认构造函数
int input(const char* s); //从文件中输入产生式到Production中,同时得到终极符
int solveTerminal();
int displayTerminal();
int displayNonTerminal();
int solveFirst();
int solveFollow();
int run();
int displayFollow();
int displayParseTable();
int displayFirst();
int solveParseTable();
/******预测分析,成功返回0,错误返回-1******/
int match();
~YACC();
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -