AST_Real RangeIterator::eval(AST_Expression exp, VarSymbolTable symbolTable) { EvalExp evaluator(symbolTable); AST_Expression result = evaluator.eval(exp); ERROR_UNLESS(result->expressionType() == EXPREAL || result->expressionType() == EXPINTEGER, "RangeIterator::getVal:\n" "Expression type should be EXPREAL or EXPINTEGER \n"); if (result->expressionType() == EXPREAL) { return result->getAsReal()->val(); } else { return result->getAsInteger()->val(); } }
void eval_binary_exp_exp_test() { AST_Expression_Integer intExp = (AST_Expression_Integer) newAST_Expression_Integer(2); AST_Expression_Integer intExp2 = (AST_Expression_Integer) newAST_Expression_Integer(3); AST_Expression_BinOp binOp = (AST_Expression_BinOp) newAST_Expression_BinOp(intExp, intExp2, BINOPEXP); EvalExp *evalExp = new EvalExp(NULL); AST_Expression result = evalExp->eval(binOp); BOOST_CHECK(result->expressionType() == EXPINTEGER); BOOST_CHECK(result->getAsInteger()->val() == 8); }
AST_Real BraceIterator::next() { AST_Expression exp = *_braceExpElementsIter; AST_Real value; switch (exp->expressionType()){ case EXPINTEGER: value = exp->getAsInteger()->val(); break; case EXPREAL: value = (int)exp->getAsReal()->val(); break; default: ERROR("BraceIterator::next():\n" "Incorrect brace expression element's type."); } _braceExpElementsIter++; return value; }
int MMO_EvalInitExp_::foldTraverseElement (AST_Expression exp) { int ret = 0; switch (exp->expressionType ()) { case EXPCOMPREF: { AST_Expression_ComponentReference cr = exp->getAsComponentReference (); VarInfo vi = _vt->lookup (cr->name ()); if (vi == NULL) { Error::getInstance ()->add (exp->lineNum (), EM_IR | EM_VARIABLE_NOT_FOUND, ER_Error, "%s", cr->name ().c_str ()); return (ret); } if (!vi->isConstant ()) { Error::getInstance ()->add ( exp->lineNum (), EM_IR | EM_INIT_EXP, ER_Error, "Only constants allowed inside initial expressions. %s", cr->name ().c_str ()); return (ret); } return (vi->value ()); } case EXPBOOLEAN: { AST_Expression_Boolean eb = exp->getAsBoolean (); if (eb->value ()) { return (1); } else { return (0); } } case EXPBOOLEANNOT: { AST_Expression_BooleanNot ebn = exp->getAsBooleanNot (); int res = foldTraverse (ebn->exp ()); if (res == 0) { return (1); } else { return (0); } } case EXPREAL: Error::getInstance ()->add ( 0, EM_IR | EM_INIT_EXP, ER_Warning, "Implicit conversion from Real to Integer, in initial expression."); return (exp->getAsReal ()->val ()); case EXPINTEGER: return (exp->getAsInteger ()->val ()); default: Error::getInstance ()->add ( 0, EM_IR | EM_INIT_EXP, ER_Warning, "Initial expression not recognized, returning zero as default value."); break; } return (ret); }