Storm
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#include <sstream>
5
8
10
11namespace storm {
12namespace expressions {
13class Expression;
14class ExpressionManager;
15} // namespace expressions
16
17namespace parser {
18template<typename NumberType>
19struct RationalPolicies : boost::spirit::qi::strict_real_policies<NumberType> {
20 static const bool expect_dot = true;
21 static const bool allow_leading_dot = true;
22 static const bool allow_trailing_dot = false;
23
24 template<typename It, typename Attr>
25 static bool parse_nan(It&, It const&, Attr&) {
26 return false;
27 }
28 template<typename It, typename Attr>
29 static bool parse_inf(It&, It const&, Attr&) {
30 return false;
31 }
32};
33
34class ExpressionCreator;
35
36class ExpressionParser : public qi::grammar<Iterator, storm::expressions::Expression(), Skipper> {
37 public:
53 qi::symbols<char, uint_fast64_t> const& invalidIdentifiers_ = qi::symbols<char, uint_fast64_t>(), bool enableErrorHandling = true,
54 bool allowBacktracking = false);
56
57 ExpressionParser(ExpressionParser const& other) = delete;
59
67 void setIdentifierMapping(qi::symbols<char, storm::expressions::Expression> const* identifiers_);
68
76 void setIdentifierMapping(std::unordered_map<std::string, storm::expressions::Expression> const& identifierMapping);
77
83
89 void setAcceptDoubleLiterals(bool flag);
90
95 storm::expressions::Expression parseFromString(std::string const& expressionString, bool ignoreError = false) const;
96
97 private:
98 struct orOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
99 orOperatorStruct() {
101 }
102 };
103
104 // A parser used for recognizing the operators at the "or" precedence level.
105 orOperatorStruct orOperator_;
106
107 struct andOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
108 andOperatorStruct() {
110 }
111 };
112
113 // A parser used for recognizing the operators at the "and" precedence level.
114 andOperatorStruct andOperator_;
115
116 struct equalityOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
117 equalityOperatorStruct() {
119 }
120 };
121
122 // A parser used for recognizing the operators at the "equality" precedence level.
123 equalityOperatorStruct equalityOperator_;
124
125 struct relationalOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
126 relationalOperatorStruct() {
129 }
130 };
131
132 // A parser used for recognizing the operators at the "relational" precedence level.
133 relationalOperatorStruct relationalOperator_;
134
135 struct plusOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
136 plusOperatorStruct() {
138 }
139 };
140
141 // A parser used for recognizing the operators at the "plus" precedence level.
142 plusOperatorStruct plusOperator_;
143
144 struct multiplicationOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
145 multiplicationOperatorStruct() {
147 }
148 };
149
150 // A parser used for recognizing the operators at the "multiplication" precedence level.
151 multiplicationOperatorStruct multiplicationOperator_;
152
153 struct infixPowerModuloOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
154 infixPowerModuloOperatorStruct() {
156 }
157 };
158
159 // A parser used for recognizing the operators at the "power" precedence level.
160 infixPowerModuloOperatorStruct infixPowerModuloOperator_;
161
162 struct unaryOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
163 unaryOperatorStruct() {
165 }
166 };
167
168 // A parser used for recognizing the operators at the "unary" precedence level.
169 unaryOperatorStruct unaryOperator_;
170
171 struct floorCeilOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
172 floorCeilOperatorStruct() {
174 }
175 };
176
177 // A parser used for recognizing the operators at the "floor/ceil" precedence level.
178 floorCeilOperatorStruct floorCeilOperator_;
179
180 struct minMaxOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
181 minMaxOperatorStruct() {
183 }
184 };
185
186 // A parser used for recognizing the operators at the "min/max" precedence level.
187 minMaxOperatorStruct minMaxOperator_;
188
189 struct prefixPowerModuloLogarithmOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
190 prefixPowerModuloLogarithmOperatorStruct() {
193 }
194 };
195
196 // A parser used for recognizing the operators at the "power" precedence level.
197 prefixPowerModuloLogarithmOperatorStruct prefixPowerModuloLogarithmOperator_;
198
199 struct predicateOperatorStruct : qi::symbols<char, storm::expressions::OperatorType> {
200 predicateOperatorStruct() {
203 }
204 };
205
206 // A parser used for recognizing the operators at the "min/max" precedence level.
207 predicateOperatorStruct predicateOperator_;
208
209 std::unique_ptr<ExpressionCreator> expressionCreator;
210
211 // The symbol table of invalid identifiers.
212 qi::symbols<char, uint_fast64_t> invalidIdentifiers_;
213
214 // Rules for parsing a composed expression.
215 qi::rule<Iterator, storm::expressions::Expression(), Skipper> expression;
216 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> iteExpression;
217 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> orExpression;
218 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> andExpression;
219 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> relativeExpression;
220 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> equalityExpression;
221 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> plusExpression;
222 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> multiplicationExpression;
223 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<bool>, Skipper> prefixPowerModuloLogarithmExpression;
224 qi::rule<Iterator, storm::expressions::Expression(), qi::locals<storm::expressions::Expression>, Skipper> infixPowerModuloExpression;
225 qi::rule<Iterator, storm::expressions::Expression(), Skipper> unaryExpression;
226 qi::rule<Iterator, storm::expressions::Expression(), Skipper> atomicExpression;
227 qi::rule<Iterator, storm::expressions::Expression(), Skipper> literalExpression;
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>> rationalLiteral_;
238
239 bool isValidIdentifier(std::string const& identifier);
240
241 // An error handler function.
242 phoenix::function<SpiritErrorHandler> handler;
243};
244} // namespace parser
245} // 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
LabParser.cpp.
Definition cli.cpp:18
static bool parse_inf(It &, It const &, Attr &)
static bool parse_nan(It &, It const &, Attr &)