00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef CELSCRIPT_EXPRESSION_H_
00011 #define CELSCRIPT_EXPRESSION_H_
00012
00013 #include <celscript/celx.h>
00014 #include <vector>
00015 #include <celscript/value.h>
00016 #include <celscript/execution.h>
00017
00018
00019 namespace celx
00020 {
00021
00022 class Expression
00023 {
00024 public:
00025 Expression();
00026 virtual ~Expression();
00027 virtual bool isLValue() const;
00028
00029 virtual Value eval(ExecutionContext&) = 0;
00030 virtual Value* leval(ExecutionContext&);
00031 };
00032
00033
00034 class BinaryExpression : public Expression
00035 {
00036 public:
00037 enum Operator
00038 {
00039 Add = 0,
00040 Subtract = 1,
00041 Multiply = 2,
00042 Divide = 3,
00043 Equal = 4,
00044 NotEqual = 5,
00045 Lesser = 6,
00046 Greater = 7,
00047 LesserEqual = 8,
00048 GreaterEqual = 9,
00049 InvalidOp = 10,
00050 OperatorCount = 11,
00051 };
00052
00053 BinaryExpression(Operator, Expression*, Expression*);
00054 virtual ~BinaryExpression();
00055 virtual Value eval(ExecutionContext&);
00056
00057 private:
00058 const Operator op;
00059 Expression* left;
00060 Expression* right;
00061 };
00062
00063
00064 class UnaryExpression : public Expression
00065 {
00066 public:
00067 enum Operator {
00068 Negate = 0,
00069 LogicalNot = 1,
00070 InvalidOp = 2,
00071 OperatorCount = 3,
00072 };
00073
00074 UnaryExpression(Operator, Expression*);
00075 virtual ~UnaryExpression();
00076 virtual Value eval(ExecutionContext&);
00077
00078 private:
00079 const Operator op;
00080 Expression* expr;
00081 };
00082
00083
00084 class ConstantExpression : public Expression
00085 {
00086 public:
00087 ConstantExpression(const Value&);
00088 virtual ~ConstantExpression();
00089 virtual Value eval(ExecutionContext&);
00090
00091 private:
00092 Value value;
00093 };
00094
00095
00096 class IdentifierExpression : public Expression
00097 {
00098 public:
00099 IdentifierExpression(const std::string&);
00100 virtual ~IdentifierExpression();
00101 virtual bool isLValue() const;
00102 virtual Value eval(ExecutionContext&);
00103 virtual Value* leval(ExecutionContext&);
00104
00105 private:
00106 const std::string name;
00107 int stackDepth;
00108 };
00109
00110
00111 class AssignmentExpression : public Expression
00112 {
00113 public:
00114 AssignmentExpression(Expression*, Expression*);
00115 virtual ~AssignmentExpression();
00116 virtual bool isLValue() const;
00117 virtual Value eval(ExecutionContext&);
00118 virtual Value* leval(ExecutionContext&);
00119
00120 private:
00121 Expression* left;
00122 Expression* right;
00123 };
00124
00125
00126 class FunctionCallExpression : public Expression
00127 {
00128 public:
00129 FunctionCallExpression(Expression*);
00130 ~FunctionCallExpression();
00131 virtual Value eval(ExecutionContext&);
00132
00133 void addArgument(Expression*);
00134
00135 private:
00136 Expression* func;
00137 std::vector<Expression*> arguments;
00138 };
00139
00140 }
00141
00142 #endif // CELSCRIPT_EXPRESSION_H_