Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
FormulaParserGrammar.h
Go to the documentation of this file.
1#pragma once
2
3#include <boost/variant.hpp>
4#include <fstream>
5#include <memory>
6
15
16namespace storm {
17namespace logic {
18class Formula;
19}
20
21namespace parser {
22
23class FormulaParserGrammar : public qi::grammar<Iterator, std::vector<storm::jani::Property>(), Skipper> {
24 public:
25 FormulaParserGrammar(std::shared_ptr<storm::expressions::ExpressionManager const> const& manager);
26 FormulaParserGrammar(std::shared_ptr<storm::expressions::ExpressionManager> const& manager);
27
30
38 void addIdentifierExpression(std::string const& identifier, storm::expressions::Expression const& expression);
39
40 qi::symbols<char, storm::expressions::Expression> const& getIdentifiers() const;
41
42 private:
43 void initialize();
44
45 struct keywordsStruct : qi::symbols<char, uint_fast64_t> {
46 keywordsStruct() {
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);
48 }
49 };
50 // A parser used for recognizing the standard keywords (that also apply to e.g. PRISM). These shall not coincide with expression variables
51 keywordsStruct keywords_;
52
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);
56 }
57 };
58 // A parser used for recognizing non-standard Storm-specific keywords.
59 // For compatibility, we still try to parse expression variables whose identifier is such a keyword and just issue a warning.
60 nonStandardKeywordsStruct nonStandardKeywords_;
61
62 struct relationalOperatorStruct : qi::symbols<char, storm::logic::ComparisonType> {
63 relationalOperatorStruct() {
66 }
67 };
68
69 // A parser used for recognizing the operators at the "relational" precedence level.
70 relationalOperatorStruct relationalOperator_;
71
72 struct optimalityOperatorStruct : qi::symbols<char, storm::OptimizationDirection> {
73 optimalityOperatorStruct() {
74 add("min", storm::OptimizationDirection::Minimize)("max", storm::OptimizationDirection::Maximize);
75 }
76 };
77
78 // A parser used for recognizing the optimality operators.
79 optimalityOperatorStruct optimalityOperator_;
80
81 struct filterTypeStruct : qi::symbols<char, storm::modelchecker::FilterType> {
82 filterTypeStruct() {
88 }
89 };
90
91 // A parser used for recognizing the filter type.
92 filterTypeStruct filterType_;
93
94 struct operatorKeyword : qi::symbols<char, storm::logic::FormulaContext> {
95 operatorKeyword() {
98 }
99 };
100 operatorKeyword operatorKeyword_;
101
102 enum class FormulaKind {
103 State,
104 Path,
105 };
106 qi::rule<Iterator, qi::unused_type(FormulaKind), Skipper> isPathFormula;
107
108 // The manager used to parse expressions.
109 std::shared_ptr<storm::expressions::ExpressionManager const> constManager;
110 std::shared_ptr<storm::expressions::ExpressionManager> manager;
111
112 // Parser and manager used for recognizing expressions.
113 storm::parser::ExpressionParser expressionParser;
114
115 // A symbol table that is a mapping from identifiers that can be used in expressions to the expressions
116 // they are to be replaced with.
117 qi::symbols<char, storm::expressions::Expression> identifiers_;
118
119 // Rules
120
121 // Auxiliary helpers
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;
126
127 // PCTL-like Operator Formulas
128 qi::rule<Iterator, storm::logic::OperatorInformation(), qi::locals<boost::optional<storm::OptimizationDirection>>, Skipper> operatorInformation;
129 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(storm::logic::FormulaContext), Skipper> operatorSubFormula;
130 qi::rule<Iterator, std::string(storm::logic::FormulaContext), Skipper> rewardModelName;
131 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), qi::locals<storm::logic::FormulaContext>, Skipper> operatorFormula;
132
133 // Atomic propositions
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;
136
137 // Propositional logic operators
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;
143
144 // Path operators
145 qi::rule<Iterator, std::shared_ptr<storm::logic::TimeBoundReference>, Skipper> timeBoundReference;
146 qi::rule<
147 Iterator,
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>
150 timeBound;
151 qi::rule<Iterator,
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>
155 timeBounds;
156 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(storm::logic::FormulaContext), Skipper> eventuallyFormula;
157 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(storm::logic::FormulaContext), Skipper> nextFormula;
158 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(storm::logic::FormulaContext), Skipper> globallyFormula;
159 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(storm::logic::FormulaContext), Skipper> hoaPathFormula;
160 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(storm::logic::FormulaContext), Skipper> multiBoundedPathFormulaOperand;
161 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(storm::logic::FormulaContext), Skipper> multiBoundedPathFormula;
162 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(storm::logic::FormulaContext), Skipper> prefixOperatorPathFormula;
163 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(storm::logic::FormulaContext), Skipper> basicPathFormula;
164 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(storm::logic::FormulaContext), Skipper> untilLevelPathFormula;
165 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(storm::logic::FormulaContext), Skipper> pathFormula;
166
167 // Quantitative path operators (reward)
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;
172
173 // Game Formulae
174 qi::rule<Iterator, storm::logic::PlayerCoalition(), qi::locals<std::vector<std::variant<std::string, storm::storage::PlayerIndex>>>, Skipper>
175 playerCoalition;
176 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> gameFormula;
177
178 // Multi-objective, quantiles
179 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> multiOperatorFormula;
180 qi::rule<Iterator, storm::expressions::Variable(), Skipper> quantileBoundVariable;
181 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> quantileFormula;
182
183 // General formulae
184 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(FormulaKind, storm::logic::FormulaContext), Skipper> formula;
185 qi::rule<Iterator, std::shared_ptr<storm::logic::Formula const>(), Skipper> topLevelFormula;
186
187 // Properties
188 qi::rule<Iterator, std::string(), Skipper> formulaName;
189 qi::rule<Iterator, storm::jani::Property(), Skipper> filterProperty;
190
191 qi::rule<Iterator, qi::unused_type(), qi::locals<ConstantDataType>, Skipper> constantDefinition;
192
193 // Start symbol
194 qi::rule<Iterator, std::vector<storm::jani::Property>(), Skipper> start;
195
196 void addHoaAPMapping(storm::logic::Formula const& hoaFormula, const std::string& ap, std::shared_ptr<storm::logic::Formula const>& expression) const;
197
198 storm::logic::PlayerCoalition createPlayerCoalition(std::vector<std::variant<std::string, storm::storage::PlayerIndex>> const& playerIds) const;
199 std::shared_ptr<storm::logic::Formula const> createGameFormula(storm::logic::PlayerCoalition const& coalition,
200 std::shared_ptr<storm::logic::Formula const> const& subformula) const;
201
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);
206
207 std::shared_ptr<storm::logic::TimeBoundReference> createTimeBoundReference(storm::logic::TimeBoundType const& type,
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>>
210 createTimeBoundFromInterval(storm::expressions::Expression const& lowerBound, storm::expressions::Expression const& upperBound,
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>>
213 createTimeBoundFromSingleBound(storm::expressions::Expression const& bound, bool upperBound, bool strict,
214 std::shared_ptr<storm::logic::TimeBoundReference> const& timeBoundReference) const;
215
216 // Methods that actually create the expression objects.
217 std::shared_ptr<storm::logic::Formula const> createInstantaneousRewardFormula(storm::expressions::Expression const& timeBound) 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;
223 std::shared_ptr<storm::logic::Formula const> createAtomicExpressionFormula(storm::expressions::Expression const& expression) 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,
229 storm::logic::FormulaContext context, std::shared_ptr<storm::logic::Formula const> const& subformula) const;
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,
240 storm::logic::FormulaContext context) const;
241 storm::logic::OperatorInformation createOperatorInformation(boost::optional<storm::OptimizationDirection> const& optimizationDirection,
242 boost::optional<storm::logic::ComparisonType> const& comparisonType,
243 boost::optional<storm::expressions::Expression> const& threshold) const;
244 std::shared_ptr<storm::logic::Formula const> createOperatorFormula(storm::logic::FormulaContext const& context,
245 boost::optional<std::string> const& rewardModelName,
246 storm::logic::OperatorInformation const& operatorInformation,
247 std::shared_ptr<storm::logic::Formula const> const& subformula);
248 std::shared_ptr<storm::logic::Formula const> createLongRunAverageOperatorFormula(storm::logic::OperatorInformation const& operatorInformation,
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,
251 storm::logic::OperatorInformation const& operatorInformation,
252 std::shared_ptr<storm::logic::Formula const> const& subformula) const;
253 std::shared_ptr<storm::logic::Formula const> createTimeOperatorFormula(storm::logic::OperatorInformation const& operatorInformation,
254 std::shared_ptr<storm::logic::Formula const> const& subformula) const;
255 std::shared_ptr<storm::logic::Formula const> createProbabilityOperatorFormula(storm::logic::OperatorInformation const& operatorInformation,
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);
277 storm::expressions::Variable createQuantileBoundVariables(boost::optional<storm::solver::OptimizationDirection> const& dir,
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);
281
282 std::set<storm::expressions::Variable> getUndefinedConstants(std::shared_ptr<storm::logic::Formula const> const& formula) const;
283 storm::jani::Property createProperty(boost::optional<std::string> const& propertyName, storm::modelchecker::FilterType const& filterType,
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);
288
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);
291
292 // An error handler function.
293 phoenix::function<SpiritErrorHandler> handler;
294
295 uint64_t propertyCount;
296
297 std::set<storm::expressions::Variable> undefinedConstants;
298 std::set<storm::expressions::Variable> quantileFormulaVariables;
299};
300
301} // namespace parser
302} // namespace storm
PositionIteratorType Iterator
qi::symbols< char, storm::expressions::Expression > const & getIdentifiers() const
void addIdentifierExpression(std::string const &identifier, storm::expressions::Expression const &expression)
Adds an identifier and the expression it is supposed to be replaced with.
FormulaParserGrammar & operator=(FormulaParserGrammar const &other)=delete
FormulaParserGrammar(FormulaParserGrammar const &other)=delete
SettingsManager const & manager()
Retrieves the settings manager.
LabParser.cpp.
Definition cli.cpp:18