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(); } }
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; }
void eval_binary_exp_combi_test() { // 24 / ((2 + 1 + (-1)) ^ 3) AST_Expression_Integer intExp = (AST_Expression_Integer) newAST_Expression_Integer(24); AST_Expression_Integer intExp2 = (AST_Expression_Integer) newAST_Expression_Real(2); AST_Expression_Integer intExp3 = (AST_Expression_Integer) newAST_Expression_Integer(1); AST_Expression_Integer intExp4 = (AST_Expression_Integer) newAST_Expression_Integer(1); AST_Expression_Integer intExp5 = (AST_Expression_Integer) newAST_Expression_Integer(3); AST_Expression_BinOp binOp = (AST_Expression_BinOp) newAST_Expression_BinOp(intExp2, intExp3, BINOPADD); AST_Expression_UMinus uMinus = (AST_Expression_UMinus) newAST_Expression_UnaryMinus(intExp4); AST_Expression_BinOp binOp1 = (AST_Expression_BinOp) newAST_Expression_BinOp(binOp, uMinus, BINOPADD); AST_Expression_BinOp binOp2 = (AST_Expression_BinOp) newAST_Expression_BinOp(binOp1, intExp5, BINOPEXP); AST_Expression_BinOp binOp3 = (AST_Expression_BinOp) newAST_Expression_BinOp(intExp, binOp2, BINOPDIV); EvalExp *evalExp = new EvalExp(NULL); AST_Expression result = evalExp->eval(binOp3); BOOST_CHECK(result->expressionType() == EXPREAL); BOOST_CHECK(result->getAsReal()->val() == 3); }
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); }