@ -58,7 +58,8 @@ 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 )  < <  "   "  < <  " ^- here " ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								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 ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								throw  storm : : exceptions : : WrongFileFormatException ( )  < <  msg . str ( ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				
					@ -70,7 +71,7 @@ private: 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
						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 >  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							prismGrammar ( )  :  prismGrammar : : base_type ( start )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								freeIdentifierName  % =  qi : : lexeme [ ( qi : : alpha  > >  * ( qi : : alnum ) )  -  allVariables_  -  allConstants_ ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								freeIdentifierName  % =  qi : : lexeme [ qi : : alpha  > >  * ( qi : : alnum  |  qi : : char_ ( ' _ ' ) ) ]  -  allVariables_  -  allConstants_  ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								booleanLiteralExpression  =  qi : : bool_ [ qi : : _val  =  phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : BooleanLiteral > ( qi : : _1 ) ) ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								integerLiteralExpression  =  qi : : int_ [ qi : : _val  =  phoenix : : construct < std : : shared_ptr < storm : : ir : : expressions : : BaseExpression > > ( phoenix : : new_ < storm : : ir : : expressions : : IntegerLiteral > ( qi : : _1 ) ) ] ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -122,8 +123,8 @@ private: 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								expression  % =  ( booleanExpression  |  integerExpression  |  constantDoubleExpression ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								stateRewardDefinition  =  ( booleanExpression  >  qi : : lit ( " : " )  >  constantDoubleExpression  > >  qi : : lit ( " ; " ) ) [ qi : : _val  =  phoenix : : construct < storm : : ir : : StateReward > ( qi : : _1 ,  qi : : _2 ) ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								transitionRewardDefinition  =  ( qi : : lit ( " [ " )  >  commandName  >  qi : : lit ( " ] " )  >  booleanExpression  >  qi : : lit ( " : " )  >  constantDoubleExpression  >  qi : : lit ( " ; " ) ) [ qi : : _val  =  phoenix : : construct < storm : : ir : : TransitionReward > ( qi : : _1  ,  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 " ) ) [ qi : : _r1 [ qi : : _1 ]  =   phoenix : : construct < storm : : ir : : RewardModel > ( qi : : _1 ,  qi : : _a ,  qi : : _b ) ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								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 ) ) ) ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								rewardDefinitionList  =  * rewardDefinition ( qi : : _r1 ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								/ /  This  block  defines  auxiliary  entities  that  are  used  to  check  whether  a  certain  variable  exist .  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -151,9 +152,9 @@ private: 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								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 ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								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 ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								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 ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								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 ) ) ,  qi : : _r1 [ 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 ) ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								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 ) ) ,  qi : : _r1 [ 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 ) ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								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 ) ) ,  qi : : _r1 [ 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 ) ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								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 ) ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								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 ) ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								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 ) ] ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								definedConstantDefinition  % =  ( definedBooleanConstantDefinition  |  definedIntegerConstantDefinition  |  definedDoubleConstantDefinition ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								undefinedConstantDefinition  =  ( undefinedBooleanConstantDefinition ( qi : : _r1 )  |  undefinedIntegerConstantDefinition ( qi : : _r2 )  |  undefinedDoubleConstantDefinition ( qi : : _r3 ) ) ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
								constantDefinitionList  =  * ( definedConstantDefinition  |  undefinedConstantDefinition ( qi : : _r1 ,  qi : : _r2 ,  qi : : _r3 ) ) ;  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				
					@ -189,7 +190,7 @@ private: 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							qi : : rule < Iterator ,  qi : : unused_type ( std : : map < std : : string ,  storm : : ir : : RewardModel > & ) ,  Skipper >  rewardDefinitionList ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							qi : : rule < Iterator ,  qi : : unused_type ( std : : map < std : : string ,  storm : : ir : : RewardModel > & ) ,  qi : : locals < std : : vector < storm : : ir : : StateReward > ,  std : : vector < storm : : ir : : TransitionReward > > ,  Skipper >  rewardDefinition ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							qi : : rule < Iterator ,  storm : : ir : : StateReward ( ) ,  Skipper >  stateRewardDefinition ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							qi : : rule < Iterator ,  storm : : ir : : TransitionReward ( ) ,  Skipper >  transitionRewardDefinition ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							qi : : rule < Iterator ,  storm : : ir : : TransitionReward ( ) ,  qi : : locals < std : : string > ,  Skipper >  transitionRewardDefinition ;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				
							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 ;