ESBMC
Efficient SMT-based Context-Bounded Model Checker
Loading...
Searching...
No Matches
c_expr2string.h
Go to the documentation of this file.
1#ifndef CPROVER_C_EXPR2STRING_H
2#define CPROVER_C_EXPR2STRING_H
3
4#include <map>
5#include <optional>
6#include <set>
8#include <util/irep/expr.h>
10#include <util/irep/std_code.h>
11
12std::string
13c_expr2string(const exprt &expr, const namespacet &ns, unsigned flags = 0);
14std::string
15c_type2string(const typet &type, const namespacet &ns, unsigned flags = 0);
16
18{
19public:
20 enum flagst : unsigned
21 {
33 };
34
35 c_expr2stringt(const namespacet &_ns, unsigned _flags)
36 : ns(_ns), flags(_flags)
37 {
38 }
39 virtual ~c_expr2stringt() = default;
40
41 virtual std::string convert(const typet &src);
42 virtual std::string convert(const exprt &src);
43
44 void get_shorthands(const exprt &expr);
45
46protected:
47 const namespacet &ns;
48 unsigned flags;
49
50 virtual std::string convert_rec(
51 const typet &src,
52 const c_qualifierst &qualifiers,
53 const std::string &declarator);
54
55 static std::string indent_str(unsigned indent);
56
57 std::set<exprt> symbols;
58 std::map<irep_idt, exprt> shorthands;
59 std::set<irep_idt> ns_collision;
60
61 void get_symbols(const exprt &expr);
62 std::string id_shorthand(const exprt &expr) const;
63
64 virtual std::string convert_typecast(const exprt &src, unsigned &precedence);
65
66 std::string convert_bitcast(const exprt &src, unsigned &precedence);
67
68 std::string
69 convert_implicit_address_of(const exprt &src, unsigned &precedence);
70
71 std::string convert_binary(
72 const exprt &src,
73 const std::string &symbol,
74 unsigned precedence,
75 bool full_parentheses);
76
77 std::string convert_cond(const exprt &src, unsigned precedence);
78
79 std::string
80 convert_struct_member_value(const exprt &src, unsigned precedence);
81
82 std::string convert_array_member_value(const exprt &src, unsigned precedence);
83
84 virtual std::string convert_member(const exprt &src, unsigned precedence);
85
86 std::string
87 convert_pointer_object_has_type(const exprt &src, unsigned precedence);
88
89 virtual std::string convert_array_of(const exprt &src, unsigned precedence);
90
91 std::string convert_trinary(
92 const exprt &src,
93 const std::string &symbol1,
94 const std::string &symbol2,
95 unsigned precedence);
96
97 std::string convert_overflow(const exprt &src, unsigned &precedence);
98
99 std::string convert_quantifier(
100 const exprt &src,
101 const std::string &symbol,
102 unsigned precedence);
103
104 std::string convert_with(const exprt &src, unsigned precedence);
105
106 std::string convert_index(const exprt &src, unsigned precedence);
107
108 std::string convert_byte_extract(const exprt &src, unsigned precedence);
109
110 std::string convert_byte_update(const exprt &src, unsigned precedence);
111
112 std::string convert_extractbit(const exprt &src, unsigned precedence);
113
114 std::string convert_sizeof(const exprt &src, unsigned precedence);
115
116 std::string convert_extract(const exprt &src);
117
118 std::string convert_unary(
119 const exprt &src,
120 const std::string &symbol,
121 unsigned precedence);
122
123 std::string convert_unary_post(
124 const exprt &src,
125 const std::string &symbol,
126 unsigned precedence);
127
128 std::string convert_function(
129 const exprt &src,
130 const std::string &symbol,
131 unsigned precedence);
132
133 std::string convert_Hoare(const exprt &src);
134
135 std::string convert_code(const codet &src);
136 virtual std::string convert_code(const codet &src, unsigned indent);
137 std::string convert_code_label(const code_labelt &src, unsigned indent);
138 std::string
139 convert_code_switch_case(const code_switch_caset &src, unsigned indent);
140 std::string convert_code_asm(const codet &src, unsigned indent);
141 virtual std::string convert_code_assign(const codet &src, unsigned indent);
142 virtual std::string convert_code_free(const codet &src, unsigned indent);
143 std::string convert_code_init(const codet &src, unsigned indent);
144 std::string convert_code_ifthenelse(const codet &src, unsigned indent);
145 std::string convert_code_for(const codet &src, unsigned indent);
146 std::string convert_code_while(const codet &src, unsigned indent);
147 std::string convert_code_dowhile(const codet &src, unsigned indent);
148 std::string convert_code_block(const codet &src, unsigned indent);
149 std::string convert_code_expression(const codet &src, unsigned indent);
150 virtual std::string convert_code_return(const codet &src, unsigned indent);
151 std::string convert_code_goto(const codet &src, unsigned indent);
152 std::string convert_code_gcc_goto(const codet &src, unsigned indent);
153 virtual std::string convert_code_assume(const codet &src, unsigned indent);
154 virtual std::string convert_code_assert(const codet &src, unsigned indent);
155 std::string convert_code_break(const codet &src, unsigned indent);
156 std::string convert_code_switch(const codet &src, unsigned indent);
157 std::string convert_code_continue(const codet &src, unsigned indent);
158 virtual std::string convert_code_decl(const codet &src, unsigned indent);
159 std::string convert_code_decl_block(const codet &src, unsigned indent);
160 std::string convert_code_dead(const codet &src, unsigned indent);
161 std::string
162 convert_code_function_call(const code_function_callt &src, unsigned indent);
163 std::string convert_code_lock(const codet &src, unsigned indent);
164 std::string convert_code_unlock(const codet &src, unsigned indent);
165 virtual std::string convert_code_printf(const codet &src, unsigned indent);
166
167 virtual std::string convert(const exprt &src, unsigned &precedence);
168
169 std::string convert_function_call(const exprt &src, unsigned &precedence);
170 virtual std::string convert_malloc(const exprt &src, unsigned &precedence);
171 virtual std::string convert_realloc(const exprt &src, unsigned &precedence);
172 virtual std::string convert_alloca(const exprt &src, unsigned &precedence);
173 virtual std::string convert_nondet(const exprt &src, unsigned &precedence);
174 std::string
175 convert_statement_expression(const exprt &src, unsigned &precedence);
176
177 virtual std::string convert_symbol(const exprt &src, unsigned &precedence);
178 std::string convert_predicate_symbol(const exprt &src, unsigned &precedence);
179 std::string
180 convert_predicate_next_symbol(const exprt &src, unsigned &precedence);
181 std::string convert_nondet_symbol(const exprt &src, unsigned &precedence);
182 std::string convert_quantified_symbol(const exprt &src, unsigned &precedence);
183 std::string convert_nondet_bool(const exprt &src, unsigned &precedence);
184 std::string convert_object_descriptor(const exprt &src, unsigned &precedence);
185 virtual std::string convert_constant(const exprt &src, unsigned &precedence);
186
187 std::string convert_norep(const exprt &src, unsigned &precedence);
188
189 virtual std::string convert_struct_union_body(
190 const exprt &src,
191 const exprt::operandst &operands,
192 const struct_union_typet::componentst &components);
193 virtual std::string convert_struct(const exprt &src, unsigned &precedence);
194 virtual std::string convert_union(const exprt &src, unsigned &precedence);
195 std::string convert_array(const exprt &src, unsigned &precedence);
196 std::string convert_array_list(const exprt &src, unsigned &precedence);
197
198 std::optional<std::string> is_recursively_zero(const exprt &op);
199};
200
201#endif
std::string c_expr2string(const exprt &expr, const namespacet &ns, unsigned flags=0)
Definition c_expr2string.cpp:2796
std::string c_type2string(const typet &type, const namespacet &ns, unsigned flags=0)
Definition c_expr2string.cpp:2805
virtual std::string convert_code_return(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1579
std::string convert_Hoare(const exprt &src)
Definition c_expr2string.cpp:2135
std::string convert_code_asm(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1487
std::string convert_extractbit(const exprt &src, unsigned precedence)
Definition c_expr2string.cpp:2178
void get_shorthands(const exprt &expr)
Definition c_expr2string.cpp:40
std::string convert_byte_update(const exprt &src, unsigned precedence)
Definition c_expr2string.cpp:899
std::string convert_code_continue(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1669
virtual std::string convert(const typet &src)
Definition c_expr2string.cpp:64
std::string convert_function_call(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1417
std::string convert_quantifier(const exprt &src, const std::string &symbol, unsigned precedence)
Definition c_expr2string.cpp:439
std::string convert_code_gcc_goto(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1609
std::string convert_statement_expression(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:723
virtual std::string convert_struct(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1303
std::string convert_array(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1355
std::string convert_array_list(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1385
static std::string indent_str(unsigned indent)
Definition c_expr2string.cpp:1479
virtual std::string convert_member(const exprt &src, unsigned precedence)
Definition c_expr2string.cpp:970
std::string convert_code_switch(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1629
std::string convert_cond(const exprt &src, unsigned precedence)
Definition c_expr2string.cpp:546
std::string convert_unary_post(const exprt &src, const std::string &symbol, unsigned precedence)
Definition c_expr2string.cpp:925
virtual std::string convert_constant(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1125
virtual ~c_expr2stringt()=default
virtual std::string convert_typecast(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:298
std::string convert_code_init(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1953
std::string id_shorthand(const exprt &expr) const
Definition c_expr2string.cpp:14
std::string convert_array_member_value(const exprt &src, unsigned precedence)
Definition c_expr2string.cpp:1028
std::optional< std::string > is_recursively_zero(const exprt &op)
Definition c_expr2string.cpp:758
std::string convert_function(const exprt &src, const std::string &symbol, unsigned precedence)
Definition c_expr2string.cpp:734
std::string convert_struct_member_value(const exprt &src, unsigned precedence)
Definition c_expr2string.cpp:1038
virtual std::string convert_code_assign(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1930
std::string convert_object_descriptor(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1104
std::string convert_predicate_symbol(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1079
virtual std::string convert_symbol(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1053
std::string convert_byte_extract(const exprt &src, unsigned precedence)
Definition c_expr2string.cpp:877
std::string convert_code_expression(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1818
std::string convert_with(const exprt &src, unsigned precedence)
Definition c_expr2string.cpp:491
std::string convert_code_while(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1495
std::string convert_quantified_symbol(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1093
std::string convert_sizeof(const exprt &src, unsigned precedence)
Definition c_expr2string.cpp:2191
flagst
Definition c_expr2string.h:21
@ SHORT_ZERO_COMPOUNDS
Special case constant zero expressions where C allows a shorter output such as { 0 }...
Definition c_expr2string.h:26
@ UNIQUE_FLOAT_REPR
Output enough fractional digits such that the float can be recovered uniquely.
Definition c_expr2string.h:32
std::string convert_nondet_symbol(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1072
std::string convert_code_function_call(const code_function_callt &src, unsigned indent)
Definition c_expr2string.cpp:1983
std::string convert_code(const codet &src)
Definition c_expr2string.cpp:2130
virtual std::string convert_realloc(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:676
c_expr2stringt(const namespacet &_ns, unsigned _flags)
Definition c_expr2string.h:35
std::string convert_overflow(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1456
virtual std::string convert_code_assume(const codet &src, unsigned indent)
Definition c_expr2string.cpp:2069
std::string convert_pointer_object_has_type(const exprt &src, unsigned precedence)
Definition c_expr2string.cpp:636
std::string convert_code_ifthenelse(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1547
std::string convert_code_for(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1758
std::string convert_code_break(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1619
std::string convert_bitcast(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:347
unsigned flags
Definition c_expr2string.h:48
virtual std::string convert_code_assert(const codet &src, unsigned indent)
Definition c_expr2string.cpp:2057
virtual std::string convert_nondet(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:715
std::string convert_binary(const exprt &src, const std::string &symbol, unsigned precedence, bool full_parentheses)
Definition c_expr2string.cpp:578
std::set< exprt > symbols
Definition c_expr2string.h:57
std::string convert_norep(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1048
std::string convert_code_label(const code_labelt &src, unsigned indent)
Definition c_expr2string.cpp:2081
std::string convert_code_block(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1797
virtual std::string convert_array_of(const exprt &src, unsigned precedence)
Definition c_expr2string.cpp:839
virtual std::string convert_alloca(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:657
std::string convert_code_unlock(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1972
std::string convert_code_dowhile(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1520
virtual std::string convert_code_free(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1942
std::set< irep_idt > ns_collision
Definition c_expr2string.h:59
void get_symbols(const exprt &expr)
Definition c_expr2string.cpp:31
std::string convert_implicit_address_of(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:378
std::string convert_code_dead(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1692
std::string convert_trinary(const exprt &src, const std::string &symbol1, const std::string &symbol2, unsigned precedence)
Definition c_expr2string.cpp:388
virtual std::string convert_union(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1320
std::string convert_code_goto(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1598
std::string convert_extract(const exprt &src)
Definition c_expr2string.cpp:2203
std::string convert_code_switch_case(const code_switch_caset &src, unsigned indent)
Definition c_expr2string.cpp:2097
std::string convert_index(const exprt &src, unsigned precedence)
Definition c_expr2string.cpp:947
virtual std::string convert_code_printf(const codet &src, unsigned indent)
Definition c_expr2string.cpp:2036
std::string convert_unary(const exprt &src, const std::string &symbol, unsigned precedence)
Definition c_expr2string.cpp:615
virtual std::string convert_code_decl(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1704
virtual std::string convert_malloc(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:696
std::string convert_code_lock(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1960
std::string convert_code_decl_block(const codet &src, unsigned indent)
Definition c_expr2string.cpp:1679
std::map< irep_idt, exprt > shorthands
Definition c_expr2string.h:58
virtual std::string convert_struct_union_body(const exprt &src, const exprt::operandst &operands, const struct_union_typet::componentst &components)
Definition c_expr2string.cpp:1241
virtual std::string convert_rec(const typet &src, const c_qualifierst &qualifiers, const std::string &declarator)
Definition c_expr2string.cpp:69
std::string convert_nondet_bool(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1099
const namespacet & ns
Definition c_expr2string.h:47
std::string convert_predicate_next_symbol(const exprt &src, unsigned &precedence)
Definition c_expr2string.cpp:1086
Definition c_qualifiers.h:7
A `switch' instruction */ class code_switcht : public codet { public: inline code_switcht() : codet("...
Definition std_code.h:574
Definition std_code.h:667
A switch-case.
Definition std_code.h:710
Definition std_code.h:8
Definition expr.h:34
std::vector< exprt > operandst
Definition expr.h:39
Definition namespace.h:10
std::vector< componentt > componentst
Definition std_types.h:182
Definition type.h:9