⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yacc.h

📁 LL(1)分析 写的语法分析程序
💻 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 + -