Storm 1.11.1.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
ExpressionParser.h
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4
8
9namespace storm {
10namespace expressions {
11class Expression;
12class ExpressionManager;
13} // namespace expressions
14
15namespace parser {
16template<typename NumberType>
17struct RationalPolicies : boost::spirit::qi::strict_real_policies<NumberType> {
18 static const bool expect_dot = true;
19 static const bool allow_leading_dot = true;
20 static const bool allow_trailing_dot = false;
21
22 template<typename It, typename Attr>
23 static bool parse_nan(It&, It const&, Attr&) {
24 return false;
25 }
26 template<typename It, typename Attr>
27 static bool parse_inf(It&, It const&, Attr&) {
28 return false;
29 }
30};
31
32class ExpressionCreator;
33
34class ExpressionParser : public qi::grammar<Iterator, storm::expressions::Expression(), Skipper> {
35 public:
51 qi::symbols<char, uint_fast64_t> const& invalidIdentifiers_ = qi::symbols<char, uint_fast64_t>(), bool enableErrorHandling = true,
52 bool allowBacktracking = false);
54
55 ExpressionParser(ExpressionParser const& other) = delete;
57
65 void setIdentifierMapping(qi::symbols<char, storm::expressions::Expression> const* identifiers_);
66
74 void setIdentifierMapping(std::unordered_map<std::string, storm::expressions::Expression> const& identifierMapping);
75
81
87 void setAcceptDoubleLiterals(bool flag);
88
93 storm::expressions::Expression parseFromString(std::string const& expressionString, bool ignoreError = false) const;
94
95 private:
96 struct orOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
97 orOperatorStruct() {
99 }
100 };
101
102 // A parser used for recognizing the operators at the "or" precedence level.
103 orOperatorStruct orOperator_;
104
105 struct andOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
106 andOperatorStruct() {
108 }
109 };
110
111 // A parser used for recognizing the operators at the "and" precedence level.
112 andOperatorStruct andOperator_;
113
114 struct equalityOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
115 equalityOperatorStruct() {
117 }
118 };
119
120 // A parser used for recognizing the operators at the "equality" precedence level.
121 equalityOperatorStruct equalityOperator_;
122
123 struct relationalOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
124 relationalOperatorStruct() {
127 }
128 };
129
130 // A parser used for recognizing the operators at the "relational" precedence level.
131 relationalOperatorStruct relationalOperator_;
132
133 struct plusOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
134 plusOperatorStruct() {
136 }
137 };
138
139 // A parser used for recognizing the operators at the "plus" precedence level.
140 plusOperatorStruct plusOperator_;
141
142 struct multiplicationOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
143 multiplicationOperatorStruct() {
145 }
146 };
147
148 // A parser used for recognizing the operators at the "multiplication" precedence level.
149 multiplicationOperatorStruct multiplicationOperator_;
150
151 struct infixPowerModuloOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
152 infixPowerModuloOperatorStruct() {
154 }
155 };
156
157 // A parser used for recognizing the operators at the "power" precedence level.
158 infixPowerModuloOperatorStruct infixPowerModuloOperator_;
159
160 struct unaryOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
161 unaryOperatorStruct() {
163 }
164 };
165
166 // A parser used for recognizing the operators at the "unary" precedence level.
167 unaryOperatorStruct unaryOperator_;
168
169 struct floorCeilOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
170 floorCeilOperatorStruct() {
172 }
173 };
174
175 // A parser used for recognizing the operators at the "floor/ceil" precedence level.
176 floorCeilOperatorStruct floorCeilOperator_;
177
178 struct minMaxOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
179 minMaxOperatorStruct() {
181 }
182 };
183
184 // A parser used for recognizing the operators at the "min/max" precedence level.
185 minMaxOperatorStruct minMaxOperator_;
186
187 struct prefixPowerModuloLogarithmOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
188 prefixPowerModuloLogarithmOperatorStruct() {
191 }
192 };
193
194 // A parser used for recognizing the operators at the "power" precedence level.
195 prefixPowerModuloLogarithmOperatorStruct prefixPowerModuloLogarithmOperator_;
196
197 struct predicateOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
198 predicateOperatorStruct() {
201 }
202 };
203
204 // A parser used for recognizing the operators at the "min/max" precedence level.
205 predicateOperatorStruct predicateOperator_;
206
207 std::unique_ptr<ExpressionCreator> expressionCreator;
208
209 // The symbol table of invalid identifiers.
210 qi::symbols<char, uint_fast64_t> invalidIdentifiers_;
211
212 // Rules for parsing a composed expression.
213 qi::rule<Iterator, storm::expressions::Expression(), Skipper> expression;
214 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> iteExpression;
215 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> orExpression;
216 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> andExpression;
217 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> relativeExpression;
218 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> equalityExpression;
219 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> plusExpression;
220 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> multiplicationExpression;
221 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<bool>, Skipper> prefixPowerModuloLogarithmExpression;
222 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> infixPowerModuloExpression;
223 qi::rule<Iterator, storm::expressions::Expression(), Skipper> unaryExpression;
224 qi::rule<Iterator, storm::expressions::Expression(), Skipper> atomicExpression;
225 qi::rule<Iterator, storm::expressions::Expression(), Skipper> literalExpression;
226 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<bool>, Skipper> integerLiteralExpression;
227 qi::rule<Iterator, qi::unused_type(bool), Skipper> integerOverflowHelperRule;
228 qi::rule<Iterator, storm::expressions::Expression(), Skipper> identifierExpression;
229 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::OperatorType, storm::expressions::Expression>, Skipper>
230 minMaxExpression;
231 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::OperatorType>, Skipper> floorCeilExpression;
232 qi::rule<Iterator, storm::expressions::Expression(), Skipper> roundExpression;
233 qi::rule<Iterator, storm::expressions::Expression(), Skipper> predicateExpression;
234 qi::rule<Iterator, std::string(), Skipper> identifier;
235
236 // Parser that is used to recognize doubles only (as opposed to Spirit's double_ parser).
237 boost::spirit::qi::real_parser<storm::RationalNumber, RationalPolicies<storm::RationalNumber>> floatLiteral_;
238 boost::spirit::qi::int_parser<storm::RationalNumber> integerLiteral_;
239
240 bool isValidIdentifier(std::string const& identifier);
241
242 // An error handler function.
243 phoenix::function<SpiritErrorHandler> handler;
244};
245} // namespace parser
246} // namespace storm
PositionIteratorType Iterator
This class is responsible for managing a set of typed variables and all expressions using these varia...
storm::expressions::Expression parseFromString(std::string const &expressionString, bool ignoreError=false) const
Parses an expression from the given string.
void setIdentifierMapping(qi::symbols< char, storm::expressions::Expression > const *identifiers_)
Sets an identifier mapping that is used to determine valid variables in the expression.
void unsetIdentifierMapping()
Unsets a previously set identifier mapping.
ExpressionParser & operator=(ExpressionParser const &other)=delete
void setAcceptDoubleLiterals(bool flag)
Sets whether double literals are to be accepted or not.
ExpressionParser(ExpressionParser const &other)=delete
static bool parse_inf(It &, It const &, Attr &)
static bool parse_nan(It &, It const &, Attr &)