00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "Expr.h"
00019 #include "ExParser.h"
00020 #include "ExScanner.h"
00021 #include "ExSymTbl.h"
00022 #include "ExNode.h"
00023 #include "MarSystem.h"
00024 #include "Scheduler.h"
00025 #include "TmTimer.h"
00026
00027 #include <fstream>
00028
00029 using std::ostringstream;
00030 using namespace Marsyas;
00031
00032 void
00033 Ex::parse(Expr* e, ExNode*& init, ExNode*& expr)
00034 {
00035 ExScanner s;
00036 ExParser p(&(e->timer_),&s);
00037
00038
00039 if (init_!="") {
00040 s.setString(init_.c_str());
00041 p.Parse(e->sched_,e->marsym_,e->symbol_table_);
00042 init=p.getTree();
00043 }
00044 else init=NULL;
00045
00046 if (expr_!="") {
00047 s.setString(expr_.c_str());
00048 p.Parse(e->sched_,e->marsym_,e->symbol_table_);
00049 expr=p.getTree();
00050 }
00051 else expr=NULL;
00052 }
00053
00054 Expr::Expr()
00055 {
00056 symbol_table_=NULL;
00057 init_expr_=NULL; expr_=NULL;
00058 rept_=NULL; rate_=NULL;
00059 marsym_=NULL;
00060 sched_=NULL;
00061 timer_=NULL;
00062 initialized_=false;
00063 }
00064 Expr::Expr(MarSystem* msym, Ex e)
00065 {
00066 marsym_=msym;
00067 timer_=NULL;
00068 sched_=NULL;
00069 symbol_table_=new ExRecord();
00070 symbol_table_->inc_ref();
00071 e.parse(this,init_expr_,expr_);
00072 rept_=NULL;
00073 rate_=NULL;
00074 initialized_=false;
00075 }
00076 Expr::Expr(MarSystem* msym, Ex e, Rp r)
00077 {
00078 set(msym,e,r);
00079 }
00080 Expr::Expr(MarSystem* msym, ExFile ef)
00081 {
00082 Ex e=ef.getEx();
00083 Rp r=ef.getRp();
00084 set(msym,e,r);
00085 }
00086 void
00087 Expr::set(MarSystem* m, Ex& e, Rp& r)
00088 {
00089 marsym_=m;
00090 timer_=NULL;
00091 sched_=NULL;
00092 symbol_table_=new ExRecord();
00093 symbol_table_->inc_ref();
00094 e.parse(this,init_expr_,expr_);
00095 r.parse(this,rept_,rate_);
00096 if (rept_&&rept_->getEvalType()!="mrs_bool") {
00097 MRSWARN("Expr:: Repetition expression must evaluate to bool: "+rept_->getEvalType());
00098 rept_->deref(); rept_=NULL;
00099 if (rate_) rate_->deref(); rate_=NULL;
00100 }
00101 else if (rate_&&rate_->getEvalType()!="mrs_string") {
00102 MRSWARN("Expr:: Repetition rate expression must evaluate to string: "+rate_->getEvalType());
00103 if (rept_) rept_->deref(); rept_=NULL;
00104 if (rate_) rate_->deref(); rate_=NULL;
00105 }
00106 initialized_=false;
00107 }
00108
00109 Expr::~Expr()
00110 {
00111 symbol_table_->deref();
00112 delete expr_;
00113 delete init_expr_;
00114 delete rept_;
00115 delete rate_;
00116 }
00117
00118 void
00119 Expr::eval()
00120 {
00121 if (expr_!=NULL)
00122 expr_->eval();
00123 }
00124
00125 bool
00126 Expr::repeat()
00127 {
00128 return (rept_)&&(rept_->eval()).toBool();
00129 }
00130
00131 std::string
00132 Expr::repeat_interval()
00133 {
00134 if (rate_) return (rate_->eval()).toString();
00135 return "__NULL";
00136 }
00137
00138 void
00139 Expr::setScheduler(Scheduler* v)
00140 {
00141 sched_=v;
00142 }
00143
00144 void
00145 Expr::setTimer(TmTimer* t)
00146 {
00147 timer_=t;
00148 }
00149
00150 void
00151 Expr::post()
00152 {
00153 if (init_expr_&&!initialized_)
00154 init_expr_->eval();
00155 initialized_=true;
00156 }
00157
00158 void
00159 ExFile::read(std::string fname)
00160 {
00161 std::ifstream from(fname.c_str());
00162 if (!from) { MRSWARN("ExFile::read Cannot open file: "+fname); return; }
00163 std::string data;
00164 char buffer[256];
00165
00166 bool flags[6] = { false };
00167 int pos=-1;
00168 std::string line;
00169 while (from.getline(buffer,256)) {
00170 if (buffer[0]=='#') {
00171 if (buffer[1]=='E'&&buffer[2]=='x') {
00172 if (buffer[3]=='I'&&buffer[4]=='n'&&buffer[5]=='i'&&buffer[6]=='t'&&buffer[7]==':') {
00173 store(pos,data); data=""; pos=1;
00174 if (flags[pos]) { MRSWARN("ExFile::read Double declaration of #ExInit: block"); }
00175 }
00176 else if (buffer[3]=='E'&&buffer[4]=='x'&&buffer[5]=='p'&&buffer[6]=='r'&&buffer[7]==':') {
00177 store(pos,data); data=""; pos=2;
00178 if (flags[pos]) { MRSWARN("ExFile::read Double declaration of #ExExpr: block"); }
00179 }
00180 }
00181 else if (buffer[1]=='R'&&buffer[2]=='p') {
00182 if (buffer[3]=='E'&&buffer[4]=='x'&&buffer[5]=='p'&&buffer[6]=='r'&&buffer[7]==':') {
00183
00184 store(pos,data); data=""; pos=3;
00185 if (flags[pos]) { MRSWARN("ExFile::read Double declaration of #RpExpr: block"); }
00186 }
00187 else if (buffer[3]=='R'&&buffer[4]=='a'&&buffer[5]=='t'&&buffer[6]=='e'&&buffer[7]==':') {
00188
00189 store(pos,data); data=""; pos=4;
00190 if (flags[pos]) { MRSWARN("ExFile::read Double declaration of #RpRate: block"); }
00191 }
00192 }
00193 else {
00194 MRSWARN("ExFile::read Unknown macro # in ExFile");
00195 }
00196 flags[pos]=true;
00197 }
00198 else { data=data+buffer; }
00199 }
00200 if (!data.empty()) { store(pos,data); }
00201 from.close();
00202 file_read_=true;
00203 }
00204
00205 void
00206 ExFile::store(int pos, std::string data)
00207 {
00208 switch(pos) {
00209 case 1: iex_=data; break;
00210 case 2: ex_=data; break;
00211 case 3: rp_=data; break;
00212 case 4: rr_=data; break;
00213 }
00214 }