00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <cassert>
00011 #include <celscript/statement.h>
00012
00013 using namespace celx;
00014 using namespace std;
00015
00016
00017 Statement::Statement()
00018 {
00019 }
00020
00021 Statement::~Statement()
00022 {
00023 }
00024
00025
00026
00027 ExpressionStatement::ExpressionStatement(Expression* _expr) :
00028 expr(_expr)
00029 {
00030 }
00031
00032 ExpressionStatement::~ExpressionStatement()
00033 {
00034 delete expr;
00035 }
00036
00037 Statement::Control ExpressionStatement::execute(ExecutionContext& context)
00038 {
00039 cout << expr->eval(context) << '\n';
00040 return Statement::ControlAdvance;
00041 }
00042
00043
00044
00045 VarStatement::VarStatement(const string& _name, Expression*_initializer) :
00046 name(_name), initializer(_initializer)
00047 {
00048 }
00049
00050 VarStatement::~VarStatement()
00051 {
00052 }
00053
00054 Statement::Control VarStatement::execute(ExecutionContext& context)
00055 {
00056 Environment* env = context.getEnvironment();
00057 assert(env != NULL);
00058
00059 env->bind(name, Value(initializer->eval(context)));
00060
00061 return ControlAdvance;
00062 }
00063
00064
00065
00066 CompoundStatement::CompoundStatement()
00067 {
00068 }
00069
00070 CompoundStatement::~CompoundStatement()
00071 {
00072 for (vector<Statement*>::iterator iter = statements.begin();
00073 iter != statements.end(); iter++)
00074 {
00075 delete *iter;
00076 }
00077 }
00078
00079 Statement::Control CompoundStatement::execute(ExecutionContext& context)
00080 {
00081 for (vector<Statement*>::iterator iter = statements.begin();
00082 iter != statements.end(); iter++)
00083 {
00084 Control control = (*iter)->execute(context);
00085 switch (control)
00086 {
00087 case ControlReturn:
00088 case ControlBreak:
00089 case ControlContinue:
00090 return control;
00091 default:
00092 break;
00093 }
00094 }
00095
00096 return ControlAdvance;
00097 }
00098
00099 void CompoundStatement::addStatement(Statement* st)
00100 {
00101 statements.insert(statements.end(), st);
00102 }
00103
00104
00105
00106 ReturnStatement::ReturnStatement(Expression* _expr) :
00107 expr(_expr)
00108 {
00109 };
00110
00111 ReturnStatement::~ReturnStatement()
00112 {
00113 delete expr;
00114 }
00115
00116 Statement::Control ReturnStatement::execute(ExecutionContext& context)
00117 {
00118 Value val = expr->eval(context);
00119 context.pushReturnValue(val);
00120
00121 return ControlReturn;
00122 }
00123
00124
00125 IfStatement::IfStatement(Expression* _cond, Statement* _ifClause,
00126 Statement* _elseClause) :
00127 condition(_cond), ifClause(_ifClause), elseClause(_elseClause)
00128 {
00129 }
00130
00131 IfStatement::~IfStatement()
00132 {
00133 }
00134
00135
00136 Statement::Control IfStatement::execute(ExecutionContext& context)
00137 {
00138 if (condition->eval(context).toBoolean())
00139 return ifClause->execute(context);
00140 else
00141 return elseClause->execute(context);
00142 }
00143
00144
00145 WhileStatement::WhileStatement(Expression* _cond, Statement* _body) :
00146 condition(_cond), body(_body)
00147 {
00148 }
00149
00150 WhileStatement::~WhileStatement()
00151 {
00152 }
00153
00154 Statement::Control WhileStatement::execute(ExecutionContext& context)
00155 {
00156 Control control = ControlAdvance;
00157 while (condition->eval(context).toBoolean())
00158 {
00159 control = body->execute(context);
00160 if (control == ControlReturn || control == ControlBreak)
00161 break;
00162 }
00163
00164 if (control == ControlReturn)
00165 return ControlReturn;
00166 else
00167 return ControlAdvance;
00168 }
00169
00170