#ifndef LR1_H #define LR1_H #include <vector> #include <string> #include <utility> #include <fstream> class LR1Node { private: std::string s; std::vector<LR1Node *> children; public: LR1Node(std::string s); ~LR1Node(); void addchild(LR1Node * child); void addToVector(std::vector<std::string> &v); }; class LR1 { private: std::vector<std::string> symbols; std::vector<std::string> nonTerminals; std::vector<std::string> terminals; std::string start; std::vector<std::string> rules; std::vector<std::vector<std::pair<std::pair<int, std::string>, int>>> reduceRules; std::vector<std::vector<std::pair<std::pair<int, std::string>, int>>> shiftRules; std::vector<int> stateStack; std::vector<std::string> symStack; int states; std::ifstream parseFile; std::vector<LR1Node *> TreeStack; bool parseUtil(std::string in); public: LR1(); ~LR1(); void term(int in); void nonTerm(int in); void startSym(); void addRules(int in); void statesNum(); void shiftReduceRules(int in); void initialize(); void parse(std::vector<std::string> &tokens); int shift(std::string in); std::vector<std::string> generate(); }; class ParsingFailure { int prefix; public: ParsingFailure(int prefix); // Returns the message associated with the exception. const std::string what() const; }; #endif