25 FormulaParserGrammar(std::shared_ptr<storm::expressions::ExpressionManager const>
const& manager);
40 qi::symbols<char, storm::expressions::Expression>
const&
getIdentifiers()
const;
45 struct keywordsStruct : qi::symbols<char, uint_fast64_t> {
47 add(
"true", 1)(
"false", 2)(
"min", 3)(
"max", 4)(
"F", 5)(
"G", 6)(
"X", 7)(
"U", 8)(
"C", 9)(
"I", 10)(
"P", 11)(
"R", 12)(
"S", 13);
51 keywordsStruct keywords_;
53 struct nonStandardKeywordsStruct : qi::symbols<char, uint_fast64_t> {
54 nonStandardKeywordsStruct() {
55 add(
"T", 1)(
"LRA", 2)(
"MP", 3)(
"multi", 4)(
"quantile", 5)(
"HOA", 6);
60 nonStandardKeywordsStruct nonStandardKeywords_;
62 struct relationalOperatorStruct : qi::symbols<char, storm::logic::ComparisonType> {
63 relationalOperatorStruct() {
70 relationalOperatorStruct relationalOperator_;
72 struct optimalityOperatorStruct : qi::symbols<char, storm::OptimizationDirection> {
73 optimalityOperatorStruct() {
74 add(
"min", storm::OptimizationDirection::Minimize)(
"max", storm::OptimizationDirection::Maximize);
79 optimalityOperatorStruct optimalityOperator_;
81 struct filterTypeStruct : qi::symbols<char, storm::modelchecker::FilterType> {
92 filterTypeStruct filterType_;
94 struct operatorKeyword : qi::symbols<char, storm::logic::FormulaContext> {
100 operatorKeyword operatorKeyword_;
102 enum class FormulaKind {
106 qi::rule<
Iterator, qi::unused_type(FormulaKind), Skipper> isPathFormula;
109 std::shared_ptr<storm::expressions::ExpressionManager const> constManager;
110 std::shared_ptr<storm::expressions::ExpressionManager>
manager;
117 qi::symbols<char, storm::expressions::Expression> identifiers_;
122 qi::rule<
Iterator, qi::unused_type(std::shared_ptr<storm::logic::Formula const>, std::string), Skipper> noAmbiguousNonAssociativeOperator;
123 qi::rule<
Iterator, std::string(), Skipper> identifier;
124 qi::rule<
Iterator, std::string(), Skipper> label;
125 qi::rule<
Iterator, std::string(), Skipper> quotedString;
131 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), qi::locals<storm::logic::FormulaContext>, Skipper> operatorFormula;
134 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> labelFormula;
135 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> expressionFormula;
138 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(FormulaKind,
storm::logic::FormulaContext), Skipper> basicPropositionalFormula;
139 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(FormulaKind,
storm::logic::FormulaContext), Skipper> negationPropositionalFormula;
140 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(FormulaKind,
storm::logic::FormulaContext), Skipper> andLevelPropositionalFormula;
141 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(FormulaKind,
storm::logic::FormulaContext), Skipper> orLevelPropositionalFormula;
142 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(FormulaKind,
storm::logic::FormulaContext), Skipper> propositionalFormula;
145 qi::rule<Iterator, std::shared_ptr<storm::logic::TimeBoundReference>, Skipper> timeBoundReference;
148 std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>, std::shared_ptr<storm::logic::TimeBoundReference>>(),
149 qi::locals<bool, bool>, Skipper>
152 std::vector<std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>,
153 std::shared_ptr<storm::logic::TimeBoundReference>>>(),
154 qi::locals<bool, bool>, Skipper>
168 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> longRunAverageRewardFormula;
169 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> instantaneousRewardFormula;
170 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> cumulativeRewardFormula;
171 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> totalRewardFormula;
176 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> gameFormula;
179 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> multiOperatorFormula;
181 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> quantileFormula;
185 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> topLevelFormula;
188 qi::rule<
Iterator, std::string(), Skipper> formulaName;
191 qi::rule<
Iterator, qi::unused_type(), qi::locals<ConstantDataType>, Skipper> constantDefinition;
194 qi::rule<Iterator, std::vector<storm::jani::Property>(), Skipper> start;
196 void addHoaAPMapping(
storm::logic::Formula const& hoaFormula,
const std::string& ap, std::shared_ptr<storm::logic::Formula const>& expression)
const;
198 storm::logic::PlayerCoalition createPlayerCoalition(std::vector<std::variant<std::string, storm::storage::PlayerIndex>>
const& playerIds)
const;
200 std::shared_ptr<storm::logic::Formula const>
const& subformula)
const;
202 bool areConstantDefinitionsAllowed()
const;
203 void addConstant(std::string
const& name,
ConstantDataType type, boost::optional<storm::expressions::Expression>
const& expression);
204 void addProperty(std::vector<storm::jani::Property>& properties, boost::optional<std::string>
const& name,
205 std::shared_ptr<storm::logic::Formula const>
const& formula);
208 boost::optional<std::string>
const& rewardModelName)
const;
209 std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>, std::shared_ptr<storm::logic::TimeBoundReference>>
211 std::shared_ptr<storm::logic::TimeBoundReference>
const& timeBoundReference)
const;
212 std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>, std::shared_ptr<storm::logic::TimeBoundReference>>
214 std::shared_ptr<storm::logic::TimeBoundReference>
const& timeBoundReference)
const;
218 std::shared_ptr<storm::logic::Formula const> createCumulativeRewardFormula(
219 std::vector<std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>,
220 std::shared_ptr<storm::logic::TimeBoundReference>>>
const& timeBounds)
const;
221 std::shared_ptr<storm::logic::Formula const> createTotalRewardFormula()
const;
222 std::shared_ptr<storm::logic::Formula const> createLongRunAverageRewardFormula()
const;
224 std::shared_ptr<storm::logic::Formula const> createBooleanLiteralFormula(
bool literal)
const;
225 std::shared_ptr<storm::logic::Formula const> createAtomicLabelFormula(std::string
const& label)
const;
226 std::shared_ptr<storm::logic::Formula const> createEventuallyFormula(
227 boost::optional<std::vector<std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>,
228 std::shared_ptr<storm::logic::TimeBoundReference>>>>
const& timeBounds,
230 std::shared_ptr<storm::logic::Formula const> createGloballyFormula(std::shared_ptr<storm::logic::Formula const>
const& subformula)
const;
231 std::shared_ptr<storm::logic::Formula const> createNextFormula(std::shared_ptr<storm::logic::Formula const>
const& subformula)
const;
232 std::shared_ptr<storm::logic::Formula const> createUntilFormula(
233 std::shared_ptr<storm::logic::Formula const>
const& leftSubformula,
234 boost::optional<std::vector<std::tuple<boost::optional<storm::logic::TimeBound>, boost::optional<storm::logic::TimeBound>,
235 std::shared_ptr<storm::logic::TimeBoundReference>>>>
const& timeBounds,
236 std::shared_ptr<storm::logic::Formula const>
const& rightSubformula);
237 std::shared_ptr<storm::logic::Formula const> createHOAPathFormula(
const std::string& automataFile)
const;
238 std::shared_ptr<storm::logic::Formula const> createConditionalFormula(std::shared_ptr<storm::logic::Formula const>
const& leftSubformula,
239 boost::optional<std::shared_ptr<storm::logic::Formula const>>
const& rightSubformula,
242 boost::optional<storm::logic::ComparisonType>
const& comparisonType,
243 boost::optional<storm::expressions::Expression>
const& threshold)
const;
245 boost::optional<std::string>
const& rewardModelName,
247 std::shared_ptr<storm::logic::Formula const>
const& subformula);
249 std::shared_ptr<storm::logic::Formula const>
const& subformula)
const;
250 std::shared_ptr<storm::logic::Formula const> createRewardOperatorFormula(boost::optional<std::string>
const& rewardModelName,
252 std::shared_ptr<storm::logic::Formula const>
const& subformula)
const;
254 std::shared_ptr<storm::logic::Formula const>
const& subformula)
const;
256 std::shared_ptr<storm::logic::Formula const>
const& subformula);
257 std::shared_ptr<storm::logic::Formula const> createBinaryBooleanStateFormula(std::shared_ptr<storm::logic::Formula const>
const& leftSubformula,
258 std::shared_ptr<storm::logic::Formula const>
const& rightSubformula,
260 std::shared_ptr<storm::logic::Formula const> createBinaryBooleanPathFormula(std::shared_ptr<storm::logic::Formula const>
const& leftSubformula,
261 std::shared_ptr<storm::logic::Formula const>
const& rightSubformula,
263 std::shared_ptr<storm::logic::Formula const> createBinaryBooleanStateOrPathFormula(std::shared_ptr<storm::logic::Formula const>
const& leftSubformula,
264 std::shared_ptr<storm::logic::Formula const>
const& rightSubformula,
266 std::shared_ptr<storm::logic::Formula const> createUnaryBooleanStateFormula(
267 std::shared_ptr<storm::logic::Formula const>
const& subformula,
268 boost::optional<storm::logic::UnaryBooleanStateFormula::OperatorType>
const& operatorType);
269 std::shared_ptr<storm::logic::Formula const> createUnaryBooleanPathFormula(
270 std::shared_ptr<storm::logic::Formula const>
const& subformula,
271 boost::optional<storm::logic::UnaryBooleanPathFormula::OperatorType>
const& operatorType);
272 std::shared_ptr<storm::logic::Formula const> createUnaryBooleanStateOrPathFormula(
273 std::shared_ptr<storm::logic::Formula const>
const& subformula, boost::optional<storm::logic::UnaryBooleanOperatorType>
const& operatorType);
274 bool isValidMultiBoundedPathFormulaOperand(std::shared_ptr<storm::logic::Formula const>
const& operand);
275 std::shared_ptr<storm::logic::Formula const> createMultiBoundedPathFormula(std::vector<std::shared_ptr<storm::logic::Formula const>>
const& subformulas);
276 std::shared_ptr<storm::logic::Formula const> createMultiOperatorFormula(std::vector<std::shared_ptr<storm::logic::Formula const>>
const& subformulas);
278 std::string
const& variableName);
279 std::shared_ptr<storm::logic::Formula const> createQuantileFormula(std::vector<storm::expressions::Variable>
const& boundVariables,
280 std::shared_ptr<storm::logic::Formula const>
const& subformula);
282 std::set<storm::expressions::Variable> getUndefinedConstants(std::shared_ptr<storm::logic::Formula const>
const& formula)
const;
284 std::shared_ptr<storm::logic::Formula const>
const& formula,
285 std::shared_ptr<storm::logic::Formula const>
const& states);
286 storm::jani::Property createPropertyWithDefaultFilterTypeAndStates(boost::optional<std::string>
const& propertyName,
287 std::shared_ptr<storm::logic::Formula const>
const& formula);
289 bool isBooleanReturnType(std::shared_ptr<storm::logic::Formula const>
const& formula,
bool raiseErrorMessage =
false);
290 bool raiseAmbiguousNonAssociativeOperatorError(std::shared_ptr<storm::logic::Formula const>
const& formula, std::string
const& op);
293 phoenix::function<SpiritErrorHandler> handler;
295 uint64_t propertyCount;
297 std::set<storm::expressions::Variable> undefinedConstants;
298 std::set<storm::expressions::Variable> quantileFormulaVariables;