init 方法用于输入文法产生式文件,初始化语法分析器的文法、项目集规范
族,并初始化 ACTION 表和 GOTO 表。该方法的内部实现主要调用 initFirstList
和 initActionGotoMap 两个私有方法。
parser 方法用于解析源程序。输入源程序文件,parser 对源程序进行 LR1 分
析,并建立一棵语法树。若源程序存在语法错误,则 parser 方法的第二个参数返
回一个 Token,提供出错信息。
语法分析器类型定义如下:
class LR1_Parser
{
private:
Lexer lexer; //词法分析器
vector<Grammar> grammar_list; //文法集合
map<Tag, set<Tag>> first_list; //非终结符first集
//map<Tag, set<Tag>> follow_list; //非终结符follow集
vector<set<GrammarProject>> project_set_list; //项目集
//map<int, map<Tag, int>> state_trans_map; //项目之间的转移关系(int存储
项目集的下标)
map<int, map<Tag, Movement>> action_go_map; //action表和goto表,存储在一起
PTree pTree; //语法树
private:
State openGrammarFile(const char*); //读入文法产生式
set<GrammarProject> getClosure(const set<GrammarProject>&); //求CLOSURE集
int findSameProjectSet(const set<GrammarProject>&); //查找相同的
CLOSURE集,失败返回-1
void initFirstList(); //初始化First集
State initActionGotoMap(); //求识别活前缀的DFA
public: //记得改为private
LR1_Parser();
~LR1_Parser();
State init(const char*); //语法分析器初始化
State parser(const char*, Token&); //语法分析
void printTree(ostream& out); //打印树
void printVP_DFA(ostream& out); //打印DFA
};