@ -30,6 +30,10 @@ namespace qi = boost::spirit::qi;
namespace ascii = boost : : spirit : : ascii ;
namespace phoenix = boost : : phoenix ;
typedef std : : istreambuf_iterator < char > base_iterator_type ;
typedef boost : : spirit : : multi_pass < base_iterator_type > forward_iterator_type ;
typedef boost : : spirit : : classic : : position_iterator2 < forward_iterator_type > pos_iterator_type ;
class PrismParser {
public :
@ -40,14 +44,11 @@ public:
}
void getProgram ( std : : istream & inputStream , std : : string const & fileName ) {
typedef std : : istreambuf_iterator < char > base_iterator_type ;
base_iterator_type in_begin ( inputStream ) ;
typedef boost : : spirit : : multi_pass < base_iterator_type > forward_iterator_type ;
forward_iterator_type fwd_begin = boost : : spirit : : make_default_multi_pass ( in_begin ) ;
forward_iterator_type fwd_end ;
typedef boost : : spirit : : classic : : position_iterator2 < forward_iterator_type > pos_iterator_type ;
pos_iterator_type position_begin ( fwd_begin , fwd_end , fileName ) ;
pos_iterator_type position_end ;
@ -58,8 +59,17 @@ public:
} catch ( const qi : : expectation_failure < pos_iterator_type > & e ) {
const boost : : spirit : : classic : : file_position_base < std : : string > & pos = e . first . get_position ( ) ;
std : : stringstream msg ;
msg < < " parse error at file ' " < < pos . file < < " ' line " < < pos . line < < " column " < < pos . column < < std : : endl < < " ' " < < e . first . get_currentline ( ) < < " ' " < < std : : endl < < std : : setw ( pos . column + 1 ) < < " " < < " ^------- here " ;
std : : cout < < msg . str ( ) < < std : : endl ;
msg < < pos . file < < " , line " < < pos . line < < " , column " < < pos . column < < " : parse error: expected " < < e . what_ < < std : : endl < < " \t " < < e . first . get_currentline ( ) < < std : : endl < < " \t " ;
int i = 0 ;
for ( i = 0 ; i < pos . column ; + + i ) {
msg < < " - " ;
}
msg < < " ^ " ;
for ( ; i < 80 ; + + i ) {
msg < < " - " ;
}
msg < < std : : endl ;
std : : cout < < msg . str ( ) ;
throw storm : : exceptions : : WrongFileFormatException ( ) < < msg . str ( ) ;
}
@ -68,104 +78,174 @@ public:
private :
template < typename Iterator , typename Skipper >
struct prismGrammar : qi : : grammar < Iterator , storm : : ir : : Program ( ) , qi : : locals < std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : BooleanConstantExpression > > , std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : IntegerConstantExpression > > , std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : DoubleConstantExpression > > , std : : map < std : : string , storm : : ir : : RewardModel > > , Skipper > {
struct prismGrammar : qi : : grammar < Iterator , storm : : ir : : Program ( ) , qi : : locals < std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : BooleanConstantExpression > > , std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : IntegerConstantExpression > > , std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : DoubleConstantExpression > > , std : : map < std : : string , storm : : ir : : RewardModel > , std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > > , Skipper > {
prismGrammar ( ) : prismGrammar : : base_type ( start ) {
freeIdentifierName % = qi : : lexeme [ qi : : alpha > > * ( qi : : alnum | qi : : char_ ( ' _ ' ) ) ] - allVariables_ - allConstants_ ;
freeIdentifierName % = qi : : raw [ qi : : lexeme [ ( ( qi : : alpha | qi : : char_ ( ' _ ' ) ) > > * ( qi : : alnum | qi : : char_ ( ' _ ' ) ) ) - booleanVariables_ - integerVariables_ - allConstants_ ] ] ;
freeIdentifierName . name ( " unused identifier " ) ;
booleanLiteralExpression = qi : : bool_ [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BooleanLiteral > ( qi : : _1 ) ) ] ;
booleanLiteralExpression . name ( " boolean literal " ) ;
integerLiteralExpression = qi : : int_ [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : IntegerLiteral > ( qi : : _1 ) ) ] ;
integerLiteralExpression . name ( " integer literal " ) ;
doubleLiteralExpression = qi : : double_ [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : DoubleLiteral > ( qi : : _1 ) ) ] ;
doubleLiteralExpression . name ( " double literal " ) ;
literalExpression % = ( booleanLiteralExpression | integerLiteralExpression | doubleLiteralExpression ) ;
literalExpression . name ( " literal " ) ;
integerVariableExpression = integerVariables_ ;
booleanVariableExpression = booleanVariables_ ;
variableExpression = ( integerVariableExpression | booleanVariableExpression ) ;
integerVariableExpression % = integerVariables_ ;
integerVariableExpression . name ( " integer variable " ) ;
booleanVariableExpression % = booleanVariables_ ;
booleanVariableExpression . name ( " boolean variable " ) ;
variableExpression % = ( integerVariableExpression | booleanVariableExpression ) ;
variableExpression . name ( " variable " ) ;
booleanConstantExpression % = ( booleanConstants_ | booleanLiteralExpression ) ;
booleanConstantExpression . name ( " boolean constant or literal " ) ;
integerConstantExpression % = ( integerConstants_ | integerLiteralExpression ) ;
integerConstantExpression . name ( " integer constant or literal " ) ;
doubleConstantExpression % = ( doubleConstants_ | doubleLiteralExpression ) ;
doubleConstantExpression . name ( " double constant or literal " ) ;
constantExpression % = ( booleanConstantExpression | integerConstantExpression | doubleConstantExpression ) ;
constantExpression . name ( " constant or literal " ) ;
atomicIntegerExpression % = ( integerVariableExpression | qi : : lit ( " ( " ) > > integerExpression > > qi : : lit ( " ) " ) | integerConstantExpression ) ;
atomicIntegerExpression . name ( " integer expression " ) ;
integerMultExpression % = atomicIntegerExpression [ qi : : _val = qi : : _1 ] > > * ( qi : : lit ( " * " ) > > atomicIntegerExpression ) [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BinaryNumericalFunctionExpression > ( qi : : _val , qi : : _1 , storm : : ir : : expressions : : BinaryNumericalFunctionExpression : : TIMES ) ) ] ;
integerMultExpression . name ( " integer expression " ) ;
integerPlusExpression = integerMultExpression [ qi : : _val = qi : : _1 ] > > * ( qi : : lit ( " + " ) > > integerMultExpression ) [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BinaryNumericalFunctionExpression > ( qi : : _val , qi : : _1 , storm : : ir : : expressions : : BinaryNumericalFunctionExpression : : PLUS ) ) ] ;
integerPlusExpression . name ( " integer expression " ) ;
integerExpression % = integerPlusExpression ;
integerExpression . name ( " integer expression " ) ;
constantAtomicIntegerExpression % = ( qi : : lit ( " ( " ) > > constantIntegerExpression > > qi : : lit ( " ) " ) | integerConstantExpression ) ;
constantAtomicIntegerExpression . name ( " constant integer expression " ) ;
constantIntegerMultExpression % = constantAtomicIntegerExpression [ qi : : _val = qi : : _1 ] > > * ( qi : : lit ( " * " ) > > constantAtomicIntegerExpression ) [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BinaryNumericalFunctionExpression > ( qi : : _val , qi : : _1 , storm : : ir : : expressions : : BinaryNumericalFunctionExpression : : TIMES ) ) ] ;
constantIntegerMultExpression . name ( " constant integer expression " ) ;
constantIntegerPlusExpression = constantIntegerMultExpression [ qi : : _val = qi : : _1 ] > > * ( qi : : lit ( " + " ) > > constantIntegerMultExpression ) [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BinaryNumericalFunctionExpression > ( qi : : _val , qi : : _1 , storm : : ir : : expressions : : BinaryNumericalFunctionExpression : : PLUS ) ) ] ;
constantIntegerPlusExpression . name ( " constant integer expression " ) ;
constantIntegerExpression % = constantIntegerPlusExpression ;
constantIntegerExpression . name ( " constant integer expression " ) ;
/ / This block defines all expressions of type double that are by syntax constant . That is , they are evaluable given the values for all constants .
constantAtomicDoubleExpression % = ( qi : : lit ( " ( " ) > > constantDoubleExpression > > qi : : lit ( " ) " ) | doubleConstantExpression ) ;
constantAtomicDoubleExpression . name ( " constant double expression " ) ;
constantDoubleMultExpression % = constantAtomicDoubleExpression [ qi : : _val = qi : : _1 ] > > * ( qi : : lit ( " * " ) > > constantAtomicDoubleExpression ) [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BinaryNumericalFunctionExpression > ( qi : : _val , qi : : _1 , storm : : ir : : expressions : : BinaryNumericalFunctionExpression : : TIMES ) ) ] ;
constantDoubleMultExpression . name ( " constant double expression " ) ;
constantDoublePlusExpression % = constantDoubleMultExpression [ qi : : _val = qi : : _1 ] > > * ( qi : : lit ( " + " ) > > constantDoubleMultExpression ) [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BinaryNumericalFunctionExpression > ( qi : : _val , qi : : _1 , storm : : ir : : expressions : : BinaryNumericalFunctionExpression : : PLUS ) ) ] ;
constantDoublePlusExpression . name ( " constant double expression " ) ;
constantDoubleExpression % = constantDoublePlusExpression ;
constantDoubleExpression . name ( " constant double expression " ) ;
/ / This block defines all expressions of type boolean .
relativeExpression = ( integerExpression > > relations_ > > integerExpression ) [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BinaryRelationExpression > ( qi : : _1 , qi : : _3 , qi : : _2 ) ) ] ;
relativeExpression . name ( " boolean expression " ) ;
atomicBooleanExpression % = ( relativeExpression | booleanVariableExpression | qi : : lit ( " ( " ) > > booleanExpression > > qi : : lit ( " ) " ) | booleanConstantExpression ) ;
atomicBooleanExpression . name ( " boolean expression " ) ;
notExpression = atomicBooleanExpression [ qi : : _val = qi : : _1 ] | ( qi : : lit ( " ! " ) > > atomicBooleanExpression ) [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : UnaryBooleanFunctionExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : UnaryBooleanFunctionExpression > ( qi : : _1 , storm : : ir : : expressions : : UnaryBooleanFunctionExpression : : FunctorType : : NOT ) ) ] ;
notExpression . name ( " boolean expression " ) ;
andExpression = notExpression [ qi : : _val = qi : : _1 ] > > * ( qi : : lit ( " & " ) > > notExpression ) [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BinaryBooleanFunctionExpression > ( qi : : _val , qi : : _1 , storm : : ir : : expressions : : BinaryBooleanFunctionExpression : : AND ) ) ] ;
andExpression . name ( " boolean expression " ) ;
orExpression = andExpression [ qi : : _val = qi : : _1 ] > > * ( qi : : lit ( " | " ) > > andExpression ) [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BinaryBooleanFunctionExpression > ( qi : : _val , qi : : _1 , storm : : ir : : expressions : : BinaryBooleanFunctionExpression : : OR ) ) ] ;
orExpression . name ( " boolean expression " ) ;
booleanExpression % = orExpression ;
booleanExpression . name ( " boolean expression " ) ;
/ / This block defines all expressions of type boolean that are by syntax constant . That is , they are evaluable given the values for all constants .
constantRelativeExpression = ( constantIntegerExpression > > relations_ > > constantIntegerExpression ) [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BinaryRelationExpression > ( qi : : _1 , qi : : _3 , qi : : _2 ) ) ] ;
constantRelativeExpression . name ( " constant boolean expression " ) ;
constantAtomicBooleanExpression % = ( constantRelativeExpression | qi : : lit ( " ( " ) > > constantBooleanExpression > > qi : : lit ( " ) " ) | booleanLiteralExpression | booleanConstantExpression ) ;
constantAtomicBooleanExpression . name ( " constant boolean expression " ) ;
constantNotExpression = constantAtomicBooleanExpression [ qi : : _val = qi : : _1 ] | ( qi : : lit ( " ! " ) > > constantAtomicBooleanExpression ) [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : UnaryBooleanFunctionExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : UnaryBooleanFunctionExpression > ( qi : : _1 , storm : : ir : : expressions : : UnaryBooleanFunctionExpression : : FunctorType : : NOT ) ) ] ;
constantNotExpression . name ( " constant boolean expression " ) ;
constantAndExpression = constantNotExpression [ qi : : _val = qi : : _1 ] > > * ( qi : : lit ( " & " ) > > constantNotExpression ) [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BinaryBooleanFunctionExpression > ( qi : : _val , qi : : _1 , storm : : ir : : expressions : : BinaryBooleanFunctionExpression : : AND ) ) ] ;
constantAndExpression . name ( " constant boolean expression " ) ;
constantOrExpression = constantAndExpression [ qi : : _val = qi : : _1 ] > > * ( qi : : lit ( " | " ) > > constantAndExpression ) [ qi : : _val = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BinaryBooleanFunctionExpression > ( qi : : _val , qi : : _1 , storm : : ir : : expressions : : BinaryBooleanFunctionExpression : : OR ) ) ] ;
constantOrExpression . name ( " constant boolean expression " ) ;
constantBooleanExpression % = constantOrExpression ;
constantBooleanExpression . name ( " constant boolean expression " ) ;
/ / This block defines the general root of all expressions . Most of the time , however , you may want to start with a more specialized rule .
expression % = ( booleanExpression | integerExpression | constantDoubleExpression ) ;
expression . name ( " expression " ) ;
/ / This block defines all entities that are needed for parsing labels .
labelDefinition = ( qi : : lit ( " label " ) > > freeIdentifierName > > qi : : lit ( " = " ) > > booleanExpression > > qi : : lit ( " ; " ) ) [ phoenix : : insert ( qi : : _r1 , phoenix : : construct < std : : pair < std : : string , std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > > ( qi : : _1 , qi : : _2 ) ) ] ;
labelDefinitionList % = * labelDefinition ( qi : : _r1 ) ;
/ / This block defines all entities that are needed for parsing a reward model .
stateRewardDefinition = ( booleanExpression > qi : : lit ( " : " ) > constantDoubleExpression > > qi : : lit ( " ; " ) ) [ qi : : _val = phoenix : : construct < storm : : ir : : StateReward > ( qi : : _1 , qi : : _2 ) ] ;
stateRewardDefinition . name ( " state reward definition " ) ;
transitionRewardDefinition = ( qi : : lit ( " [ " ) > - ( commandName [ qi : : _a = qi : : _1 ] ) > qi : : lit ( " ] " ) > booleanExpression > qi : : lit ( " : " ) > constantDoubleExpression > qi : : lit ( " ; " ) ) [ qi : : _val = phoenix : : construct < storm : : ir : : TransitionReward > ( qi : : _a , qi : : _2 , qi : : _3 ) ] ;
rewardDefinition = ( qi : : lit ( " rewards " ) > qi : : lit ( " \" " ) > freeIdentifierName > qi : : lit ( " \" " ) > + ( stateRewardDefinition [ phoenix : : push_back ( qi : : _a , qi : : _1 ) ] | transitionRewardDefinition [ phoenix : : push_back ( qi : : _b , qi : : _1 ) ] ) > qi : : lit ( " endrewards " ) ) [ phoenix : : insert ( qi : : _r1 , phoenix : : construct < std : : pair < std : : string , storm : : ir : : RewardModel > > ( qi : : _1 , phoenix : : construct < storm : : ir : : RewardModel > ( qi : : _1 , qi : : _a , qi : : _b ) ) ) ] ;
transitionRewardDefinition . name ( " transition reward definition " ) ;
rewardDefinition = ( qi : : lit ( " rewards " ) > qi : : lit ( " \" " ) > freeIdentifierName > qi : : lit ( " \" " ) > + ( stateRewardDefinition [ phoenix : : push_back ( qi : : _a , qi : : _1 ) ] | transitionRewardDefinition [ phoenix : : push_back ( qi : : _b , qi : : _1 ) ] ) > > qi : : lit ( " endrewards " ) ) [ phoenix : : insert ( qi : : _r1 , phoenix : : construct < std : : pair < std : : string , storm : : ir : : RewardModel > > ( qi : : _1 , phoenix : : construct < storm : : ir : : RewardModel > ( qi : : _1 , qi : : _a , qi : : _b ) ) ) ] ;
rewardDefinition . name ( " reward definition " ) ;
rewardDefinitionList = * rewardDefinition ( qi : : _r1 ) ;
rewardDefinitionList . name ( " reward definition list " ) ;
/ / This block defines auxiliary entities that are used to check whether a certain variable exist .
integerVariableName % = integerVariableNames_ ;
booleanVariableName % = booleanVariableNames_ ;
booleanVariableName . name ( " boolean variable " ) ;
integerVariableName % = integerVariableNames_ ;
integerVariableName . name ( " integer variable " ) ;
commandName % = commandNames_ ;
commandName . name ( " command name " ) ;
/ / This block defines all entities that are needed for parsing a single command .
assignmentDefinition = ( qi : : lit ( " ( " ) > > integerVariableName > qi : : lit ( " ' " ) > qi : : lit ( " = " ) > integerExpression > qi : : lit ( " ) " ) ) [ qi : : _val = phoenix : : construct < storm : : ir : : Assignment > ( qi : : _1 , qi : : _2 ) ] | ( qi : : lit ( " ( " ) > booleanVariableName > qi : : lit ( " ' " ) > qi : : lit ( " = " ) > booleanExpression > qi : : lit ( " ) " ) ) [ qi : : _val = phoenix : : construct < storm : : ir : : Assignment > ( qi : : _1 , qi : : _2 ) ] ;
assignmentDefinition . name ( " assignment " ) ;
assignmentDefinitionList % = assignmentDefinition % " & " ;
assignmentDefinitionList . name ( " assignment list " ) ;
updateDefinition = ( constantDoubleExpression > qi : : lit ( " : " ) > assignmentDefinitionList ) [ qi : : _val = phoenix : : construct < storm : : ir : : Update > ( qi : : _1 , qi : : _2 ) ] ;
updateDefinition . name ( " update " ) ;
updateListDefinition = + updateDefinition % " + " ;
updateListDefinition . name ( " update list " ) ;
commandDefinition = ( qi : : lit ( " [ " ) > - ( ( freeIdentifierName [ phoenix : : bind ( commandNames_ . add , qi : : _1 , qi : : _1 ) ] | commandName ) [ qi : : _a = qi : : _1 ] ) > qi : : lit ( " ] " ) > booleanExpression > qi : : lit ( " -> " ) > updateListDefinition > qi : : lit ( " ; " ) ) [ qi : : _val = phoenix : : construct < storm : : ir : : Command > ( qi : : _a , qi : : _2 , qi : : _3 ) ] ;
commandDefinition . name ( " command " ) ;
/ / This block defines all entities that are neede for parsing variable definitions .
booleanVariableDefinition = ( freeIdentifierName > > qi : : lit ( " : " ) > > qi : : lit ( " bool " ) > - ( qi : : lit ( " init " ) > constantBooleanExpression [ qi : : _b = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( qi : : _1 ) ] ) > qi : : lit ( " ; " ) ) [ qi : : _val = phoenix : : construct < storm : : ir : : BooleanVariable > ( qi : : _1 , qi : : _b ) , qi : : _a = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : VariableExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : VariableExpression > ( qi : : _1 ) ) , phoenix : : bind ( booleanVariables_ . add , qi : : _1 , qi : : _a ) , phoenix : : bind ( booleanVariableNames_ . add , qi : : _1 , qi : : _1 ) , phoenix : : bind ( allVariables_ . add , qi : : _1 , qi : : _a ) , phoenix : : bind ( booleanVariableInfo_ . add , qi : : _1 , qi : : _val ) ] ;
integerVariableDefinition = ( freeIdentifierName > qi : : lit ( " : " ) > qi : : lit ( " [ " ) > constantIntegerExpression > qi : : lit ( " .. " ) > constantIntegerExpression > qi : : lit ( " ] " ) > - ( qi : : lit ( " init " ) > constantIntegerExpression [ qi : : _b = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( qi : : _1 ) ] ) > qi : : lit ( " ; " ) ) [ qi : : _val = phoenix : : construct < storm : : ir : : IntegerVariable > ( qi : : _1 , qi : : _2 , qi : : _3 , qi : : _b ) , qi : : _a = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : VariableExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : VariableExpression > ( qi : : _1 ) ) , phoenix : : bind ( integerVariables_ . add , qi : : _1 , qi : : _a ) , phoenix : : bind ( integerVariableNames_ . add , qi : : _1 , qi : : _1 ) , phoenix : : bind ( allVariables_ . add , qi : : _1 , qi : : _a ) , phoenix : : bind ( integerVariableInfo_ . add , qi : : _1 , qi : : _val ) ] ;
booleanVariableDefinition = ( freeIdentifierName > > qi : : lit ( " : " ) > > qi : : lit ( " bool " ) > - ( qi : : lit ( " init " ) > constantBooleanExpression [ qi : : _b = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( qi : : _1 ) ] ) > qi : : lit ( " ; " ) ) [ qi : : _val = phoenix : : construct < storm : : ir : : BooleanVariable > ( phoenix : : val ( " hallo " ) , qi : : _b ) , qi : : _a = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : VariableExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : VariableExpression > ( qi : : _1 ) ) , std : : cout < < phoenix : : val ( " here! " ) , phoenix : : bind ( booleanVariables_ . add , qi : : _1 , qi : : _a ) , phoenix : : bind ( booleanVariableNames_ . add , qi : : _1 , qi : : _1 ) ] ;
booleanVariableDefinition . name ( " boolean variable declaration " ) ;
integerVariableDefinition = ( freeIdentifierName > qi : : lit ( " : " ) > qi : : lit ( " [ " ) > constantIntegerExpression > qi : : lit ( " .. " ) > constantIntegerExpression > qi : : lit ( " ] " ) > - ( qi : : lit ( " init " ) > constantIntegerExpression [ qi : : _b = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( qi : : _1 ) ] ) > qi : : lit ( " ; " ) ) [ qi : : _val = phoenix : : construct < storm : : ir : : IntegerVariable > ( qi : : _1 , qi : : _2 , qi : : _3 , qi : : _b ) , qi : : _a = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : VariableExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : VariableExpression > ( qi : : _1 ) ) , phoenix : : bind ( integerVariables_ . add , qi : : _1 , qi : : _a ) , phoenix : : bind ( integerVariableNames_ . add , qi : : _1 , qi : : _1 ) ] ;
integerVariableDefinition . name ( " integer variable declaration " ) ;
variableDefinition = ( booleanVariableDefinition | integerVariableDefinition ) ;
variableDefinition . name ( " variable declaration " ) ;
/ / This block defines all entities that are needed for parsing a module .
moduleDefinition = ( qi : : lit ( " module " ) > freeIdentifierName > * ( booleanVariableDefinition [ phoenix : : push_back ( qi : : _a , qi : : _1 ) ] | integerVariableDefinition [ phoenix : : push_back ( qi : : _b , qi : : _1 ) ] ) > + commandDefinition > qi : : lit ( " endmodule " ) ) [ qi : : _val = phoenix : : construct < storm : : ir : : Module > ( qi : : _1 , qi : : _a , qi : : _b , qi : : _3 ) ] ;
moduleDefinition . name ( " module " ) ;
moduleDefinitionList % = + moduleDefinition ;
moduleDefinitionList . name ( " module list " ) ;
/ / This block defines all entities that are needed for parsing constant definitions .
definedBooleanConstantDefinition = ( qi : : lit ( " const " ) > > qi : : lit ( " bool " ) > > freeIdentifierName > > qi : : lit ( " = " ) > booleanLiteralExpression > qi : : lit ( " ; " ) ) [ phoenix : : bind ( booleanConstants_ . add , qi : : _1 , qi : : _2 ) , phoenix : : bind ( allConstants_ . add , qi : : _1 , qi : : _2 ) , qi : : _val = qi : : _2 ] ;
definedBooleanConstantDefinition . name ( " defined boolean constant declaration " ) ;
definedIntegerConstantDefinition = ( qi : : lit ( " const " ) > > qi : : lit ( " int " ) > > freeIdentifierName > > qi : : lit ( " = " ) > integerLiteralExpression > qi : : lit ( " ; " ) ) [ phoenix : : bind ( integerConstants_ . add , qi : : _1 , qi : : _2 ) , phoenix : : bind ( allConstants_ . add , qi : : _1 , qi : : _2 ) , qi : : _val = qi : : _2 ] ;
definedIntegerConstantDefinition . name ( " defined integer constant declaration " ) ;
definedDoubleConstantDefinition = ( qi : : lit ( " const " ) > > qi : : lit ( " double " ) > > freeIdentifierName > > qi : : lit ( " = " ) > doubleLiteralExpression > qi : : lit ( " ; " ) ) [ phoenix : : bind ( doubleConstants_ . add , qi : : _1 , qi : : _2 ) , phoenix : : bind ( allConstants_ . add , qi : : _1 , qi : : _2 ) , qi : : _val = qi : : _2 ] ;
definedDoubleConstantDefinition . name ( " defined double constant declaration " ) ;
undefinedBooleanConstantDefinition = ( qi : : lit ( " const " ) > > qi : : lit ( " bool " ) > freeIdentifierName > qi : : lit ( " ; " ) ) [ qi : : _a = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BooleanConstantExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BooleanConstantExpression > ( qi : : _1 ) ) , phoenix : : insert ( qi : : _r1 , phoenix : : construct < std : : pair < std : : string , std : : shared_ptr < storm : : ir : : expressions : : BooleanConstantExpression > > > ( qi : : _1 , qi : : _a ) ) , phoenix : : bind ( booleanConstantInfo_ . add , qi : : _1 , qi : : _a ) , phoenix : : bind ( booleanConstants_ . add , qi : : _1 , qi : : _a ) , phoenix : : bind ( allConstants_ . add , qi : : _1 , qi : : _a ) ] ;
undefinedBooleanConstantDefinition . name ( " undefined boolean constant declaration " ) ;
undefinedIntegerConstantDefinition = ( qi : : lit ( " const " ) > > qi : : lit ( " int " ) > freeIdentifierName > qi : : lit ( " ; " ) ) [ qi : : _a = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : IntegerConstantExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : IntegerConstantExpression > ( qi : : _1 ) ) , phoenix : : insert ( qi : : _r1 , phoenix : : construct < std : : pair < std : : string , std : : shared_ptr < storm : : ir : : expressions : : IntegerConstantExpression > > > ( qi : : _1 , qi : : _a ) ) , phoenix : : bind ( integerConstantInfo_ . add , qi : : _1 , qi : : _a ) , phoenix : : bind ( integerConstants_ . add , qi : : _1 , qi : : _a ) , phoenix : : bind ( allConstants_ . add , qi : : _1 , qi : : _a ) ] ;
undefinedIntegerConstantDefinition . name ( " undefined integer constant declaration " ) ;
undefinedDoubleConstantDefinition = ( qi : : lit ( " const " ) > > qi : : lit ( " double " ) > freeIdentifierName > qi : : lit ( " ; " ) ) [ qi : : _a = phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : DoubleConstantExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : DoubleConstantExpression > ( qi : : _1 ) ) , phoenix : : insert ( qi : : _r1 , phoenix : : construct < std : : pair < std : : string , std : : shared_ptr < storm : : ir : : expressions : : DoubleConstantExpression > > > ( qi : : _1 , qi : : _a ) ) , phoenix : : bind ( doubleConstantInfo_ . add , qi : : _1 , qi : : _a ) , phoenix : : bind ( doubleConstants_ . add , qi : : _1 , qi : : _a ) , phoenix : : bind ( allConstants_ . add , qi : : _1 , qi : : _a ) ] ;
undefinedDoubleConstantDefinition . name ( " undefined double constant declaration " ) ;
definedConstantDefinition % = ( definedBooleanConstantDefinition | definedIntegerConstantDefinition | definedDoubleConstantDefinition ) ;
definedConstantDefinition . name ( " defined constant declaration " ) ;
undefinedConstantDefinition = ( undefinedBooleanConstantDefinition ( qi : : _r1 ) | undefinedIntegerConstantDefinition ( qi : : _r2 ) | undefinedDoubleConstantDefinition ( qi : : _r3 ) ) ;
undefinedConstantDefinition . name ( " undefined constant declaration " ) ;
constantDefinitionList = * ( definedConstantDefinition | undefinedConstantDefinition ( qi : : _r1 , qi : : _r2 , qi : : _r3 ) ) ;
constantDefinitionList . name ( " constant declaration list " ) ;
/ / This block defines all entities that are needed for parsing a program .
modelTypeDefinition = modelType_ ;
start = ( modelTypeDefinition > constantDefinitionList ( qi : : _a , qi : : _b , qi : : _c ) > moduleDefinitionList > rewardDefinitionList ( qi : : _d ) ) [ qi : : _val = phoenix : : construct < storm : : ir : : Program > ( qi : : _1 , qi : : _a , qi : : _b , qi : : _c , qi : : _2 , qi : : _d ) ] ;
modelTypeDefinition . name ( " model type " ) ;
start = ( modelTypeDefinition > constantDefinitionList ( qi : : _a , qi : : _b , qi : : _c ) > moduleDefinitionList > rewardDefinitionList ( qi : : _d ) > labelDefinitionList ( qi : : _e ) ) [ qi : : _val = phoenix : : construct < storm : : ir : : Program > ( qi : : _1 , qi : : _a , qi : : _b , qi : : _c , qi : : _2 , qi : : _d , qi : : _e ) ] ;
start . name ( " probabilistic program declaration " ) ;
}
/ / The starting point of the grammar .
qi : : rule < Iterator , storm : : ir : : Program ( ) , qi : : locals < std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : BooleanConstantExpression > > , std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : IntegerConstantExpression > > , std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : DoubleConstantExpression > > , std : : map < std : : string , storm : : ir : : RewardModel > > , Skipper > start ;
qi : : rule < Iterator , storm : : ir : : Program ( ) , qi : : locals < std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : BooleanConstantExpression > > , std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : IntegerConstantExpression > > , std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : DoubleConstantExpression > > , std : : map < std : : string , storm : : ir : : RewardModel > , std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > > , Skipper > start ;
qi : : rule < Iterator , storm : : ir : : Program : : ModelType ( ) , Skipper > modelTypeDefinition ;
qi : : rule < Iterator , qi : : unused_type ( std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : BooleanConstantExpression > > & , std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : IntegerConstantExpression > > & , std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : DoubleConstantExpression > > & ) , Skipper > constantDefinitionList ;
qi : : rule < Iterator , std : : vector < storm : : ir : : Module > ( ) , Skipper > moduleDefinitionList ;
@ -192,6 +272,9 @@ private:
qi : : rule < Iterator , storm : : ir : : StateReward ( ) , Skipper > stateRewardDefinition ;
qi : : rule < Iterator , storm : : ir : : TransitionReward ( ) , qi : : locals < std : : string > , Skipper > transitionRewardDefinition ;
qi : : rule < Iterator , qi : : unused_type ( std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > & ) , Skipper > labelDefinitionList ;
qi : : rule < Iterator , qi : : unused_type ( std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > & ) , Skipper > labelDefinition ;
qi : : rule < Iterator , std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > ( ) , Skipper > constantDefinition ;
qi : : rule < Iterator , qi : : unused_type ( std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : BooleanConstantExpression > > & , std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : IntegerConstantExpression > > & , std : : map < std : : string , std : : shared_ptr < storm : : ir : : expressions : : DoubleConstantExpression > > & ) , Skipper > undefinedConstantDefinition ;
qi : : rule < Iterator , std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > ( ) , Skipper > definedConstantDefinition ;
@ -203,6 +286,7 @@ private:
qi : : rule < Iterator , std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > ( ) , Skipper > definedDoubleConstantDefinition ;
qi : : rule < Iterator , std : : string ( ) , Skipper > freeIdentifierName ;
qi : : rule < Iterator , std : : string ( ) , Skipper > identifierName ;
/ / The starting point for arbitrary expressions .
qi : : rule < Iterator , std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > ( ) , Skipper > expression ;
@ -299,20 +383,12 @@ private:
struct variablesStruct : qi : : symbols < char , std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > {
/ / Intentionally left empty . This map is filled during parsing .
} integerVariables_ , booleanVariables_ , allVariables_ ;
} integerVariables_ , booleanVariables_ ;
struct entityNamesStruct : qi : : symbols < char , std : : string > {
/ / Intentionally left empty . This map is filled during parsing .
} integerVariableNames_ , booleanVariableNames_ , commandNames_ ;
struct booleanVariableTypesStruct : qi : : symbols < char , storm : : ir : : BooleanVariable > {
/ / Intentionally left empty . This map is filled during parsing .
} booleanVariableInfo_ ;
struct integerVariableTypesStruct : qi : : symbols < char , storm : : ir : : IntegerVariable > {
/ / Intentionally left empty . This map is filled during parsing .
} integerVariableInfo_ ;
struct constantsStruct : qi : : symbols < char , std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > {
/ / Intentionally left empty . This map is filled during parsing .
} integerConstants_ , booleanConstants_ , doubleConstants_ , allConstants_ ;