#ifndef INCLUDE_ELEMENT_H #define INCLUDE_ELEMENT_H // element.h // Revision 1-jan-2005 #include "blassic.h" #include class Element { public: Element (ProgramPos ppos) : ppos (ppos) { } void nextchunk () { ppos.nextchunk (); } void nextline () { ppos.nextline (); } ProgramPos getpos () const { return ppos; } private: ProgramPos ppos; }; class ForElement : public Element { public: ForElement (const std::string & nvar, ProgramPos pos) : Element (pos), varname (nvar) { } virtual ~ForElement () { } virtual bool next ()= 0; const std::string var () const { return varname; } bool isvar (const std::string & nvar) const { return varname == nvar; } private: ForElement (const ForElement &); // Forbidden ForElement & operator = (const ForElement &); // Forbidden const std::string varname; }; class ForElementNumber : public ForElement { public: ForElementNumber (const std::string & nvar, ProgramPos pos, BlNumber initial, BlNumber nmax, BlNumber nstep); protected: BlNumber * varaddr, max, step; }; class ForElementNumberInc : public ForElementNumber { public: ForElementNumberInc (const std::string & var, ProgramPos pos, BlNumber initial, BlNumber max, BlNumber step); bool next (); }; class ForElementNumberDec : public ForElementNumber { public: ForElementNumberDec (const std::string & var, ProgramPos pos, BlNumber initial, BlNumber max, BlNumber step); bool next (); }; class ForElementInteger : public ForElement { public: ForElementInteger (const std::string & nvar, ProgramPos pos, BlInteger initial, BlInteger nmax, BlInteger nstep); protected: BlInteger * varaddr, max, step; }; class ForElementIntegerInc : public ForElementInteger { public: ForElementIntegerInc (const std::string & var, ProgramPos pos, BlInteger initial, BlInteger max, BlInteger step); bool next (); }; class ForElementIntegerDec : public ForElementInteger { public: ForElementIntegerDec (const std::string & var, ProgramPos pos, BlInteger initial, BlInteger max, BlInteger step); bool next (); }; inline ForElementNumber * newForElementNumber (const std::string & var, ProgramPos pos, BlNumber initial, BlNumber max, BlNumber step) { if (step >= 0.0) return new ForElementNumberInc (var, pos, initial, max, step); else return new ForElementNumberDec (var, pos, initial, max, step); } inline ForElementInteger * newForElementInteger (const std::string & var, ProgramPos pos, BlInteger initial, BlInteger max, BlInteger step) { if (step >= 0) return new ForElementIntegerInc (var, pos, initial, max, step); else return new ForElementIntegerDec (var, pos, initial, max, step); } class RepeatElement : public Element { public: RepeatElement (ProgramPos pos) : Element (pos) { } }; class WhileElement : public Element { public: WhileElement (ProgramPos pos) : Element (pos) { } }; class LocalLevel { public: LocalLevel (); LocalLevel (const LocalLevel & ll); ~LocalLevel (); LocalLevel & operator= (const LocalLevel & ll); void addlocalvar (const std::string & name); void freelocalvars (); private: class Internal; Internal * pi; }; class GosubElement : public Element, public LocalLevel { public: GosubElement (ProgramPos pos, bool is_polled) : Element (pos), is_gosub (true), is_polled (is_polled) { } GosubElement (LocalLevel & ll) : Element (0), LocalLevel (ll), is_gosub (false), is_polled (false) { } bool isgosub () const { return is_gosub; } bool ispolled () const { return is_polled; } private: bool is_gosub; bool is_polled; }; #endif // End of element.h