2 changed files with 266 additions and 0 deletions
-
231src/storm/storage/expressions/ToDiceStringVisitor.cpp
-
35src/storm/storage/expressions/ToDiceStringVisitor.h
@ -0,0 +1,231 @@ |
|||
#include "storm/storage/expressions/ToDiceStringVisitor.h"
|
|||
|
|||
namespace storm { |
|||
namespace expressions { |
|||
ToDiceStringVisitor::ToDiceStringVisitor(uint64 nrBits) : nrBits(nrBits) { |
|||
|
|||
} |
|||
|
|||
std::string ToDiceStringVisitor::toString(Expression const& expression) { |
|||
return toString(expression.getBaseExpressionPointer().get()); |
|||
} |
|||
|
|||
std::string ToDiceStringVisitor::toString(BaseExpression const* expression) { |
|||
stream.str(""); |
|||
stream.clear(); |
|||
expression->accept(*this, boost::none); |
|||
return stream.str(); |
|||
} |
|||
|
|||
boost::any ToDiceStringVisitor::visit(IfThenElseExpression const& expression, boost::any const& data) { |
|||
stream << "if "; |
|||
expression.getCondition()->accept(*this, data); |
|||
stream << " then "; |
|||
expression.getThenExpression()->accept(*this, data); |
|||
stream << " else "; |
|||
expression.getElseExpression()->accept(*this, data); |
|||
stream << ""; |
|||
return boost::any(); |
|||
} |
|||
|
|||
boost::any ToDiceStringVisitor::visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) { |
|||
switch (expression.getOperatorType()) { |
|||
case BinaryBooleanFunctionExpression::OperatorType::And: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << " && "; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryBooleanFunctionExpression::OperatorType::Or: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << " || "; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryBooleanFunctionExpression::OperatorType::Xor: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << " xor "; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryBooleanFunctionExpression::OperatorType::Implies: |
|||
stream << "(!("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << ") || "; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryBooleanFunctionExpression::OperatorType::Iff: |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << " <=> "; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
break; |
|||
} |
|||
return boost::any(); |
|||
} |
|||
|
|||
boost::any ToDiceStringVisitor::visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) { |
|||
switch (expression.getOperatorType()) { |
|||
case BinaryNumericalFunctionExpression::OperatorType::Plus: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << "+"; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryNumericalFunctionExpression::OperatorType::Minus: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << "-"; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryNumericalFunctionExpression::OperatorType::Times: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << "*"; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryNumericalFunctionExpression::OperatorType::Divide: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << "/"; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryNumericalFunctionExpression::OperatorType::Power: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << "^"; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryNumericalFunctionExpression::OperatorType::Modulo: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << "%"; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryNumericalFunctionExpression::OperatorType::Max: |
|||
stream << "max("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << ","; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryNumericalFunctionExpression::OperatorType::Min: |
|||
stream << "min("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << ","; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
} |
|||
return boost::any(); |
|||
} |
|||
|
|||
boost::any ToDiceStringVisitor::visit(BinaryRelationExpression const& expression, boost::any const& data) { |
|||
switch (expression.getRelationType()) { |
|||
case BinaryRelationExpression::RelationType::Equal: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << "=="; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryRelationExpression::RelationType::NotEqual: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << "!="; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryRelationExpression::RelationType::Less: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << "<"; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryRelationExpression::RelationType::LessOrEqual: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << "<="; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryRelationExpression::RelationType::Greater: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << ">"; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case BinaryRelationExpression::RelationType::GreaterOrEqual: |
|||
stream << "("; |
|||
expression.getFirstOperand()->accept(*this, data); |
|||
stream << ">="; |
|||
expression.getSecondOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
} |
|||
return boost::any(); |
|||
} |
|||
|
|||
boost::any ToDiceStringVisitor::visit(VariableExpression const& expression, boost::any const&) { |
|||
stream << expression.getVariable().getName(); |
|||
return boost::any(); |
|||
} |
|||
|
|||
boost::any ToDiceStringVisitor::visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) { |
|||
switch (expression.getOperatorType()) { |
|||
case UnaryBooleanFunctionExpression::OperatorType::Not: |
|||
stream << "!("; |
|||
expression.getOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
} |
|||
return boost::any(); |
|||
} |
|||
|
|||
boost::any ToDiceStringVisitor::visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) { |
|||
switch (expression.getOperatorType()) { |
|||
case UnaryNumericalFunctionExpression::OperatorType::Minus: |
|||
stream << "-("; |
|||
expression.getOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case UnaryNumericalFunctionExpression::OperatorType::Floor: |
|||
stream << "floor("; |
|||
expression.getOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
case UnaryNumericalFunctionExpression::OperatorType::Ceil: |
|||
stream << "ceil("; |
|||
expression.getOperand()->accept(*this, data); |
|||
stream << ")"; |
|||
break; |
|||
} |
|||
return boost::any(); |
|||
} |
|||
|
|||
boost::any ToDiceStringVisitor::visit(BooleanLiteralExpression const& expression, boost::any const&) { |
|||
stream << (expression.getValue() ? " true " : " false "); |
|||
return boost::any(); |
|||
} |
|||
|
|||
boost::any ToDiceStringVisitor::visit(IntegerLiteralExpression const& expression, boost::any const&) { |
|||
stream << "int(" << nrBits << "," << expression.getValue() << ")"; |
|||
return boost::any(); |
|||
} |
|||
|
|||
boost::any ToDiceStringVisitor::visit(RationalLiteralExpression const& expression, boost::any const&) { |
|||
stream << std::scientific << std::setprecision(std::numeric_limits<double>::max_digits10) << "(" << expression.getValueAsDouble() << ")"; |
|||
return boost::any(); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,35 @@ |
|||
#pragma once |
|||
|
|||
#include <sstream> |
|||
|
|||
#include "storm/storage/expressions/Expression.h" |
|||
#include "storm/storage/expressions/Expressions.h" |
|||
#include "storm/storage/expressions/ExpressionVisitor.h" |
|||
|
|||
namespace storm { |
|||
namespace expressions { |
|||
class ToDiceStringVisitor : public ExpressionVisitor { |
|||
public: |
|||
ToDiceStringVisitor(uint64 nrBits); |
|||
|
|||
std::string toString(Expression const& expression); |
|||
std::string toString(BaseExpression const* expression); |
|||
|
|||
virtual boost::any visit(IfThenElseExpression const& expression, boost::any const& data) override; |
|||
virtual boost::any visit(BinaryBooleanFunctionExpression const& expression, boost::any const& data) override; |
|||
virtual boost::any visit(BinaryNumericalFunctionExpression const& expression, boost::any const& data) override; |
|||
virtual boost::any visit(BinaryRelationExpression const& expression, boost::any const& data) override; |
|||
virtual boost::any visit(VariableExpression const& expression, boost::any const& data) override; |
|||
virtual boost::any visit(UnaryBooleanFunctionExpression const& expression, boost::any const& data) override; |
|||
virtual boost::any visit(UnaryNumericalFunctionExpression const& expression, boost::any const& data) override; |
|||
virtual boost::any visit(BooleanLiteralExpression const& expression, boost::any const& data) override; |
|||
virtual boost::any visit(IntegerLiteralExpression const& expression, boost::any const& data) override; |
|||
virtual boost::any visit(RationalLiteralExpression const& expression, boost::any const& data) override; |
|||
|
|||
private: |
|||
std::stringstream stream; |
|||
uint64_t nrBits; |
|||
}; |
|||
} |
|||
} |
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue