Storm 1.14.0.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 <cstdint>
4#include <memory>
5
9
10namespace storm {
11namespace expressions {
12class Expression;
14} // namespace expressions
15
16namespace parser {
17template<typename NumberType>
18struct RationalPolicies : boost::spirit::qi::strict_real_policies<NumberType> {
19 static const bool expect_dot = true;
20 static const bool allow_leading_dot = true;
21 static const bool allow_trailing_dot = false;
22
23 template<typename It, typename Attr>
24 static bool parse_nan(It&, It const&, Attr&) {
25 return false;
26 }
27 template<typename It, typename Attr>
28 static bool parse_inf(It&, It const&, Attr&) {
29 return false;
30 }
31};
32
33class ExpressionCreator;
34
35class ExpressionParser : public qi::grammar<Iterator, storm::expressions::Expression(), Skipper> {
36 public:
52 qi::symbols<char, uint_fast64_t> const& invalidIdentifiers_ = qi::symbols<char, uint_fast64_t>(), bool enableErrorHandling = true,
53 bool allowBacktracking = false);
55
56 ExpressionParser(ExpressionParser const& other) = delete;
58
66 void setIdentifierMapping(qi::symbols<char, storm::expressions::Expression> const* identifiers_);
67
75 void setIdentifierMapping(std::unordered_map<std::string, storm::expressions::Expression> const& identifierMapping);
76
82
88 void setAcceptDoubleLiterals(bool flag);
89
94 storm::expressions::Expression parseFromString(std::string const& expressionString, bool ignoreError = false) const;
95
96 private:
97 struct orOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
98 orOperatorStruct() {
100 }
101 };
102
103 // A parser used for recognizing the operators at the "or" precedence level.
104 orOperatorStruct orOperator_;
105
106 struct andOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
107 andOperatorStruct() {
109 }
110 };
111
112 // A parser used for recognizing the operators at the "and" precedence level.
113 andOperatorStruct andOperator_;
114
115 struct equalityOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
116 equalityOperatorStruct() {
118 }
119 };
120
121 // A parser used for recognizing the operators at the "equality" precedence level.
122 equalityOperatorStruct equalityOperator_;
123
124 struct relationalOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
125 relationalOperatorStruct() {
128 }
129 };
130
131 // A parser used for recognizing the operators at the "relational" precedence level.
132 relationalOperatorStruct relationalOperator_;
133
134 struct plusOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
135 plusOperatorStruct() {
137 }
138 };
139
140 // A parser used for recognizing the operators at the "plus" precedence level.
141 plusOperatorStruct plusOperator_;
142
143 struct multiplicationOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
144 multiplicationOperatorStruct() {
146 }
147 };
148
149 // A parser used for recognizing the operators at the "multiplication" precedence level.
150 multiplicationOperatorStruct multiplicationOperator_;
151
152 struct infixPowerModuloOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
153 infixPowerModuloOperatorStruct() {
155 }
156 };
157
158 // A parser used for recognizing the operators at the "power" precedence level.
159 infixPowerModuloOperatorStruct infixPowerModuloOperator_;
160
161 struct unaryOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
162 unaryOperatorStruct() {
164 }
165 };
166
167 // A parser used for recognizing the operators at the "unary" precedence level.
168 unaryOperatorStruct unaryOperator_;
169
170 struct floorCeilOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
171 floorCeilOperatorStruct() {
173 }
174 };
175
176 // A parser used for recognizing the operators at the "floor/ceil" precedence level.
177 floorCeilOperatorStruct floorCeilOperator_;
178
179 struct minMaxOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
180 minMaxOperatorStruct() {
182 }
183 };
184
185 // A parser used for recognizing the operators at the "min/max" precedence level.
186 minMaxOperatorStruct minMaxOperator_;
187
188 struct prefixPowerModuloLogarithmOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
189 prefixPowerModuloLogarithmOperatorStruct() {
192 }
193 };
194
195 // A parser used for recognizing the operators at the "power" precedence level.
196 prefixPowerModuloLogarithmOperatorStruct prefixPowerModuloLogarithmOperator_;
197
198 struct predicateOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
199 predicateOperatorStruct() {
202 }
203 };
204
205 // A parser used for recognizing the operators at the "min/max" precedence level.
206 predicateOperatorStruct predicateOperator_;
207
208 std::unique_ptr<ExpressionCreator> expressionCreator;
209
210 // The symbol table of invalid identifiers.
211 qi::symbols<char, uint_fast64_t> invalidIdentifiers_;
212
213 // Rules for parsing a composed expression.
214 qi::rule<Iterator, storm::expressions::Expression(), Skipper> expression;
215 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> iteExpression;
216 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> orExpression;
217 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> andExpression;
218 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> relativeExpression;
219 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> equalityExpression;
220 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> plusExpression;
221 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> multiplicationExpression;
222 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<bool>, Skipper> prefixPowerModuloLogarithmExpression;
223 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> infixPowerModuloExpression;
224 qi::rule<Iterator, storm::expressions::Expression(), Skipper> unaryExpression;
225 qi::rule<Iterator, storm::expressions::Expression(), Skipper> atomicExpression;
226 qi::rule<Iterator, storm::expressions::Expression(), Skipper> literalExpression;
227 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<bool>, Skipper> integerLiteralExpression;
228 qi::rule<Iterator, qi::unused_type(bool), Skipper> integerOverflowHelperRule;
229 qi::rule<Iterator, storm::expressions::Expression(), Skipper> identifierExpression;
230 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::OperatorType, storm::expressions::Expression>, Skipper>
231 minMaxExpression;
232 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::OperatorType>, Skipper> floorCeilExpression;
233 qi::rule<Iterator, storm::expressions::Expression(), Skipper> roundExpression;
234 qi::rule<Iterator, storm::expressions::Expression(), Skipper> predicateExpression;
235 qi::rule<Iterator, std::string(), Skipper> identifier;
236
237 // Parser that is used to recognize doubles only (as opposed to Spirit's double_ parser).
238 boost::spirit::qi::real_parser<storm::RationalNumber, RationalPolicies<storm::RationalNumber>> floatLiteral_;
239 boost::spirit::qi::int_parser<storm::RationalNumber> integerLiteral_;
240
241 bool isValidIdentifier(std::string const& identifier);
242
243 // An error handler function.
244 phoenix::function<SpiritErrorHandler> handler;
245};
246} // namespace parser
247} // 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(storm::expressions::ExpressionManager const &manager, qi::symbols< char, uint_fast64_t > const &invalidIdentifiers_=qi::symbols< char, uint_fast64_t >(), bool enableErrorHandling=true, bool allowBacktracking=false)
Creates an expression parser.
ExpressionParser(ExpressionParser const &other)=delete
Contains all file parsers and helper classes.
static bool parse_inf(It &, It const &, Attr &)
static bool parse_nan(It &, It const &, Attr &)