cprover
Toggle main menu visibility
Loading...
Searching...
No Matches
expr.cpp
Go to the documentation of this file.
1
/*******************************************************************\
2
3
Module: Expression Representation
4
5
Author: Daniel Kroening, kroening@kroening.com
6
Joel Allred, joel.allred@diffblue.com
7
8
\*******************************************************************/
9
12
13
#include "
arith_tools.h
"
14
#include "
bitvector_types.h
"
15
#include "
expr_iterator.h
"
16
#include "
expr_util.h
"
17
#include "
fixedbv.h
"
18
#include "
ieee_float.h
"
19
#include "
rational.h
"
20
#include "
rational_tools.h
"
21
#include "
std_expr.h
"
22
23
#include <stack>
24
27
bool
exprt::is_true
()
const
28
{
29
return
*
this
==
true
;
30
}
31
34
bool
exprt::is_false
()
const
35
{
36
return
*
this
==
false
;
37
}
38
47
bool
exprt::is_zero
()
const
48
{
49
return
*
this
== 0;
50
}
51
58
bool
exprt::is_one
()
const
59
{
60
return
*
this
== 1;
61
}
62
68
const
source_locationt
&
exprt::find_source_location
()
const
69
{
70
const
source_locationt
&l=
source_location
();
71
72
if
(l.
is_not_nil
())
73
return
l;
74
75
for
(
const
auto
&op :
operands
())
76
{
77
const
source_locationt
&op_l = op.find_source_location();
78
if
(op_l.
is_not_nil
())
79
return
op_l;
80
}
81
82
return
source_locationt::nil
();
83
}
84
85
template
<
typename
T>
86
void
visit_post_template
(std::function<
void
(T &)> visitor, T *_expr)
87
{
88
struct
stack_entryt
89
{
90
T *e;
91
bool
operands_pushed;
92
explicit
stack_entryt(T *_e) : e(_e), operands_pushed(
false
)
93
{
94
}
95
};
96
97
std::stack<stack_entryt> stack;
98
99
stack.emplace(_expr);
100
101
while
(!stack.empty())
102
{
103
auto
&top = stack.top();
104
if
(top.operands_pushed)
105
{
106
visitor(*top.e);
107
stack.pop();
108
}
109
else
110
{
111
// do modification of 'top' before pushing in case 'top' isn't stable
112
top.operands_pushed =
true
;
113
for
(
auto
&op : top.e->operands())
114
stack.emplace(&op);
115
}
116
}
117
}
118
119
void
exprt::visit_post
(std::function<
void
(
exprt
&)> visitor)
120
{
121
visit_post_template
(visitor,
this
);
122
}
123
124
void
exprt::visit_post
(std::function<
void
(
const
exprt
&)> visitor)
const
125
{
126
visit_post_template
(visitor,
this
);
127
}
128
129
template
<
typename
T>
130
static
void
visit_pre_template
(std::function<
void
(T &)> visitor, T *_expr)
131
{
132
std::stack<T *> stack;
133
134
stack.push(_expr);
135
136
while
(!stack.empty())
137
{
138
T &expr = *stack.top();
139
stack.pop();
140
141
visitor(expr);
142
143
for
(
auto
&op : expr.operands())
144
stack.push(&op);
145
}
146
}
147
148
void
exprt::visit_pre
(std::function<
void
(
exprt
&)> visitor)
149
{
150
visit_pre_template
(visitor,
this
);
151
}
152
153
void
exprt::visit_pre
(std::function<
void
(
const
exprt
&)> visitor)
const
154
{
155
visit_pre_template
(visitor,
this
);
156
}
157
158
void
exprt::visit
(
expr_visitort
&visitor)
159
{
160
visit_pre
([&visitor](
exprt
&e) { visitor(e); });
161
}
162
163
void
exprt::visit
(
const_expr_visitort
&visitor)
const
164
{
165
visit_pre
([&visitor](
const
exprt
&e) { visitor(e); });
166
}
167
168
depth_iteratort
exprt::depth_begin
()
169
{
return
depth_iteratort
(*
this
); }
170
depth_iteratort
exprt::depth_end
()
171
{
return
depth_iteratort
(); }
172
const_depth_iteratort
exprt::depth_begin
()
const
173
{
return
const_depth_iteratort
(*
this
); }
174
const_depth_iteratort
exprt::depth_end
()
const
175
{
return
const_depth_iteratort
(); }
176
const_depth_iteratort
exprt::depth_cbegin
()
const
177
{
return
const_depth_iteratort
(*
this
); }
178
const_depth_iteratort
exprt::depth_cend
()
const
179
{
return
const_depth_iteratort
(); }
180
depth_iteratort
exprt::depth_begin
(std::function<
exprt
&()> mutate_root)
const
181
{
182
return
depth_iteratort
(*
this
, std::move(mutate_root));
183
}
184
185
const_unique_depth_iteratort
exprt::unique_depth_begin
()
const
186
{
return
const_unique_depth_iteratort
(*
this
); }
187
const_unique_depth_iteratort
exprt::unique_depth_end
()
const
188
{
return
const_unique_depth_iteratort
(); }
189
const_unique_depth_iteratort
exprt::unique_depth_cbegin
()
const
190
{
return
const_unique_depth_iteratort
(*
this
); }
191
const_unique_depth_iteratort
exprt::unique_depth_cend
()
const
192
{
return
const_unique_depth_iteratort
(); }
arith_tools.h
bitvector_types.h
Pre-defined bitvector types.
const_depth_iteratort
Definition
expr_iterator.h:221
const_expr_visitort
Definition
expr.h:380
const_unique_depth_iteratort
Definition
expr_iterator.h:289
depth_iteratort
Definition
expr_iterator.h:232
expr_visitort
Definition
expr.h:373
exprt::find_source_location
const source_locationt & find_source_location() const
Get a source_locationt from the expression or from its operands (non-recursively).
Definition
expr.cpp:68
exprt::is_one
bool is_one() const
Return whether the expression is a constant representing 1.
Definition
expr.cpp:58
exprt::is_true
bool is_true() const
Return whether the expression is a constant representing true.
Definition
expr.cpp:27
exprt::depth_end
depth_iteratort depth_end()
Definition
expr.cpp:170
exprt::depth_cend
const_depth_iteratort depth_cend() const
Definition
expr.cpp:178
exprt::exprt
exprt()
Definition
expr.h:62
exprt::unique_depth_end
const_unique_depth_iteratort unique_depth_end() const
Definition
expr.cpp:187
exprt::depth_begin
depth_iteratort depth_begin()
Definition
expr.cpp:168
exprt::unique_depth_cend
const_unique_depth_iteratort unique_depth_cend() const
Definition
expr.cpp:191
exprt::visit
void visit(class expr_visitort &visitor)
These are pre-order traversal visitors, i.e., the visitor is executed on a node before its children h...
Definition
expr.cpp:158
exprt::is_false
bool is_false() const
Return whether the expression is a constant representing false.
Definition
expr.cpp:34
exprt::is_zero
bool is_zero() const
Return whether the expression is a constant representing 0.
Definition
expr.cpp:47
exprt::visit_pre
void visit_pre(std::function< void(exprt &)>)
Definition
expr.cpp:148
exprt::depth_cbegin
const_depth_iteratort depth_cbegin() const
Definition
expr.cpp:176
exprt::visit_post
void visit_post(std::function< void(exprt &)>)
These are post-order traversal visitors, i.e., the visitor is executed on a node after its children h...
Definition
expr.cpp:119
exprt::operands
operandst & operands()
Definition
expr.h:95
exprt::source_location
const source_locationt & source_location() const
Definition
expr.h:236
exprt::unique_depth_cbegin
const_unique_depth_iteratort unique_depth_cbegin() const
Definition
expr.cpp:189
exprt::unique_depth_begin
const_unique_depth_iteratort unique_depth_begin() const
Definition
expr.cpp:185
irept::is_not_nil
bool is_not_nil() const
Definition
irep.h:372
source_locationt
Definition
source_location.h:20
source_locationt::nil
static const source_locationt & nil()
Definition
source_location.h:206
visit_post_template
void visit_post_template(std::function< void(T &)> visitor, T *_expr)
Definition
expr.cpp:86
visit_pre_template
static void visit_pre_template(std::function< void(T &)> visitor, T *_expr)
Definition
expr.cpp:130
expr_iterator.h
Forward depth-first search iterators These iterators' copy operations are expensive,...
expr_util.h
Deprecated expression utility functions.
fixedbv.h
ieee_float.h
rational.h
rational_tools.h
std_expr.h
API to expression classes.
util
expr.cpp
Generated by
1.17.0