aboutsummaryrefslogtreecommitdiffstats
path: root/element.h
diff options
context:
space:
mode:
Diffstat (limited to 'element.h')
-rw-r--r--element.h155
1 files changed, 155 insertions, 0 deletions
diff --git a/element.h b/element.h
new file mode 100644
index 0000000..25d903d
--- /dev/null
+++ b/element.h
@@ -0,0 +1,155 @@
+#ifndef INCLUDE_ELEMENT_H
+#define INCLUDE_ELEMENT_H
+
+// element.h
+// Revision 1-jan-2005
+
+#include "blassic.h"
+
+#include <string>
+
+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
Un proyecto texto-plano.xyz