@ -1,6 +1,8 @@
# include "FormulaParserGrammar.h"
# include "storm/storage/expressions/ExpressionManager.h"
# include <memory>
namespace storm {
namespace parser {
@ -73,8 +75,17 @@ namespace storm {
untilFormula = pathFormulaWithoutUntil ( qi : : _r1 ) [ qi : : _val = qi : : _1 ] > > * ( qi : : lit ( " U " ) > > ( - timeBounds ) > > pathFormulaWithoutUntil ( qi : : _r1 ) ) [ qi : : _val = phoenix : : bind ( & FormulaParserGrammar : : createUntilFormula , phoenix : : ref ( * this ) , qi : : _val , qi : : _1 , qi : : _2 ) ] ;
untilFormula . name ( " until formula " ) ;
conditionalFormula = untilFormula ( qi : : _r1 ) [ qi : : _val = qi : : _1 ] > > * ( qi : : lit ( " || " ) > > untilFormula ( storm : : logic : : FormulaContext : : Probability ) ) [ qi : : _val = phoenix : : bind ( & FormulaParserGrammar : : createConditionalFormula , phoenix : : ref ( * this ) , qi : : _val , qi : : _1 , qi : : _r1 ) ] ;
hoaPathFormula = qi : : lit ( " HOA: " ) > qi : : lit ( " { " )
> quotedString [ qi : : _val = phoenix : : bind ( & FormulaParserGrammar : : createHOAPathFormula , phoenix : : ref ( * this ) , qi : : _1 ) ]
> > * ( qi : : lit ( " , " ) > quotedString > qi : : lit ( " -> " ) > stateFormula ) [ phoenix : : bind ( & FormulaParserGrammar : : addHoaAPMapping , phoenix : : ref ( * this ) , * qi : : _val , qi : : _1 , qi : : _2 ) ]
> qi : : lit ( " } " ) ;
basicPathFormula = ( hoaPathFormula ( qi : : _r1 ) [ qi : : _val = qi : : _1 ] ) | untilFormula ( qi : : _r1 ) [ qi : : _val = qi : : _1 ] ;
basicPathFormula . name ( " basic path formula " ) ;
conditionalFormula = basicPathFormula ( qi : : _r1 ) [ qi : : _val = qi : : _1 ] > > * ( qi : : lit ( " || " ) > > basicPathFormula ( storm : : logic : : FormulaContext : : Probability ) ) [ qi : : _val = phoenix : : bind ( & FormulaParserGrammar : : createConditionalFormula , phoenix : : ref ( * this ) , qi : : _val , qi : : _1 , qi : : _r1 ) ] ;
conditionalFormula . name ( " conditional formula " ) ;
timeBoundReference = ( - qi : : lit ( " rew " ) > > rewardModelName ) [ qi : : _val = phoenix : : bind ( & FormulaParserGrammar : : createTimeBoundReference , phoenix : : ref ( * this ) , storm : : logic : : TimeBoundType : : Reward , qi : : _1 ) ]
@ -159,6 +170,9 @@ namespace storm {
stateFormula = ( orStateFormula | multiFormula | quantileFormula | gameFormula ) ;
stateFormula . name ( " state formula " ) ;
quotedString % = qi : : as_string [ qi : : lexeme [ qi : : omit [ qi : : char_ ( ' " ' ) ] > qi : : raw [ * ( ! qi : : char_ ( ' " ' ) > > qi : : char_ ) ] > qi : : omit [ qi : : lit ( ' " ' ) ] ] ] ;
quotedString . name ( " quoted string " ) ;
formulaName = qi : : lit ( " \" " ) > > identifier > > qi : : lit ( " \" " ) > > qi : : lit ( " : " ) ;
formulaName . name ( " formula name " ) ;
@ -221,6 +235,8 @@ namespace storm {
qi : : on_error < qi : : fail > ( pathFormula , handler ( qi : : _1 , qi : : _2 , qi : : _3 , qi : : _4 ) ) ;
qi : : on_error < qi : : fail > ( conditionalFormula , handler ( qi : : _1 , qi : : _2 , qi : : _3 , qi : : _4 ) ) ;
qi : : on_error < qi : : fail > ( untilFormula , handler ( qi : : _1 , qi : : _2 , qi : : _3 , qi : : _4 ) ) ;
qi : : on_error < qi : : fail > ( hoaPathFormula , handler ( qi : : _1 , qi : : _2 , qi : : _3 , qi : : _4 ) ) ;
qi : : on_error < qi : : fail > ( basicPathFormula , handler ( qi : : _1 , qi : : _2 , qi : : _3 , qi : : _4 ) ) ;
qi : : on_error < qi : : fail > ( nextFormula , handler ( qi : : _1 , qi : : _2 , qi : : _3 , qi : : _4 ) ) ;
qi : : on_error < qi : : fail > ( globallyFormula , handler ( qi : : _1 , qi : : _2 , qi : : _3 , qi : : _4 ) ) ;
qi : : on_error < qi : : fail > ( eventuallyFormula , handler ( qi : : _1 , qi : : _2 , qi : : _3 , qi : : _4 ) ) ;
@ -377,6 +393,17 @@ namespace storm {
}
}
std : : shared_ptr < storm : : logic : : Formula const > FormulaParserGrammar : : createHOAPathFormula ( std : : string const & automatonFile ) const {
return std : : shared_ptr < storm : : logic : : Formula const > ( new storm : : logic : : HOAPathFormula ( automatonFile ) ) ;
}
void FormulaParserGrammar : : addHoaAPMapping ( storm : : logic : : Formula const & hoaFormula , const std : : string & ap , std : : shared_ptr < storm : : logic : : Formula const > & expression ) const {
// taking a const Formula reference and doing static_ and const_cast from Formula to allow non-const access to
// qi::_val of the hoaPathFormula rule
storm : : logic : : HOAPathFormula & hoaFormula_ = static_cast < storm : : logic : : HOAPathFormula & > ( const_cast < storm : : logic : : Formula & > ( hoaFormula ) ) ;
hoaFormula_ . addAPMapping ( ap , expression ) ;
}
std : : shared_ptr < storm : : logic : : Formula const > FormulaParserGrammar : : createConditionalFormula ( std : : shared_ptr < storm : : logic : : Formula const > const & leftSubformula , std : : shared_ptr < storm : : logic : : Formula const > const & rightSubformula , storm : : logic : : FormulaContext context ) const {
return std : : shared_ptr < storm : : logic : : Formula const > ( new storm : : logic : : ConditionalFormula ( leftSubformula , rightSubformula , context ) ) ;
}