expr.h00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _GEL_INTERPRETOR_EXPR_H
00023 #define _GEL_INTERPRETOR_EXPR_H
00024
00025 #include "config.h"
00026
00027 #undef far
00028 #undef bank
00029
00030
00031
00032
00033 #define bank SECT_ATTR(".text.bank1")
00034 #define far FAR_ATTR(".text.bank1")
00035
00036 class Variable;
00037 typedef long Value;
00038
00042 class Expression {
00043 protected:
00044 enum token
00045 {
00046 T_NAME,
00047 T_DIGIT,
00048 T_MINUS,
00049 T_PLUS,
00050 T_AND,
00051 T_OR,
00052 T_XOR,
00053 T_MUL,
00054 T_DIV,
00055 T_NOT,
00056 T_PARENT_OPEN,
00057 T_PARENT_CLOSE,
00058 T_UNKNOWN,
00059 T_EOF
00060 };
00061 enum token type_;
00062
00063 static bank enum token get_token (const char*& line);
00064 static bank void rewind (enum token t, const char*& line);
00065
00066 static bank Expression* parse_unary (const char*& line);
00067 static bank Expression* parse_binary (const char*& line, unsigned char prio);
00068 static bank Expression* parse_term (const char*& line);
00069 static bank int get_value(const char*& line, Value& value);
00070 static bank unsigned char get_priority(enum token t);
00071
00072 virtual far Value eval();
00073
00074 public:
00075 Expression(enum token t) {
00076 type_ = t;
00077 }
00078 virtual ~Expression();
00079
00080 far Value evaluate();
00081
00082 static far Expression* parse(const char*& line);
00083 };
00084
00086 class BinaryExpression : public Expression {
00087 protected:
00088 Expression* left_;
00089 Expression* right_;
00090
00091 virtual far Value eval();
00092
00093 virtual ~BinaryExpression()
00094 {
00095 delete left_;
00096 delete right_;
00097 }
00098
00099 public:
00100 BinaryExpression(enum token t, Expression* l, Expression* r)
00101 : Expression(t), left_(l), right_(r)
00102 {
00103 }
00104 };
00105
00107 class UnaryExpression : public Expression {
00108 protected:
00109 Expression* expr_;
00110
00111 virtual far Value eval();
00112
00113 virtual ~UnaryExpression()
00114 {
00115 delete expr_;
00116 }
00117
00118 public:
00119 UnaryExpression(enum token t, Expression* l)
00120 : Expression(t), expr_(l)
00121 {
00122 }
00123 };
00124
00126 class ValueExpression : public Expression {
00127 long value_;
00128
00129 virtual far Value eval();
00130 public:
00131 ValueExpression(long value) : Expression(T_DIGIT)
00132 {
00133 value_ = value;
00134 }
00135 };
00136
00137 #endif
|