#ifndef PARSERULE_H #define PARSERULE_H #ifndef NULL #define NULL ((void*)0) #endif #include "Symbol.h" #include #include #include class ParseRule { public: ParseRule(); ParseRule(Symbol leftHandle, int pointerIndex, std::vector &rightSide, std::vector* lookahead); ~ParseRule(); const bool equalsExceptLookahead(const ParseRule &other) const; bool const operator==(const ParseRule &other) const; bool const operator!=(const ParseRule &other) const; bool const operator<(const ParseRule &other) const; //Used for ordering so we can put ParseRule's in sets, and also so that ParseActions will have an ordering ParseRule* clone(); void setLeftHandle(Symbol leftHandle); void appendToRight(Symbol appendee); Symbol getLeftSide(); void setRightSide(std::vector rightSide); std::vector getRightSide(); Symbol getAtNextIndex(); Symbol getAtIndex(); int getRightSize(); int getIndex(); bool advancePointer(); bool isAtEnd(); void setLookahead(std::vector* lookahead); void addLookahead(std::vector* lookahead); std::vector* getLookahead(); std::string toString(bool printLookahead = true); std::string toDOT(); private: int pointerIndex; Symbol leftHandle; std::vector* lookahead; std::vector rightSide; }; #endif