Skip to content

Commit 55e10d0

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 1975e77 commit 55e10d0

File tree

2 files changed

+98
-46
lines changed

2 files changed

+98
-46
lines changed

regression/ebmc/smv/smv_iff2.desc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CORE
22
smv_iff2.smv
33
--bdd
4-
^\[.*\] \(AG x != 5\) <-> \(x != 5 & AX AG x != 5\): PROVED$
4+
^\[.*\] AG x != 5 <-> x != 5 & AX AG x != 5: PROVED$
55
^EXIT=0$
66
^SIGNAL=0$
77
--

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+
TEMPORAL = 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,55 +475,67 @@ 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)
452495
{
453496
if(src.get_bool(ID_C_smv_iff))
454-
return convert_binary(src, dest, "<->", precedence = 16);
497+
return convert_binary(src, dest, "<->", precedence = precedencet::IFF);
455498
else
456-
return convert_binary(src, dest, "=", precedence = 11);
499+
return convert_binary(src, dest, "=", precedence = precedencet::REL);
457500
}
458501

459502
else if(src.id()==ID_notequal)
460-
return convert_binary(src, dest, "!=", precedence=11);
503+
return convert_binary(src, dest, "!=", precedence = precedencet::REL);
461504

462505
else if(src.id()==ID_not)
463-
return convert_unary(to_not_expr(src), dest, "!", precedence = 6);
506+
return convert_unary(
507+
to_not_expr(src), dest, "!", precedence = precedencet::NOT);
464508

465509
else if(src.id()==ID_and)
466-
return convert_binary(src, dest, "&", precedence=5);
510+
return convert_binary(src, dest, "&", precedence = precedencet::AND);
467511

468512
else if(src.id()==ID_or)
469-
return convert_binary(src, dest, "|", precedence=4);
513+
return convert_binary(src, dest, "|", precedence = precedencet::OR);
470514

471515
else if(src.id()==ID_implies)
472-
return convert_binary(src, dest, "->", precedence=2);
516+
return convert_binary(src, dest, "->", precedence = precedencet::IMPLIES);
473517

474518
else if(
475519
src.id() == ID_AG || src.id() == ID_EG || src.id() == ID_AF ||
476520
src.id() == ID_EF || src.id() == ID_AX || src.id() == ID_EX ||
477521
src.id() == ID_G || src.id() == ID_F || src.id() == ID_X)
522+
{
478523
return convert_unary(
479-
to_unary_expr(src), dest, src.id_string() + " ", precedence = 7);
524+
to_unary_expr(src),
525+
dest,
526+
src.id_string() + " ",
527+
precedence = precedencet::TEMPORAL);
528+
}
480529

481530
else if(
482531
src.id() == ID_AU || src.id() == ID_EU || src.id() == ID_AR ||
483532
src.id() == ID_ER || src.id() == ID_U || src.id() == ID_R)
484533
{
485534
return convert_binary(
486-
to_binary_expr(src), dest, src.id_string(), precedence = 7);
535+
to_binary_expr(src),
536+
dest,
537+
src.id_string(),
538+
precedence = precedencet::TEMPORAL);
487539
}
488540

489541
else if(src.id()==ID_symbol)
@@ -530,7 +582,7 @@ Function: expr2smvt::convert
530582

531583
bool expr2smvt::convert(const exprt &src, std::string &dest)
532584
{
533-
unsigned precedence;
585+
precedencet precedence;
534586
return convert(src, dest, precedence);
535587
}
536588

0 commit comments

Comments
 (0)