@@ -88,6 +88,58 @@ Function: expr2smvt::convert_binary
88
88
\*******************************************************************/
89
89
90
90
expr2smvt::resultt expr2smvt::convert_binary (
91
+ const binary_exprt &src,
92
+ const std::string &symbol,
93
+ precedencet precedence)
94
+ {
95
+ std::string dest;
96
+
97
+ {
98
+ // lhs
99
+ auto lhs_rec = convert_rec (src.lhs ());
100
+
101
+ if (precedence >= lhs_rec.p )
102
+ dest += ' (' ;
103
+
104
+ dest += lhs_rec.s ;
105
+
106
+ if (precedence >= lhs_rec.p )
107
+ dest += ' )' ;
108
+ }
109
+
110
+ dest += ' ' ;
111
+ dest += symbol;
112
+ dest += ' ' ;
113
+
114
+ {
115
+ // rhs
116
+ auto rhs_rec = convert_rec (src.rhs ());
117
+
118
+ if (precedence >= rhs_rec.p )
119
+ dest += ' (' ;
120
+
121
+ dest += rhs_rec.s ;
122
+
123
+ if (precedence >= rhs_rec.p )
124
+ dest += ' )' ;
125
+ }
126
+
127
+ return {precedence, std::move (dest)};
128
+ }
129
+
130
+ /* ******************************************************************\
131
+
132
+ Function: expr2smvt::convert_binary_associative
133
+
134
+ Inputs:
135
+
136
+ Outputs:
137
+
138
+ Purpose:
139
+
140
+ \*******************************************************************/
141
+
142
+ expr2smvt::resultt expr2smvt::convert_binary_associative (
91
143
const exprt &src,
92
144
const std::string &symbol,
93
145
precedencet precedence)
@@ -112,10 +164,18 @@ expr2smvt::resultt expr2smvt::convert_binary(
112
164
113
165
auto op_rec = convert_rec (*it);
114
166
115
- if (precedence > op_rec.p )
167
+ // clang-format off
168
+ bool use_parentheses =
169
+ src.id () == it->id () ? false
170
+ : precedence >= op_rec.p ;
171
+ // clang-format on
172
+
173
+ if (use_parentheses)
116
174
dest += ' (' ;
175
+
117
176
dest += op_rec.s ;
118
- if (precedence > op_rec.p )
177
+
178
+ if (use_parentheses)
119
179
dest += ' )' ;
120
180
}
121
181
@@ -449,15 +509,10 @@ Function: expr2smvt::convert_rec
449
509
expr2smvt::resultt expr2smvt::convert_rec (const exprt &src)
450
510
{
451
511
if (src.id ()==ID_plus)
452
- return convert_binary (src, " +" , precedencet::PLUS);
512
+ return convert_binary_associative (src, " +" , precedencet::PLUS);
453
513
454
514
else if (src.id ()==ID_minus)
455
- {
456
- if (src.operands ().size ()<2 )
457
- return convert_norep (src);
458
- else
459
- return convert_binary (src, " -" , precedencet::PLUS);
460
- }
515
+ return convert_binary_associative (src, " -" , precedencet::PLUS);
461
516
462
517
else if (src.id ()==ID_unary_minus)
463
518
{
@@ -470,57 +525,65 @@ expr2smvt::resultt expr2smvt::convert_rec(const exprt &src)
470
525
else if (src.id ()==ID_index)
471
526
return convert_index (to_index_expr (src), precedencet::INDEX);
472
527
473
- else if (src.id ()==ID_mult || src.id ()==ID_div)
474
- return convert_binary (src, src.id_string (), precedencet::MULT);
528
+ else if (src.id () == ID_mult)
529
+ return convert_binary_associative (src, src.id_string (), precedencet::MULT);
530
+
531
+ else if (src.id () == ID_div)
532
+ return convert_binary (to_div_expr (src), src.id_string (), precedencet::MULT);
475
533
476
534
else if (src.id () == ID_mod)
477
- return convert_binary (src, src.id_string (), precedencet::MULT);
535
+ return convert_binary (to_mod_expr ( src) , src.id_string (), precedencet::MULT);
478
536
479
537
else if (src.id () == ID_smv_setin)
480
- return convert_binary (src, " in" , precedencet::IN);
538
+ return convert_binary (to_binary_expr ( src) , " in" , precedencet::IN);
481
539
482
540
else if (src.id () == ID_smv_setnotin)
483
- return convert_binary (src, " notin" , precedencet::IN);
541
+ return convert_binary (to_binary_expr ( src) , " notin" , precedencet::IN);
484
542
485
543
else if (src.id () == ID_smv_union)
486
- return convert_binary (src, " union" , precedencet::UNION);
544
+ return convert_binary (to_binary_expr ( src) , " union" , precedencet::UNION);
487
545
488
546
else if (src.id ()==ID_lt || src.id ()==ID_gt ||
489
547
src.id ()==ID_le || src.id ()==ID_ge)
490
- return convert_binary (src, src.id_string (), precedencet::REL);
548
+ return convert_binary (
549
+ to_binary_expr (src), src.id_string (), precedencet::REL);
491
550
492
551
else if (src.id ()==ID_equal)
493
552
{
494
- if (src.get_bool (ID_C_smv_iff))
495
- return convert_binary (src, " <->" , precedencet::IFF);
553
+ auto &equal_expr = to_equal_expr (src);
554
+
555
+ if (equal_expr.get_bool (ID_C_smv_iff))
556
+ return convert_binary (equal_expr, " <->" , precedencet::IFF);
496
557
else
497
- return convert_binary (src , " =" , precedencet::REL);
558
+ return convert_binary (equal_expr , " =" , precedencet::REL);
498
559
}
499
560
500
561
else if (src.id ()==ID_notequal)
501
- return convert_binary (src, " !=" , precedencet::REL);
562
+ return convert_binary (to_notequal_expr ( src) , " !=" , precedencet::REL);
502
563
503
564
else if (src.id ()==ID_not)
504
565
return convert_unary (to_not_expr (src), " !" , precedencet::NOT);
505
566
506
567
else if (src.id () == ID_and || src.id () == ID_bitand)
507
- return convert_binary (src, " &" , precedencet::AND);
568
+ return convert_binary_associative (src, " &" , precedencet::AND);
508
569
509
570
else if (src.id () == ID_or || src.id () == ID_bitor)
510
- return convert_binary (src, " |" , precedencet::OR);
571
+ return convert_binary_associative (src, " |" , precedencet::OR);
511
572
512
573
else if (src.id () == ID_implies || src.id () == ID_smv_bitimplies)
513
- return convert_binary (src, " ->" , precedencet::IMPLIES);
574
+ return convert_binary (to_binary_expr ( src) , " ->" , precedencet::IMPLIES);
514
575
515
576
else if (src.id () == ID_xor || src.id () == ID_bitxor)
516
- return convert_binary (src, " xor" , precedencet::OR);
577
+ return convert_binary_associative (src, " xor" , precedencet::OR);
517
578
518
579
else if (src.id () == ID_xnor || src.id () == ID_bitxnor)
519
580
{
581
+ auto &binary_expr = to_binary_expr (src);
582
+
520
583
if (src.get_bool (ID_C_smv_iff))
521
- return convert_binary (src , " <->" , precedencet::IFF);
584
+ return convert_binary (binary_expr , " <->" , precedencet::IFF);
522
585
else
523
- return convert_binary (src , " xnor" , precedencet::OR);
586
+ return convert_binary (binary_expr , " xnor" , precedencet::OR);
524
587
}
525
588
526
589
else if (
@@ -623,7 +686,8 @@ expr2smvt::resultt expr2smvt::convert_rec(const exprt &src)
623
686
624
687
else if (src.id () == ID_concatenation)
625
688
{
626
- return convert_binary (to_binary_expr (src), " ::" , precedencet::CONCAT);
689
+ return convert_binary_associative (
690
+ to_binary_expr (src), " ::" , precedencet::CONCAT);
627
691
}
628
692
629
693
else if (src.id () == ID_shl)
0 commit comments