Skip to content

Commit 2a6d8a1

Browse files
committed
expr2smv: enum for precedence
This replaces the use of 'unsigned' and assorted integer literals for the expression precedence by an enum type.
1 parent 8cce1ce commit 2a6d8a1

File tree

1 file changed

+97
-45
lines changed

1 file changed

+97
-45
lines changed

src/smvlang/expr2smv.cpp

+97-45
Original file line numberDiff line numberDiff line change
@@ -21,33 +21,75 @@ class expr2smvt
2121
{
2222
}
2323

24-
bool convert_nondet_choice(const exprt &src, std::string &dest, unsigned precedence);
24+
protected:
25+
// In NuSMV 2.6., ! (not) has a high precedence (above ::), whereas
26+
// in the CMU SMV implementation it has the same as other boolean operators.
27+
// We use the CMU SMV precedence.
28+
enum class precedencet
29+
{
30+
MAX = 17,
31+
INDEX = 16, // [ ] , [ : ]
32+
CONCAT = 15, // ::
33+
UMINUS = 14, // - (unary minus)
34+
MULT = 13, // * / mod
35+
PLUS = 12, // + -
36+
SHIFT = 11, // << >>
37+
UNION = 10, // union
38+
IN = 9, // in
39+
REL = 8, // = != < > <= >=
40+
TEMP = 7, // AX, AF, etc.
41+
NOT = 6, // !
42+
AND = 5, // &
43+
OR = 4, // | xor xnor
44+
IF = 3, // (• ? • : •)
45+
IFF = 2, // <->
46+
IMPLIES = 1 // ->
47+
};
48+
49+
public:
50+
bool convert_nondet_choice(
51+
const exprt &src,
52+
std::string &dest,
53+
precedencet precedence);
2554

26-
bool convert_binary(const exprt &src, std::string &dest, const std::string &symbol, unsigned precedence);
55+
bool convert_binary(
56+
const exprt &src,
57+
std::string &dest,
58+
const std::string &symbol,
59+
precedencet precedence);
2760

2861
bool convert_unary(
2962
const unary_exprt &,
3063
std::string &dest,
3164
const std::string &symbol,
32-
unsigned precedence);
65+
precedencet precedence);
3366

3467
bool
35-
convert_index(const index_exprt &, std::string &dest, unsigned precedence);
68+
convert_index(const index_exprt &, std::string &dest, precedencet precedence);
3669

37-
bool convert(const exprt &src, std::string &dest, unsigned &precedence);
70+
bool convert(const exprt &src, std::string &dest, precedencet &precedence);
3871

3972
bool convert(const exprt &src, std::string &dest);
4073

41-
bool
42-
convert_symbol(const symbol_exprt &, std::string &dest, unsigned &precedence);
74+
bool convert_symbol(
75+
const symbol_exprt &,
76+
std::string &dest,
77+
precedencet &precedence);
4378

44-
bool convert_next_symbol(const exprt &src, std::string &dest, unsigned &precedence);
79+
bool convert_next_symbol(
80+
const exprt &src,
81+
std::string &dest,
82+
precedencet &precedence);
4583

46-
bool convert_constant(const exprt &src, std::string &dest, unsigned &precedence);
84+
bool convert_constant(
85+
const exprt &src,
86+
std::string &dest,
87+
precedencet &precedence);
4788

4889
bool convert_cond(const exprt &src, std::string &dest);
4990

50-
bool convert_norep(const exprt &src, std::string &dest, unsigned &precedence);
91+
bool
92+
convert_norep(const exprt &src, std::string &dest, precedencet &precedence);
5193

5294
bool convert(const typet &src, std::string &dest);
5395

@@ -94,8 +136,6 @@ The order of precedence from high to low is
94136
95137
*/
96138

97-
#define SMV_MAX_PRECEDENCE 21
98-
99139
/*******************************************************************\
100140
101141
Function: expr2smvt::convert_nondet_choice
@@ -111,7 +151,7 @@ Function: expr2smvt::convert_nondet_choice
111151
bool expr2smvt::convert_nondet_choice(
112152
const exprt &src,
113153
std::string &dest,
114-
unsigned precedence)
154+
precedencet precedence)
115155
{
116156
dest="{ ";
117157

@@ -187,7 +227,7 @@ bool expr2smvt::convert_binary(
187227
const exprt &src,
188228
std::string &dest,
189229
const std::string &symbol,
190-
unsigned precedence)
230+
precedencet precedence)
191231
{
192232
if(src.operands().size()<2)
193233
return convert_norep(src, dest, precedence);
@@ -206,7 +246,7 @@ bool expr2smvt::convert_binary(
206246
}
207247

208248
std::string op;
209-
unsigned p;
249+
precedencet p;
210250

211251
if(convert(*it, op, p)) return true;
212252

@@ -234,10 +274,10 @@ bool expr2smvt::convert_unary(
234274
const unary_exprt &src,
235275
std::string &dest,
236276
const std::string &symbol,
237-
unsigned precedence)
277+
precedencet precedence)
238278
{
239279
std::string op;
240-
unsigned p;
280+
precedencet p;
241281

242282
if(convert(src.op(), op, p))
243283
return true;
@@ -265,10 +305,10 @@ Function: expr2smvt::convert_index
265305
bool expr2smvt::convert_index(
266306
const index_exprt &src,
267307
std::string &dest,
268-
unsigned precedence)
308+
precedencet precedence)
269309
{
270310
std::string op;
271-
unsigned p;
311+
precedencet p;
272312

273313
if(convert(src.op0(), op, p)) return true;
274314

@@ -300,9 +340,9 @@ Function: expr2smvt::convert_norep
300340
bool expr2smvt::convert_norep(
301341
const exprt &src,
302342
std::string &dest,
303-
unsigned &precedence)
343+
precedencet &precedence)
304344
{
305-
precedence=SMV_MAX_PRECEDENCE;
345+
precedence = precedencet::MAX;
306346
dest=src.pretty();
307347
return false;
308348
}
@@ -322,9 +362,9 @@ Function: expr2smvt::convert_symbol
322362
bool expr2smvt::convert_symbol(
323363
const symbol_exprt &src,
324364
std::string &dest,
325-
unsigned &precedence)
365+
precedencet &precedence)
326366
{
327-
precedence=SMV_MAX_PRECEDENCE;
367+
precedence = precedencet::MAX;
328368

329369
auto &symbol = ns.lookup(src);
330370

@@ -348,7 +388,7 @@ Function: expr2smvt::convert_next_symbol
348388
bool expr2smvt::convert_next_symbol(
349389
const exprt &src,
350390
std::string &dest,
351-
unsigned &precedence)
391+
precedencet &precedence)
352392
{
353393
std::string tmp;
354394
convert_symbol(
@@ -374,9 +414,9 @@ Function: expr2smvt::convert_constant
374414
bool expr2smvt::convert_constant(
375415
const exprt &src,
376416
std::string &dest,
377-
unsigned &precedence)
417+
precedencet &precedence)
378418
{
379-
precedence=SMV_MAX_PRECEDENCE;
419+
precedence = precedencet::MAX;
380420

381421
const typet &type=src.type();
382422
const std::string &value=src.get_string(ID_value);
@@ -414,19 +454,19 @@ Function: expr2smvt::convert
414454
bool expr2smvt::convert(
415455
const exprt &src,
416456
std::string &dest,
417-
unsigned &precedence)
457+
precedencet &precedence)
418458
{
419-
precedence=SMV_MAX_PRECEDENCE;
459+
precedence = precedencet::MAX;
420460

421461
if(src.id()==ID_plus)
422-
return convert_binary(src, dest, "+", precedence=15);
462+
return convert_binary(src, dest, "+", precedence = precedencet::PLUS);
423463

424464
else if(src.id()==ID_minus)
425465
{
426466
if(src.operands().size()<2)
427467
return convert_norep(src, dest, precedence);
428-
else
429-
return convert_binary(src, dest, "-", precedence=15);
468+
else
469+
return convert_binary(src, dest, "-", precedence = precedencet::PLUS);
430470
}
431471

432472
else if(src.id()==ID_unary_minus)
@@ -435,53 +475,65 @@ bool expr2smvt::convert(
435475
return convert_norep(src, dest, precedence);
436476
else
437477
return convert_unary(
438-
to_unary_minus_expr(src), dest, "-", precedence = 17);
478+
to_unary_minus_expr(src), dest, "-", precedence = precedencet::UMINUS);
439479
}
440480

441481
else if(src.id()==ID_index)
442-
return convert_index(to_index_expr(src), dest, precedence = 20);
482+
return convert_index(
483+
to_index_expr(src), dest, precedence = precedencet::INDEX);
443484

444485
else if(src.id()==ID_mult || src.id()==ID_div)
445-
return convert_binary(src, dest, src.id_string(), precedence=16);
486+
return convert_binary(
487+
src, dest, src.id_string(), precedence = precedencet::MULT);
446488

447489
else if(src.id()==ID_lt || src.id()==ID_gt ||
448490
src.id()==ID_le || src.id()==ID_ge)
449-
return convert_binary(src, dest, src.id_string(), precedence=11);
491+
return convert_binary(
492+
src, dest, src.id_string(), precedence = precedencet::REL);
450493

451494
else if(src.id()==ID_equal)
452-
return convert_binary(src, dest, "=", precedence=11);
495+
return convert_binary(src, dest, "=", precedence = precedencet::REL);
453496

454497
else if(src.id()==ID_notequal)
455-
return convert_binary(src, dest, "!=", precedence=11);
498+
return convert_binary(src, dest, "!=", precedence = precedencet::REL);
456499

457500
else if(src.id()==ID_not)
458-
return convert_unary(to_not_expr(src), dest, "!", precedence = 6);
501+
return convert_unary(
502+
to_not_expr(src), dest, "!", precedence = precedencet::NOT);
459503

460504
else if(src.id()==ID_and)
461-
return convert_binary(src, dest, "&", precedence=5);
505+
return convert_binary(src, dest, "&", precedence = precedencet::AND);
462506

463507
else if(src.id()==ID_or)
464-
return convert_binary(src, dest, "|", precedence=4);
508+
return convert_binary(src, dest, "|", precedence = precedencet::OR);
465509

466510
else if(src.id()==ID_implies)
467-
return convert_binary(src, dest, "->", precedence=2);
511+
return convert_binary(src, dest, "->", precedence = precedencet::IMPLIES);
468512

469513
else if(src.id()==ID_iff)
470-
return convert_binary(src, dest, "<->", precedence=3);
514+
return convert_binary(src, dest, "<->", precedence = precedencet::IFF);
471515

472516
else if(
473517
src.id() == ID_AG || src.id() == ID_EG || src.id() == ID_AF ||
474518
src.id() == ID_EF || src.id() == ID_AX || src.id() == ID_EX ||
475519
src.id() == ID_G || src.id() == ID_F || src.id() == ID_X)
520+
{
476521
return convert_unary(
477-
to_unary_expr(src), dest, src.id_string() + " ", precedence = 7);
522+
to_unary_expr(src),
523+
dest,
524+
src.id_string() + " ",
525+
precedence = precedencet::TEMP);
526+
}
478527

479528
else if(
480529
src.id() == ID_AU || src.id() == ID_EU || src.id() == ID_AR ||
481530
src.id() == ID_ER || src.id() == ID_U || src.id() == ID_R)
482531
{
483532
return convert_binary(
484-
to_binary_expr(src), dest, src.id_string(), precedence = 7);
533+
to_binary_expr(src),
534+
dest,
535+
src.id_string(),
536+
precedence = precedencet::TEMP);
485537
}
486538

487539
else if(src.id()==ID_symbol)
@@ -528,7 +580,7 @@ Function: expr2smvt::convert
528580

529581
bool expr2smvt::convert(const exprt &src, std::string &dest)
530582
{
531-
unsigned precedence;
583+
precedencet precedence;
532584
return convert(src, dest, precedence);
533585
}
534586

0 commit comments

Comments
 (0)