#ifndef RULE_H #define RULE_H #include #include #include #include #include using namespace std; class Rule { friend class Rule_List; public: virtual Rule* Clone() const = 0; virtual ~Rule(); virtual void Initialize(const unsigned int in_allowed_length, const Rule* in_previous_rule = NULL); virtual const unsigned int Get_Allowed_Length() const; virtual void Reset_String(); virtual void Invalidate(); virtual const bool Is_Valid(); virtual const bool Needs_Reset() const; virtual const bool Check_For_String(); virtual const list Get_String() const = 0; virtual const Rule* Get_Previous_Rule() const; virtual const list Get_Terminals() const = 0; virtual const Rule* operator[](const unsigned int in_index) const = 0; protected: Rule(); Rule(const Rule &in_rule); virtual const Rule& operator= (const Rule &in_rule); protected: const Rule* m_previous_rule; unsigned int m_allowed_length; bool m_is_valid; bool m_needs_reset; }; ostream& operator<< (ostream& in_ostream, const vector& in_rule_list); ostream& operator<< (ostream& in_ostream, const vector& in_rule_list); ostream& operator<< (ostream& in_ostream, const list& in_rule_list); ostream& operator<< (ostream& in_ostream, const list& in_rule_list); #endif // RULE_H