#ifndef LR1_H #define LR1_H #include #include #include #include class LR1Node { private: std::string s; std::vector children; public: LR1Node(std::string s); ~LR1Node(); void addchild(LR1Node * child); void addToVector(std::vector &v); }; class LR1 { private: std::vector symbols; std::vector nonTerminals; std::vector terminals; std::string start; std::vector rules; std::vector, int>>> reduceRules; std::vector, int>>> shiftRules; std::vector stateStack; std::vector symStack; int states; std::ifstream parseFile; std::vector 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 &tokens); int shift(std::string in); std::vector generate(); }; class ParsingFailure { int prefix; public: ParsingFailure(int prefix); // Returns the message associated with the exception. const std::string what() const; }; #endif