// 语法生成器 #ifndef GRAMMAR_H #define GRAMMAR_H #include #include #include #include #include using namespace std; class Grammar { public: const string grammar_file = "./tests/grammar.txt"; Grammar(); ~Grammar(); void read_grammar(); // 读取语法规则 void print_grammar(); // 打印语法规则 void expand_grammar(); // 拓展语法规则 void init_grammar_set(); // 初始化语法相关集合 void print_grammar_set(); // 打印语法相关集合 void get_token_strings(vector &); // 获取 token_stirngs void print_token_strings(); protected: vector>> grammar_rules; // 产生式规则 string start; // 起始字符 vector symbols; // 符号 vector VTs; // 终结符 vector VNs; // 非终结符 unordered_map> first; // FIRST 集 unordered_map> follow; // FOLLOW 集 unordered_map infer_empty; // 是否可以推导出 $ 空字符 vector token_strings; private: unordered_map> left_appears; // 该符号出现在哪些产生式左侧 unordered_map> right_appears; // 该符号出现在哪些产生式右侧 unordered_map> depend; // FOLLOW 集的依赖关系 void init_appears_depend(); // 获取 appear depend 集合 bool symbol_infer_empty(const string& symbol); // 判断符号是否可以推导出 $ 空字符 vector symbol_infer_first(const string& symbol);// 推导符号的 FIRST 集 vector symbol_infer_follow(const string& symbol);// 推导符号的 FOLLOW 集 }; #endif // !GRAMMAR_H