|
|
@ -27,28 +27,28 @@ namespace storm { |
|
|
|
unaryExpression = atomicExpression[qi::_val = qi::_1] | (qi::lit("!") >> atomicExpression)[qi::_val = phoenix::bind(&ExpressionParser::createNotExpression, phoenix::ref(*this), qi::_1)] | (qi::lit("-") >> atomicExpression)[qi::_val = phoenix::bind(&ExpressionParser::createMinusExpression, phoenix::ref(*this), qi::_1)]; |
|
|
|
unaryExpression.name("unary expression"); |
|
|
|
|
|
|
|
powerExpression = unaryExpression[qi::_val = qi::_1] >> -(qi::lit("^") > expression)[qi::_val = phoenix::bind(&ExpressionParser::createPowerExpression, phoenix::ref(*this), qi::_val, qi::_1)]; |
|
|
|
powerExpression = unaryExpression[qi::_val = qi::_1] > -(powerOperator_ > expression)[qi::_val = phoenix::bind(&ExpressionParser::createPowerExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2)]; |
|
|
|
powerExpression.name("power expression"); |
|
|
|
|
|
|
|
multiplicationExpression = powerExpression[qi::_val = qi::_1] >> *((qi::lit("*")[qi::_a = true] | qi::lit("/")[qi::_a = false]) >> powerExpression[phoenix::if_(qi::_a) [qi::_val = phoenix::bind(&ExpressionParser::createMultExpression, phoenix::ref(*this), qi::_val, qi::_1)] .else_ [qi::_val = phoenix::bind(&ExpressionParser::createDivExpression, phoenix::ref(*this), qi::_val, qi::_1)]]); |
|
|
|
multiplicationExpression = powerExpression[qi::_val = qi::_1] > *(multiplicationOperator_ > powerExpression)[qi::_val = phoenix::bind(&ExpressionParser::createMultExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2)]; |
|
|
|
multiplicationExpression.name("multiplication expression"); |
|
|
|
|
|
|
|
plusExpression = multiplicationExpression[qi::_val = qi::_1] >> *((qi::lit("+")[qi::_a = true] | qi::lit("-")[qi::_a = false]) >> multiplicationExpression)[phoenix::if_(qi::_a) [qi::_val = phoenix::bind(&ExpressionParser::createPlusExpression, phoenix::ref(*this), qi::_val, qi::_1)] .else_ [qi::_val = phoenix::bind(&ExpressionParser::createMinusExpression, phoenix::ref(*this), qi::_val, qi::_1)]]; |
|
|
|
plusExpression = multiplicationExpression[qi::_val = qi::_1] > *(plusOperator_ >> multiplicationExpression)[qi::_val = phoenix::bind(&ExpressionParser::createPlusExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2)]; |
|
|
|
plusExpression.name("plus expression"); |
|
|
|
|
|
|
|
relativeExpression = (plusExpression >> qi::lit(">=") >> plusExpression)[qi::_val = phoenix::bind(&ExpressionParser::createGreaterOrEqualExpression, phoenix::ref(*this), qi::_1, qi::_2)] | (plusExpression >> qi::lit(">") >> plusExpression)[qi::_val = phoenix::bind(&ExpressionParser::createGreaterExpression, phoenix::ref(*this), qi::_1, qi::_2)] | (plusExpression >> qi::lit("<=") >> plusExpression)[qi::_val = phoenix::bind(&ExpressionParser::createLessOrEqualExpression, phoenix::ref(*this), qi::_1, qi::_2)] | (plusExpression >> qi::lit("<") >> plusExpression)[qi::_val = phoenix::bind(&ExpressionParser::createLessExpression, phoenix::ref(*this), qi::_1, qi::_2)] | plusExpression[qi::_val = qi::_1]; |
|
|
|
relativeExpression = plusExpression[qi::_val = qi::_1] > -(relationalOperator_ > plusExpression)[qi::_val = phoenix::bind(&ExpressionParser::createRelationalExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2)]; |
|
|
|
relativeExpression.name("relative expression"); |
|
|
|
|
|
|
|
equalityExpression = relativeExpression[qi::_val = qi::_1] >> *((qi::lit("=")[qi::_a = true] | qi::lit("!=")[qi::_a = false]) >> relativeExpression)[phoenix::if_(qi::_a) [ qi::_val = phoenix::bind(&ExpressionParser::createEqualsExpression, phoenix::ref(*this), qi::_val, qi::_1) ] .else_ [ qi::_val = phoenix::bind(&ExpressionParser::createNotEqualsExpression, phoenix::ref(*this), qi::_val, qi::_1) ] ]; |
|
|
|
|
|
|
|
equalityExpression = relativeExpression[qi::_val = qi::_1] >> *(equalityOperator_ >> relativeExpression)[qi::_val = phoenix::bind(&ExpressionParser::createEqualsExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2)]; |
|
|
|
equalityExpression.name("equality expression"); |
|
|
|
|
|
|
|
andExpression = equalityExpression[qi::_val = qi::_1] >> *(qi::lit("&") >> equalityExpression)[qi::_val = phoenix::bind(&ExpressionParser::createAndExpression, phoenix::ref(*this), qi::_val, qi::_1)]; |
|
|
|
andExpression = equalityExpression[qi::_val = qi::_1] >> *(andOperator_ > equalityExpression)[qi::_val = phoenix::bind(&ExpressionParser::createAndExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2)]; |
|
|
|
andExpression.name("and expression"); |
|
|
|
|
|
|
|
orExpression = andExpression[qi::_val = qi::_1] >> *((qi::lit("|")[qi::_a = true] | qi::lit("=>")[qi::_a = false]) >> andExpression)[phoenix::if_(qi::_a) [qi::_val = phoenix::bind(&ExpressionParser::createOrExpression, phoenix::ref(*this), qi::_val, qi::_1)] .else_ [qi::_val = phoenix::bind(&ExpressionParser::createImpliesExpression, phoenix::ref(*this), qi::_val, qi::_1)] ]; |
|
|
|
orExpression = andExpression[qi::_val = qi::_1] > *(orOperator_ > andExpression)[qi::_val = phoenix::bind(&ExpressionParser::createOrExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2)]; |
|
|
|
orExpression.name("or expression"); |
|
|
|
|
|
|
|
iteExpression = orExpression[qi::_val = qi::_1] >> -(qi::lit("?") > orExpression > qi::lit(":") > orExpression)[qi::_val = phoenix::bind(&ExpressionParser::createIteExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2)]; |
|
|
|
iteExpression = orExpression[qi::_val = qi::_1] > -(qi::lit("?") > orExpression > qi::lit(":") > orExpression)[qi::_val = phoenix::bind(&ExpressionParser::createIteExpression, phoenix::ref(*this), qi::_val, qi::_1, qi::_2)]; |
|
|
|
iteExpression.name("if-then-else expression"); |
|
|
|
|
|
|
|
expression %= iteExpression; |
|
|
@ -101,98 +101,14 @@ namespace storm { |
|
|
|
return storm::expressions::Expression::createFalse(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createImpliesExpression(storm::expressions::Expression e1, storm::expressions::Expression e2) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try { |
|
|
|
return e1.implies(e2); |
|
|
|
} catch (storm::exceptions::InvalidTypeException const& e) { |
|
|
|
LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << get_line(qi::_3) << ": " << e.what()); |
|
|
|
} |
|
|
|
} else { |
|
|
|
return storm::expressions::Expression::createFalse(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createOrExpression(storm::expressions::Expression e1, storm::expressions::Expression e2) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try { |
|
|
|
return e1 || e2; |
|
|
|
} catch (storm::exceptions::InvalidTypeException const& e) { |
|
|
|
LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << get_line(qi::_3) << ": " << e.what()); |
|
|
|
} |
|
|
|
} else { |
|
|
|
return storm::expressions::Expression::createFalse(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createAndExpression(storm::expressions::Expression e1, storm::expressions::Expression e2) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try{ |
|
|
|
return e1 && e2; |
|
|
|
} catch (storm::exceptions::InvalidTypeException const& e) { |
|
|
|
LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << get_line(qi::_3) << ": " << e.what()); |
|
|
|
} |
|
|
|
} else { |
|
|
|
return storm::expressions::Expression::createFalse(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createGreaterExpression(storm::expressions::Expression e1, storm::expressions::Expression e2) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try { |
|
|
|
return e1 > e2; |
|
|
|
} catch (storm::exceptions::InvalidTypeException const& e) { |
|
|
|
LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << get_line(qi::_3) << ": " << e.what()); |
|
|
|
} |
|
|
|
} else { |
|
|
|
return storm::expressions::Expression::createFalse(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createGreaterOrEqualExpression(storm::expressions::Expression e1, storm::expressions::Expression e2) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try { |
|
|
|
return e1 >= e2; |
|
|
|
} catch (storm::exceptions::InvalidTypeException const& e) { |
|
|
|
LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << get_line(qi::_3) << ": " << e.what()); |
|
|
|
} |
|
|
|
} else { |
|
|
|
return storm::expressions::Expression::createFalse(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createLessExpression(storm::expressions::Expression e1, storm::expressions::Expression e2) const { |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createOrExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try { |
|
|
|
return e1 < e2; |
|
|
|
} catch (storm::exceptions::InvalidTypeException const& e) { |
|
|
|
LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << get_line(qi::_3) << ": " << e.what()); |
|
|
|
} |
|
|
|
} else { |
|
|
|
return storm::expressions::Expression::createFalse(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createLessOrEqualExpression(storm::expressions::Expression e1, storm::expressions::Expression e2) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try { |
|
|
|
return e1 <= e2; |
|
|
|
} catch (storm::exceptions::InvalidTypeException const& e) { |
|
|
|
LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << get_line(qi::_3) << ": " << e.what()); |
|
|
|
} |
|
|
|
} else { |
|
|
|
return storm::expressions::Expression::createFalse(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createEqualsExpression(storm::expressions::Expression e1, storm::expressions::Expression e2) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try { |
|
|
|
if (e1.hasBooleanReturnType() && e2.hasBooleanReturnType()) { |
|
|
|
return e1.iff(e2); |
|
|
|
} else { |
|
|
|
return e1 == e2; |
|
|
|
switch (operatorType) { |
|
|
|
case storm::expressions::OperatorType::Or: return e1 || e2; break; |
|
|
|
case storm::expressions::OperatorType::Implies: return e1.implies(e2); break; |
|
|
|
default: LOG_ASSERT(false, "Invalid operation."); break; |
|
|
|
} |
|
|
|
} catch (storm::exceptions::InvalidTypeException const& e) { |
|
|
|
LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << get_line(qi::_3) << ": " << e.what()); |
|
|
@ -202,10 +118,13 @@ namespace storm { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createNotEqualsExpression(storm::expressions::Expression e1, storm::expressions::Expression e2) const { |
|
|
|
storm::expressions::Expression ExpressionParser::createAndExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try { |
|
|
|
return e1 != e2; |
|
|
|
switch (operatorType) { |
|
|
|
case storm::expressions::OperatorType::And: return e1 && e2; break; |
|
|
|
default: LOG_ASSERT(false, "Invalid operation."); break; |
|
|
|
} |
|
|
|
} catch (storm::exceptions::InvalidTypeException const& e) { |
|
|
|
LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << get_line(qi::_3) << ": " << e.what()); |
|
|
|
} |
|
|
@ -214,10 +133,16 @@ namespace storm { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createPlusExpression(storm::expressions::Expression e1, storm::expressions::Expression e2) const { |
|
|
|
storm::expressions::Expression ExpressionParser::createRelationalExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try { |
|
|
|
return e1 + e2; |
|
|
|
switch (operatorType) { |
|
|
|
case storm::expressions::OperatorType::GreaterOrEqual: return e1 >= e2; break; |
|
|
|
case storm::expressions::OperatorType::Greater: return e1 > e2; break; |
|
|
|
case storm::expressions::OperatorType::LessOrEqual: return e1 <= e2; break; |
|
|
|
case storm::expressions::OperatorType::Less: return e1 < e2; break; |
|
|
|
default: LOG_ASSERT(false, "Invalid operation."); break; |
|
|
|
} |
|
|
|
} catch (storm::exceptions::InvalidTypeException const& e) { |
|
|
|
LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << get_line(qi::_3) << ": " << e.what()); |
|
|
|
} |
|
|
@ -226,10 +151,14 @@ namespace storm { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createMinusExpression(storm::expressions::Expression e1, storm::expressions::Expression e2) const { |
|
|
|
storm::expressions::Expression ExpressionParser::createEqualsExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try { |
|
|
|
return e1 - e2; |
|
|
|
switch (operatorType) { |
|
|
|
case storm::expressions::OperatorType::Equal: return e1.hasBooleanReturnType() && e2.hasBooleanReturnType() ? e1.iff(e2) : e1 == e2; break; |
|
|
|
case storm::expressions::OperatorType::NotEqual: return e1 != e2; break; |
|
|
|
default: LOG_ASSERT(false, "Invalid operation."); break; |
|
|
|
} |
|
|
|
} catch (storm::exceptions::InvalidTypeException const& e) { |
|
|
|
LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << get_line(qi::_3) << ": " << e.what()); |
|
|
|
} |
|
|
@ -238,10 +167,14 @@ namespace storm { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createMultExpression(storm::expressions::Expression e1, storm::expressions::Expression e2) const { |
|
|
|
storm::expressions::Expression ExpressionParser::createPlusExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try { |
|
|
|
return e1 * e2; |
|
|
|
switch (operatorType) { |
|
|
|
case storm::expressions::OperatorType::Plus: return e1 + e2; break; |
|
|
|
case storm::expressions::OperatorType::Minus: return e1 - e2; break; |
|
|
|
default: LOG_ASSERT(false, "Invalid operation."); break; |
|
|
|
} |
|
|
|
} catch (storm::exceptions::InvalidTypeException const& e) { |
|
|
|
LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << get_line(qi::_3) << ": " << e.what()); |
|
|
|
} |
|
|
@ -250,10 +183,14 @@ namespace storm { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createPowerExpression(storm::expressions::Expression e1, storm::expressions::Expression e2) const { |
|
|
|
storm::expressions::Expression ExpressionParser::createMultExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try { |
|
|
|
return e1 ^ e2; |
|
|
|
switch (operatorType) { |
|
|
|
case storm::expressions::OperatorType::Times: return e1 * e2; break; |
|
|
|
case storm::expressions::OperatorType::Divide: return e1 / e2; break; |
|
|
|
default: LOG_ASSERT(false, "Invalid operation."); break; |
|
|
|
} |
|
|
|
} catch (storm::exceptions::InvalidTypeException const& e) { |
|
|
|
LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << get_line(qi::_3) << ": " << e.what()); |
|
|
|
} |
|
|
@ -262,10 +199,13 @@ namespace storm { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createDivExpression(storm::expressions::Expression e1, storm::expressions::Expression e2) const { |
|
|
|
storm::expressions::Expression ExpressionParser::createPowerExpression(storm::expressions::Expression const& e1, storm::expressions::OperatorType const& operatorType, storm::expressions::Expression const& e2) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try { |
|
|
|
return e1 / e2; |
|
|
|
switch (operatorType) { |
|
|
|
case storm::expressions::OperatorType::Power: return e1 ^ e2; break; |
|
|
|
default: LOG_ASSERT(false, "Invalid operation."); break; |
|
|
|
} |
|
|
|
} catch (storm::exceptions::InvalidTypeException const& e) { |
|
|
|
LOG_THROW(false, storm::exceptions::WrongFormatException, "Parsing error in line " << get_line(qi::_3) << ": " << e.what()); |
|
|
|
} |
|
|
@ -273,7 +213,7 @@ namespace storm { |
|
|
|
return storm::expressions::Expression::createFalse(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
storm::expressions::Expression ExpressionParser::createNotExpression(storm::expressions::Expression e1) const { |
|
|
|
if (this->createExpressions) { |
|
|
|
try { |
|
|
|