|
|
@ -35,7 +35,15 @@ namespace parser { |
|
|
|
template<typename Iterator, typename Skipper> |
|
|
|
struct PrctlParser::PrctlGrammar : qi::grammar<Iterator, storm::property::prctl::AbstractPrctlFormula<double>*(), Skipper > { |
|
|
|
PrctlGrammar() : PrctlGrammar::base_type(start) { |
|
|
|
|
|
|
|
//This block contains helper rules that may be used several times
|
|
|
|
freeIdentifierName = qi::lexeme[+(qi::alpha | qi::char_('_'))]; |
|
|
|
comparisonType = ( |
|
|
|
(qi::lit(">="))[qi::_val = storm::property::GREATER_EQUAL] | |
|
|
|
(qi::lit(">"))[qi::_val = storm::property::GREATER] | |
|
|
|
(qi::lit("<="))[qi::_val = storm::property::LESS_EQUAL] | |
|
|
|
(qi::lit("<"))[qi::_val = storm::property::LESS]); |
|
|
|
comment = qi::lit("//") |
|
|
|
|
|
|
|
//This block defines rules for parsing state formulas
|
|
|
|
stateFormula %= orFormula; |
|
|
@ -58,44 +66,47 @@ struct PrctlParser::PrctlGrammar : qi::grammar<Iterator, storm::property::prctl: |
|
|
|
phoenix::new_<storm::property::prctl::Ap<double>>(qi::_1)]; |
|
|
|
atomicProposition.name("state formula"); |
|
|
|
probabilisticBoundOperator = ( |
|
|
|
(qi::lit("P") >> qi::lit(">") >> qi::double_ > qi::lit("[") > pathFormula > qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::ProbabilisticBoundOperator<double> >(storm::property::GREATER, qi::_1, qi::_2)] | |
|
|
|
(qi::lit("P") >> qi::lit(">=") > qi::double_ > qi::lit("[") > pathFormula > qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::ProbabilisticBoundOperator<double> >(storm::property::GREATER_EQUAL, qi::_1, qi::_2)] | |
|
|
|
(qi::lit("P") >> qi::lit("<") >> qi::double_ > qi::lit("[") > pathFormula > qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::ProbabilisticBoundOperator<double> >(storm::property::LESS, qi::_1, qi::_2)] | |
|
|
|
(qi::lit("P") >> qi::lit("<=") > qi::double_ > qi::lit("[") > pathFormula > qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::ProbabilisticBoundOperator<double> >(storm::property::LESS_EQUAL, qi::_1, qi::_2)] |
|
|
|
(qi::lit("P") >> qi::lit("min") > comparisonType > qi::double_ > qi::lit("[") > pathFormula > qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::ProbabilisticBoundOperator<double> >(qi::_1, qi::_2, qi::_3, true)] | |
|
|
|
(qi::lit("P") >> qi::lit("max") > comparisonType > qi::double_ > qi::lit("[") > pathFormula > qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::ProbabilisticBoundOperator<double> >(qi::_1, qi::_2, qi::_3, false)] | |
|
|
|
(qi::lit("P") > comparisonType > qi::double_ > qi::lit("[") > pathFormula > qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::ProbabilisticBoundOperator<double> >(qi::_1, qi::_2, qi::_3)] |
|
|
|
); |
|
|
|
|
|
|
|
probabilisticBoundOperator.name("state formula"); |
|
|
|
rewardBoundOperator = ( |
|
|
|
(qi::lit("R") >> qi::lit(">") >> qi::double_ >> qi::lit("[") >> rewardPathFormula >> qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::RewardBoundOperator<double> >(storm::property::GREATER, qi::_1, qi::_2)] | |
|
|
|
(qi::lit("R") >> qi::lit(">=") >> qi::double_ >> qi::lit("[") >> rewardPathFormula >> qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::RewardBoundOperator<double> >(storm::property::GREATER_EQUAL, qi::_1, qi::_2)] | |
|
|
|
(qi::lit("R") >> qi::lit("<") >> qi::double_ >> qi::lit("[") >> rewardPathFormula >> qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::RewardBoundOperator<double> >(storm::property::LESS, qi::_1, qi::_2)] | |
|
|
|
(qi::lit("R") >> qi::lit("<=")>> qi::double_ >> qi::lit("[") >> rewardPathFormula >> qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::RewardBoundOperator<double> >(storm::property::LESS_EQUAL, qi::_1, qi::_2)] |
|
|
|
(qi::lit("R") >> qi::lit("min") > comparisonType > qi::double_ > qi::lit("[") > rewardPathFormula > qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::RewardBoundOperator<double> >(qi::_1, qi::_2, qi::_3, true)] | |
|
|
|
(qi::lit("R") >> qi::lit("max") > comparisonType > qi::double_ > qi::lit("[") > rewardPathFormula > qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::RewardBoundOperator<double> >(qi::_1, qi::_2, qi::_3, false)] | |
|
|
|
(qi::lit("R") >> comparisonType > qi::double_ > qi::lit("[") > rewardPathFormula > qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::RewardBoundOperator<double> >(qi::_1, qi::_2, qi::_3)] |
|
|
|
); |
|
|
|
rewardBoundOperator.name("state formula"); |
|
|
|
|
|
|
|
//This block defines rules for parsing formulas with noBoundOperators
|
|
|
|
noBoundOperator = (probabilisticNoBoundOperator | rewardNoBoundOperator); |
|
|
|
noBoundOperator.name("no bound operator"); |
|
|
|
probabilisticNoBoundOperator = (probabilisticMinimumNoBoundOperator | probabilisticMaximumNoBoundOperator | probabilisticDeterministicNoBoundOperator); |
|
|
|
|
|
|
|
probabilisticMinimumNoBoundOperator = (qi::lit("P") >> qi::lit("min") >> qi::lit("=") >> qi::lit("?") > qi::lit("[") > pathFormula > qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::ProbabilisticNoBoundOperator<double> >(qi::_1, true)]; |
|
|
|
probabilisticNoBoundOperator = ( |
|
|
|
(qi::lit("P") >> qi::lit("min") >> qi::lit("=") >> qi::lit("?") >> qi::lit("[") >> pathFormula >> qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::ProbabilisticNoBoundOperator<double> >(qi::_1, true)] | |
|
|
|
(qi::lit("P") >> qi::lit("max") >> qi::lit("=") >> qi::lit("?") >> qi::lit("[") >> pathFormula >> qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::ProbabilisticNoBoundOperator<double> >(qi::_1, false)] | |
|
|
|
(qi::lit("P") >> qi::lit("=") >> qi::lit("?") > qi::lit("[") > pathFormula > qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::ProbabilisticNoBoundOperator<double> >(qi::_1)] |
|
|
|
); |
|
|
|
probabilisticNoBoundOperator.name("no bound operator"); |
|
|
|
|
|
|
|
probabilisticMaximumNoBoundOperator = (qi::lit("P") >> qi::lit("max") >> qi::lit("=") >> qi::lit("?") > qi::lit("[") > pathFormula > qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::ProbabilisticNoBoundOperator<double> >(qi::_1, false)]; |
|
|
|
rewardNoBoundOperator = ( |
|
|
|
(qi::lit("R") >> qi::lit("min") >> qi::lit("=") >> qi::lit("?") >> qi::lit("[") >> rewardPathFormula >> qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::RewardNoBoundOperator<double> >(qi::_1, true)] | |
|
|
|
(qi::lit("R") >> qi::lit("max") >> qi::lit("=") >> qi::lit("?") >> qi::lit("[") >> rewardPathFormula >> qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::RewardNoBoundOperator<double> >(qi::_1, false)] | |
|
|
|
(qi::lit("R") >> qi::lit("=") >> qi::lit("?") >> qi::lit("[") >> rewardPathFormula >> qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::RewardNoBoundOperator<double> >(qi::_1)] |
|
|
|
|
|
|
|
probabilisticDeterministicNoBoundOperator = (qi::lit("P") >> qi::lit("=") >> qi::lit("?") > qi::lit("[") > pathFormula > qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::ProbabilisticNoBoundOperator<double> >(qi::_1)]; |
|
|
|
probabilisticNoBoundOperator.name("no bound operator"); |
|
|
|
rewardNoBoundOperator = (qi::lit("R") >> qi::lit("=") >> qi::lit("?") >> qi::lit("[") >> rewardPathFormula >> qi::lit("]"))[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::RewardNoBoundOperator<double> >(qi::_1)]; |
|
|
|
); |
|
|
|
rewardNoBoundOperator.name("no bound operator"); |
|
|
|
|
|
|
|
//This block defines rules for parsing probabilistic path formulas
|
|
|
@ -103,19 +114,19 @@ struct PrctlParser::PrctlGrammar : qi::grammar<Iterator, storm::property::prctl: |
|
|
|
pathFormula.name("path formula"); |
|
|
|
boundedEventually = (qi::lit("F") >> qi::lit("<=") > qi::int_ > stateFormula)[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::BoundedEventually<double>>(qi::_2, qi::_1)]; |
|
|
|
boundedEventually.name("path formula (for probablistic operator)"); |
|
|
|
boundedEventually.name("path formula (for probabilistic operator)"); |
|
|
|
eventually = (qi::lit("F") > stateFormula)[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::Eventually<double> >(qi::_1)]; |
|
|
|
eventually.name("path formula (for probablistic operator)"); |
|
|
|
eventually.name("path formula (for probabilistic operator)"); |
|
|
|
globally = (qi::lit("G") > stateFormula)[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::Globally<double> >(qi::_1)]; |
|
|
|
globally.name("path formula (for probablistic operator)"); |
|
|
|
globally.name("path formula (for probabilistic operator)"); |
|
|
|
boundedUntil = (stateFormula[qi::_a = phoenix::construct<std::shared_ptr<storm::property::prctl::AbstractStateFormula<double>>>(qi::_1)] >> qi::lit("U") >> qi::lit("<=") > qi::int_ > stateFormula) |
|
|
|
[qi::_val = phoenix::new_<storm::property::prctl::BoundedUntil<double>>(phoenix::bind(&storm::property::prctl::AbstractStateFormula<double>::clone, phoenix::bind(&std::shared_ptr<storm::property::prctl::AbstractStateFormula<double>>::get, qi::_a)), qi::_3, qi::_2)]; |
|
|
|
boundedUntil.name("path formula (for probablistic operator)"); |
|
|
|
boundedUntil.name("path formula (for probabilistic operator)"); |
|
|
|
until = (stateFormula[qi::_a = phoenix::construct<std::shared_ptr<storm::property::prctl::AbstractStateFormula<double>>>(qi::_1)] >> qi::lit("U") > stateFormula)[qi::_val = |
|
|
|
phoenix::new_<storm::property::prctl::Until<double>>(phoenix::bind(&storm::property::prctl::AbstractStateFormula<double>::clone, phoenix::bind(&std::shared_ptr<storm::property::prctl::AbstractStateFormula<double>>::get, qi::_a)), qi::_2)]; |
|
|
|
until.name("path formula (for probablistic operator)"); |
|
|
|
until.name("path formula (for probabilistic operator)"); |
|
|
|
|
|
|
|
//This block defines rules for parsing reward path formulas
|
|
|
|
rewardPathFormula = (cumulativeReward | reachabilityReward | instantaneousReward | steadyStateReward); |
|
|
@ -131,11 +142,12 @@ struct PrctlParser::PrctlGrammar : qi::grammar<Iterator, storm::property::prctl: |
|
|
|
instantaneousReward.name("path formula (for reward operator)"); |
|
|
|
steadyStateReward = (qi::lit("S"))[qi::_val = phoenix::new_<storm::property::prctl::SteadyStateReward<double>>()]; |
|
|
|
|
|
|
|
start = (noBoundOperator | stateFormula); |
|
|
|
start = (comment | noBoundOperator | stateFormula | qi::eps[qi::error()]); |
|
|
|
start.name("PRCTL formula"); |
|
|
|
} |
|
|
|
|
|
|
|
qi::rule<Iterator, storm::property::prctl::AbstractPrctlFormula<double>*(), Skipper> start; |
|
|
|
qi::rule<Iterator, storm::property::prctl::AbstractPrctlFormula<double>*(), Skipper> comment; |
|
|
|
|
|
|
|
qi::rule<Iterator, storm::property::prctl::AbstractStateFormula<double>*(), Skipper> stateFormula; |
|
|
|
qi::rule<Iterator, storm::property::prctl::AbstractStateFormula<double>*(), Skipper> atomicStateFormula; |
|
|
@ -149,9 +161,6 @@ struct PrctlParser::PrctlGrammar : qi::grammar<Iterator, storm::property::prctl: |
|
|
|
|
|
|
|
qi::rule<Iterator, storm::property::prctl::AbstractNoBoundOperator<double>*(), Skipper> noBoundOperator; |
|
|
|
qi::rule<Iterator, storm::property::prctl::AbstractNoBoundOperator<double>*(), Skipper> probabilisticNoBoundOperator; |
|
|
|
qi::rule<Iterator, storm::property::prctl::AbstractNoBoundOperator<double>*(), Skipper> probabilisticMinimumNoBoundOperator; |
|
|
|
qi::rule<Iterator, storm::property::prctl::AbstractNoBoundOperator<double>*(), Skipper> probabilisticMaximumNoBoundOperator; |
|
|
|
qi::rule<Iterator, storm::property::prctl::AbstractNoBoundOperator<double>*(), Skipper> probabilisticDeterministicNoBoundOperator; |
|
|
|
qi::rule<Iterator, storm::property::prctl::AbstractNoBoundOperator<double>*(), Skipper> rewardNoBoundOperator; |
|
|
|
|
|
|
|
qi::rule<Iterator, storm::property::prctl::AbstractPathFormula<double>*(), Skipper> pathFormula; |
|
|
@ -169,6 +178,7 @@ struct PrctlParser::PrctlGrammar : qi::grammar<Iterator, storm::property::prctl: |
|
|
|
|
|
|
|
|
|
|
|
qi::rule<Iterator, std::string(), Skipper> freeIdentifierName; |
|
|
|
qi::rule<Iterator, storm::property::ComparisonType(), Skipper> comparisonType; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
@ -221,7 +231,7 @@ storm::parser::PrctlParser::PrctlParser(std::string formulaString) { |
|
|
|
// The syntax can be so wrong that no rule can be matched at all
|
|
|
|
// In that case, no expectation failure is thrown, but the parser just returns nullptr
|
|
|
|
// Then, of course the result is not usable, hence we throw a WrongFormatException, too.
|
|
|
|
if (result_pointer == nullptr) { |
|
|
|
if (positionIteratorBegin != formulaString.end()) { |
|
|
|
throw storm::exceptions::WrongFormatException() << "Syntax error in formula"; |
|
|
|
} |
|
|
|
|
|
|
|