23 #include "CppInterpreter.h"
25 CppInterpreter::CppInterpreter() {
26 logger = Logger::getLogger(
"CppInterpreter");
29 CppInterpreter::~CppInterpreter() {
33 mapVars CppInterpreter::getLocalVariables()
const
35 return localVariables;
38 void CppInterpreter::setLocalVariables(mapVars localVariables)
40 this->localVariables = localVariables;
43 mapVars CppInterpreter::getBoundVariables()
const
45 return boundVariables;
48 void CppInterpreter::setBoundVariables(mapVars boundVariables)
50 this->boundVariables = boundVariables;
53 bool CppInterpreter::isInBuiltType(
string type)
55 return (type==
"int" || type==
"float" || type==
"double" || type==
"string" || type==
"std::string");
135 void CppInterpreter::storeInbuilt(
string type,
string name)
139 int *_temp =
new int;
142 localVariables[name] = o;
144 else if(type==
"float")
146 float *_temp =
new float;
149 localVariables[name] = o;
151 else if(type==
"double")
153 double *_temp =
new double;
156 localVariables[name] = o;
158 else if(type==
"string")
160 string *_temp =
new string;
163 localVariables[name] = o;
167 void CppInterpreter::storeCustom(
string type,
string name)
173 void *_temp = ref.newInstanceGVP(ctor);
177 localVariables[name] = o;
180 bool CppInterpreter::containsChar(
string varname)
182 string allchars =
"abcdefghijklmnopqrstuvwxyz_$";
183 for(
unsigned int l=0;l<varname.length();l++)
185 for(
unsigned int l1=0;l1<allchars.length();l1++)
187 if(allchars.substr(l1,1)==varname.substr(l,1))
197 bool CppInterpreter::isCommand(
string test)
199 return (test==
"if" || test==
"else" || test==
"elseif" || test==
"while" || test==
"for");
202 bool CppInterpreter::retState(
string type,
Object source,
Object target)
204 if(isInBuiltType(source.getTypeName()))
206 if(source.getTypeName()==
"int")
209 return (source.getValue<
int>()==target.getValue<
int>());
211 return (source.getValue<
int>()<=target.getValue<
int>());
213 return (source.getValue<
int>()>=target.getValue<
int>());
215 return (source.getValue<
int>()!=target.getValue<
int>());
217 return (source.getValue<
int>()>target.getValue<
int>());
219 return (source.getValue<
int>()<target.getValue<
int>());
221 else if(source.getTypeName()==
"float")
224 return (source.getValue<
float>()==target.getValue<
float>());
226 return (source.getValue<
float>()<=target.getValue<
float>());
228 return (source.getValue<
float>()>=target.getValue<
float>());
230 return (source.getValue<
float>()!=target.getValue<
float>());
232 return (source.getValue<
float>()>target.getValue<
float>());
234 return (source.getValue<
float>()<target.getValue<
float>());
236 else if(source.getTypeName()==
"double")
239 return (source.getValue<
double>()==target.getValue<
double>());
241 return (source.getValue<
double>()<=target.getValue<
double>());
243 return (source.getValue<
double>()>=target.getValue<
double>());
245 return (source.getValue<
double>()!=target.getValue<
double>());
247 return (source.getValue<
double>()>target.getValue<
double>());
249 return (source.getValue<
double>()<target.getValue<
double>());
251 else if(source.getTypeName()==
"string")
254 return (source.getValue<
string>()==target.getValue<
string>());
256 return (source.getValue<
string>()<=target.getValue<
string>());
258 return (source.getValue<
string>()>=target.getValue<
string>());
260 return (source.getValue<
string>()!=target.getValue<
string>());
262 return (source.getValue<
string>()>target.getValue<
string>());
264 return (source.getValue<
string>()<target.getValue<
string>());
270 bool CppInterpreter::retState(
string type,
Object source,
string target)
272 if(isInBuiltType(source.getTypeName()))
274 if(source.getTypeName()==
"int")
277 return (source.getValue<
int>()==CastUtil::lexical_cast<
int>(target));
279 return (source.getValue<
int>()<=CastUtil::lexical_cast<
int>(target));
281 return (source.getValue<
int>()>=CastUtil::lexical_cast<
int>(target));
283 return (source.getValue<
int>()!=CastUtil::lexical_cast<
int>(target));
285 return (source.getValue<
int>()>CastUtil::lexical_cast<
int>(target));
287 return (source.getValue<
int>()<CastUtil::lexical_cast<
int>(target));
289 else if(source.getTypeName()==
"float")
292 return (source.getValue<
float>()==CastUtil::lexical_cast<
float>(target));
294 return (source.getValue<
float>()<=CastUtil::lexical_cast<
float>(target));
296 return (source.getValue<
float>()>=CastUtil::lexical_cast<
float>(target));
298 return (source.getValue<
float>()!=CastUtil::lexical_cast<
float>(target));
300 return (source.getValue<
float>()>CastUtil::lexical_cast<
float>(target));
302 return (source.getValue<
float>()<CastUtil::lexical_cast<
float>(target));
304 else if(source.getTypeName()==
"double")
307 return (source.getValue<
double>()==CastUtil::lexical_cast<
double>(target));
309 return (source.getValue<
double>()<=CastUtil::lexical_cast<
double>(target));
311 return (source.getValue<
double>()>=CastUtil::lexical_cast<
double>(target));
313 return (source.getValue<
double>()!=CastUtil::lexical_cast<
double>(target));
315 return (source.getValue<
double>()>CastUtil::lexical_cast<
double>(target));
317 return (source.getValue<
double>()<CastUtil::lexical_cast<
double>(target));
319 else if(source.getTypeName()==
"string")
322 return (source.getValue<
string>()==target);
324 return (source.getValue<
string>()<=target);
326 return (source.getValue<
string>()>=target);
328 return (source.getValue<
string>()!=target);
330 return (source.getValue<
string>()>target);
332 return (source.getValue<
string>()<target);
338 bool CppInterpreter::evaluateCondition(
string condition)
342 if(condition.find(
"==")!=string::npos)
346 else if(condition.find(
"!=")!=string::npos)
350 else if(condition.find(
"<=")!=string::npos || condition.find(
"=<")!=string::npos)
354 else if(condition.find(
">=")!=string::npos || condition.find(
"=>")!=string::npos)
358 else if(condition.find(
">")!=string::npos)
362 else if(condition.find(
"<")!=string::npos)
369 StringUtil::split(bs, condition, (token));
370 if(bs.size()==2 && bs.at(0)!=
"" && bs.at(1)!=
"")
373 if(localVariables.find(bs.at(0))!=localVariables.end())
375 source = localVariables[bs.at(0)];
377 else if(boundVariables.find(bs.at(0))!=boundVariables.end())
379 source = boundVariables[bs.at(0)];
381 if(containsChar(bs.at(1)))
383 if(localVariables.find(bs.at(1))!=localVariables.end())
385 target = localVariables[bs.at(1)];
387 else if(boundVariables.find(bs.at(1))!=boundVariables.end())
389 target = boundVariables[bs.at(1)];
391 state = retState(token,source,target);
395 state = retState(token,source,bs.at(1));
402 void CppInterpreter::skipStatement(vector<string>::iterator &itr)
404 string nextToken = *(itr);
405 while(nextToken!=
";")
407 nextToken = *(++itr);
412 void CppInterpreter::skipCommand(vector<string>::iterator &itr)
416 string nextToken = *(itr);
423 else if(nextToken==
")")
429 nextToken = *(itr++);
437 else if(nextToken==
"}")
446 nextToken = *(++itr);
451 if(isCommand(nextToken))
458 void CppInterpreter::evaluateUpdateCustom(
string sep,
string type,
string name,vector<string> opr,
bool local)
462 o = localVariables[name];
464 o = boundVariables[name];
466 if(localVariables.find(opr.at(0))!=localVariables.end())
468 i = localVariables[opr.at(0)];
470 else if(boundVariables.find(opr.at(0))!=boundVariables.end())
472 i = boundVariables[opr.at(0)];
474 if(i.getTypeName()!=
"" && o.getTypeName()!=
"")
477 ClassInfo clas = reflector.getClassInfo(type);
478 string name =
"invokeReflectionCIAssignMethodFor"+i.getTypeName();
480 argus.push_back(
"void*");
481 argus.push_back(
"void*");
482 Method meth = clas.getMethod(name,argus);
484 valus.push_back(o.getVoidPointer());
485 reflector.invokeMethod<
void*>(i.getVoidPointer(),meth,valus);
489 void CppInterpreter::evaluateUpdateInbuilt(
string sep,
string type,
string name,vector<string> opr,
bool local)
495 o = localVariables[name];
497 o = boundVariables[name];
498 int *_temp = (
int*)o.getVoidPointer();
499 vector<string> curr,going,temp;
502 if(sep==
"++" || sep==
"--")
538 vector<string>::iterator itre,endre;
541 string res = evalBrackets<int>(itre,endre);
564 *_temp = CastUtil::lexical_cast<
int>(res);
566 *_temp = *_temp + CastUtil::lexical_cast<
int>(res);
568 *_temp = *_temp - CastUtil::lexical_cast<
int>(res);
597 void CppInterpreter::executeStatement(
string sep,vector<string> lhs,vector<string> rhs)
604 StringUtil::split(bs, lhs.at(0), (
" "));
609 if(localVariables.find(bs.at(0))!=localVariables.end())
611 source = localVariables[bs.at(0)];
614 else if(boundVariables.find(bs.at(0))!=boundVariables.end())
616 source = boundVariables[bs.at(0)];
618 if(isInBuiltType(source.getTypeName()))
620 evaluateUpdateInbuilt(sep,source.getTypeName(),bs.at(0),rhs,local);
624 evaluateUpdateCustom(sep,bs.at(0),bs.at(1),rhs,local);
629 if(isInBuiltType(bs.at(0)))
631 storeInbuilt(bs.at(0),bs.at(1));
632 evaluateUpdateInbuilt(sep,bs.at(0),bs.at(1),rhs,
true);
636 storeCustom(bs.at(0),bs.at(1));
637 evaluateUpdateCustom(sep,bs.at(0),bs.at(1),rhs,
true);
645 StringUtil::split(bs, lhs.at(0), (
" "));
646 if(isInBuiltType(bs.at(0)))
648 storeInbuilt(bs.at(0),bs.at(1));
653 storeCustom(bs.at(0),bs.at(1));
659 Obj CppInterpreter::handleObjectMethodInvocation(
string objn,
string methn,vector<string>::iterator &itr)
661 string token = *(++itr);
667 string objname,methName;
676 methName = statement;
677 obj = handleObjectMethodInvocation(objname,methName,itr);
686 if(obj.getType()!=
"")
688 valus.push_back(obj.getPointer());
689 argus.push_back(obj.getType());
690 obj.setPointer(NULL);
693 else if(statement!=
"")
696 if(localVariables.find(statement)!=localVariables.end())
698 src = localVariables[statement];
700 else if(boundVariables.find(statement)!=boundVariables.end())
702 src = boundVariables[statement];
704 if(src.getTypeName()!=
"")
706 argus.push_back(src.getTypeName());
707 valus.push_back(src.getVoidPointer());
713 else if((token==
"." || token==
"->"))
720 if(obj.getType()!=
"")
722 valus.push_back(obj.getPointer());
723 argus.push_back(obj.getType());
724 obj.setPointer(NULL);
727 else if(statement!=
"")
730 if(localVariables.find(statement)!=localVariables.end())
732 src = localVariables[statement];
734 else if(boundVariables.find(statement)!=boundVariables.end())
736 src = boundVariables[statement];
738 if(src.getTypeName()!=
"")
740 argus.push_back(src.getTypeName());
741 valus.push_back(obj.getPointer());
750 if(localVariables.find(objn)!=localVariables.end())
752 source = localVariables[objn];
754 else if(boundVariables.find(objn)!=boundVariables.end())
756 source = boundVariables[objn];
758 if(source.getTypeName()!=
"")
761 ClassInfo clas = reflector.getClassInfo(source.getTypeName());
762 Method meth = clas.getMethod(methn,argus);
763 void *po = reflector.invokeMethodGVP(source.getVoidPointer(),meth,valus);
765 obj.setType(meth.getReturnType());
770 void CppInterpreter::handleStatement(vector<string>::iterator &itr)
775 vector<string> lhs,rhs;
776 string objname,methName;
777 bool rhsa =
false,objmem =
false;
779 bool objectex =
false;
806 if(statement!=
"")rhs.push_back(statement);
813 if(statement!=
"")rhs.push_back(statement);
820 if(statement!=
"")rhs.push_back(statement);
827 if(statement!=
"")rhs.push_back(statement);
835 Obj obj = handleObjectMethodInvocation(objname,methName,itr);
836 if(obj.getType()!=
"" && sep!=
"")
839 o << obj.getPointer();
840 o.setTypeName(obj.getType());
841 string argname =
"_argno"+CastUtil::lexical_cast<
string>(argn++);
842 localVariables[argname] = o;
855 if(statement!=
"")rhs.push_back(statement);
863 if(statement!=
"")rhs.push_back(statement);
888 else if(token.find(
".")!=string::npos)
892 StringUtil::split(bs,token, (
"."));
898 lhs.push_back(token);
900 else if(sep!=token && !rhsa)
907 if(sep!=token && statement!=
"")
908 rhs.push_back(statement);
910 executeStatement(sep,lhs,rhs);
914 bool CppInterpreter::evalCond(vector<string> str)
916 vector<string>::iterator iter;
934 state = state && evaluateCondition(cond);
935 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
939 state = state || evaluateCondition(cond);
940 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
944 state = evaluateCondition(cond);
945 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
956 state = state && evaluateCondition(cond);
957 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
961 state = state || evaluateCondition(cond);
962 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
966 state = evaluateCondition(cond);
967 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
976 state = state && evaluateCondition(cond);
977 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
981 state = state || evaluateCondition(cond);
982 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
986 state = evaluateCondition(cond);
987 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
1000 if(cond!=
"" && cond!=
" ")
1002 logger <<
"state=" << state <<
"\n" << flush;
1003 state = evaluateCondition(cond);
1008 void CppInterpreter::handleELSE(vector<string>::iterator &iter)
1010 string nextToken = *(++iter);
1018 else if(nextToken==
"}")
1024 else if(isCommand(nextToken))
1025 hanldeCommand(iter);
1027 handleStatement(iter);
1028 nextToken = *(++iter);
1034 if(isCommand(nextToken))
1036 hanldeCommand(iter);
1041 handleStatement(iter);
1045 nextToken = *(++iter);
1050 void CppInterpreter::hanldeIF(vector<string>::iterator &iter)
1053 string st = *(++iter);
1068 state = state && evaluateCondition(cond);
1069 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
1073 state = state || evaluateCondition(cond);
1074 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
1078 state = evaluateCondition(cond);
1079 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
1090 state = state && evaluateCondition(cond);
1091 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
1095 state = state || evaluateCondition(cond);
1096 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
1100 state = evaluateCondition(cond);
1101 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
1110 state = state && evaluateCondition(cond);
1111 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
1115 state = state || evaluateCondition(cond);
1116 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
1120 state = evaluateCondition(cond);
1121 logger <<
"prev=" << prev <<
" cond=" << cond <<
" state=" << state <<
"\n" << flush;
1130 string nextToken = *(++iter);
1140 else if(nextToken==
"}")
1146 else if(isCommand(nextToken))
1147 hanldeCommand(iter);
1149 handleStatement(iter);
1150 nextToken = *(++iter);
1156 if(isCommand(nextToken))
1158 hanldeCommand(iter);
1163 handleStatement(iter);
1167 nextToken = *(++iter);
1179 else if(nextToken==
"}")
1188 nextToken = *(++iter);
1194 if(isCommand(nextToken))
1201 skipStatement(iter);
1205 nextToken = *(++iter);
1208 if(nextToken==
"else")
1210 nextToken = *(++iter);
1223 void CppInterpreter::hanldeWHILE(vector<string>::iterator &itr)
1225 string st = *(++itr);
1228 vector<string> whlstr;
1231 whlstr.push_back(st);
1244 string nextToken = *(++itr);
1245 vector<string> stmt;
1253 stmt.push_back(nextToken);
1256 else if(nextToken==
"}")
1264 nextToken = *(++itr);
1270 while(nextToken!=
";")
1272 stmt.push_back(nextToken);
1273 nextToken = *(++itr);
1275 stmt.push_back(nextToken);
1277 while(evalCond(whlstr))
1280 vector<string>::iterator tok = stmt.begin();
1281 string stok = *(tok);
1283 while(tok<stmt.end())
1297 else if(isCommand(stok))
1300 handleStatement(tok);
1315 handleStatement(tok);
1325 void CppInterpreter::hanldeFOR(vector<string>::iterator &itr)
1327 string st = *(++itr);
1330 bool condit=
false,inc=
false;
1331 vector<string> whlstr,incr;
1334 if(st!=
";" && condit)
1335 whlstr.push_back(st);
1340 handleStatement(itr);
1353 incr.push_back(
";");
1361 string nextToken = *(++itr);
1362 vector<string> stmt;
1370 stmt.push_back(nextToken);
1373 else if(nextToken==
"}")
1378 stmt.erase(stmt.begin()+stmt.size()-1);
1379 if(incr.at(0)==
"++" || incr.at(0)==
"--")
1381 for(
unsigned int l=0;l<stmt.size();l++)
1383 incr.push_back(stmt.at(l));
1389 for(
unsigned int l=0;l<incr.size();l++)
1391 stmt.push_back(incr.at(l));
1394 stmt.push_back(nextToken);
1398 nextToken = *(++itr);
1404 while(nextToken!=
";")
1406 stmt.push_back(nextToken);
1407 nextToken = *(++itr);
1409 stmt.push_back(nextToken);
1411 while(evalCond(whlstr))
1414 vector<string>::iterator tok = stmt.begin();
1415 string stok = *(tok);
1417 while(tok<stmt.end())
1431 else if(isCommand(stok))
1434 handleStatement(tok);
1449 handleStatement(tok);
1459 void CppInterpreter::hanldeCommand(vector<string>::iterator &itr)
1461 if(*itr==
"if" || *itr==
"else if")
1465 else if(*itr==
"for")
1469 else if(*itr==
"while")
1476 void CppInterpreter::eval(
string str)
1478 logger << str << flush;
1481 while(temp.find(
"\"")!=string::npos)
1483 size_t s = temp.find_first_of(
"\"")+1;
1484 string temp1 = temp.substr(s);
1485 size_t e = temp1.find_first_of(
"\"");
1487 litval = temp.substr(s,e);
1488 temp = temp.substr(e+s+1);
1489 string varn = (
"_"+ CastUtil::lexical_cast<
string>(st++));
1490 literals[varn] = litval;
1491 string ini = str.substr(0,s-1);
1492 str = (ini + varn + temp);
1494 logger <<
"\n" << flush;
1495 logger << litval << flush;
1496 logger <<
"\n" << flush;
1497 logger << s << e << flush;
1498 logger <<
"\n" << flush;
1499 logger << temp << flush;
1500 logger <<
"\n" << flush;
1502 logger << str << flush;
1503 RegexUtil::replace(str,
"[\t]+",
" ");
1504 RegexUtil::replace(str,
"[ ]+",
" ");
1505 logger <<
"\n" << flush;
1506 logger << str << flush;
1507 logger <<
"\n" << flush;
1510 vector<string> commands;
1513 for(
unsigned int l=0;l<str.length();l++)
1515 if(str.substr(l,1)==
"{" || str.substr(l,1)==
"}" || str.substr(l,1)==
";" || str.substr(l,1)==
")"
1516 || str.substr(l,1)==
"(" || str.substr(l,1)==
"+" || str.substr(l,1)==
"-" || str.substr(l,1)==
"/"
1517 || str.substr(l,1)==
"*" || str.substr(l,1)==
"=" || str.substr(l,1)==
"!" || str.substr(l,1)==
"|"
1518 || str.substr(l,1)==
"&" || str.substr(l,1)==
"<" || str.substr(l,1)==
">")
1528 commands.push_back(str.substr(l,1));
1533 if(comm.find_first_not_of(
" ")!=string::npos && comm.find_last_not_of(
" ")!=string::npos)
1535 comm = comm.substr(comm.find_first_not_of(
" "),comm.find_last_not_of(
" ")+1);
1536 commands.push_back(comm);
1538 if(str.substr(l,2)==
"==" || str.substr(l,2)==
"||" || str.substr(l,2)==
"&&" || str.substr(l,2)==
"!="
1539 || str.substr(l,2)==
">=" || str.substr(l,2)==
"<=" || str.substr(l,2)==
"=>" || str.substr(l,2)==
"=<"
1540 || str.substr(l,2)==
"<<" || str.substr(l,2)==
">>" || str.substr(l,2)==
"++" || str.substr(l,2)==
"--"
1541 || str.substr(l,2)==
"+=" || str.substr(l,2)==
"-=")
1544 commands.push_back(str.substr(l,2));
1547 commands.push_back(str.substr(l,1));
1553 comm += str.substr(l,1);
1556 commands.push_back(
"else");
1563 comm = comm.substr(comm.find_first_not_of(
" "));
1564 commands.push_back(comm);
1566 vector<string>::iterator iter;
1567 iter = commands.begin();
1568 string nextToken = *(iter);
1569 while(iter<commands.end())
1578 else if(nextToken==
"}")
1584 else if(isCommand(nextToken))
1585 hanldeCommand(iter);
1587 handleStatement(iter);
1588 nextToken = *(++iter);
1593 if(isCommand(nextToken))
1594 hanldeCommand(iter);
1596 handleStatement(iter);
1599 if(iter<commands.end())
1600 nextToken = *(iter);