#ifndef PARSER_H #define PARSER_H #include "util.h" #include "ParseRule.h" #include "ParseAction.h" #include "Symbol.h" #include "State.h" #include "StringReader.h" #include "Lexer.h" #include "NodeTree.h" #include "Table.h" #include #include #include #include #include #include #include #include class Parser { public: Parser(); ~Parser(); virtual void loadGrammer(std::string grammerInputString); virtual void createStateSet(); virtual std::string stateSetToString(); virtual NodeTree* parseInput(std::string inputString) = 0; virtual std::string grammerToString(); virtual std::string grammerToDOT(); std::string tableToString(); void exportTable(std::ofstream &file); void importTable(char* tableData); protected: std::vector firstSet(Symbol token, std::vector avoidList = std::vector(), bool addNewTokens = true); bool isNullable(Symbol token); bool isNullableHelper(Symbol token, std::set done); std::map> tokenFirstSet; std::map tokenNullable; std::vector incrementiveFollowSet(ParseRule* rule); virtual void closure(State* state); virtual void addStates(std::vector< State* >* stateSets, State* state, std::queue* toDo); int stateNum(State* state); StringReader reader; Lexer lexer; std::map, Symbol> symbols; std::vector loadedGrammer; std::vector< State* > stateSets; Symbol EOFSymbol; Symbol nullSymbol; Symbol invalidSymbol; Table table; std::stack stateStack; std::stack symbolStack; Symbol getOrAddSymbol(std::string symbolString, bool isTerminal); }; #endif