Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

statement.cpp

Go to the documentation of this file.
00001 // statement.cpp
00002 //
00003 // Copyright (C) 2002, Chris Laurel <claurel@shatters.net>
00004 //
00005 // This program is free software; you can redistribute it and/or
00006 // modify it under the terms of the GNU General Public License
00007 // as published by the Free Software Foundation; either version 2
00008 // of the License, or (at your option) any later version.
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 

Generated on Sat Jan 14 22:30:32 2006 for Celestia by  doxygen 1.4.1