Skip to content

Commit 75247c5

Browse files
committed
SMV: add enums to the parse tree
This adds enums as items to the parse tree data structure.
1 parent 9c8a850 commit 75247c5

File tree

10 files changed

+83
-0
lines changed

10 files changed

+83
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
KNOWNBUG
2+
name_collision1.smv
3+
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
--
7+
^warning: ignoring
8+
--
9+
This crashes.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
MODULE main
2+
3+
VAR some_var: { red, green, yellow, off };
4+
5+
-- identifier already used
6+
VAR red : boolean;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
name_collision2.smv
3+
4+
^file .* line 8: enum red already declared, at file .* line 3$
5+
^EXIT=2$
6+
^SIGNAL=0$
7+
--
8+
^warning: ignoring
9+
--
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
MODULE main
2+
3+
VAR red : boolean;
4+
5+
-- The identifier "red" is already used.
6+
-- NuSMV doesn't error this, but yields an error when attempting
7+
-- to use the identifier.
8+
VAR some_var: { red, green, yellow, off };
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
KNOWNBUG
2+
name_collision3.smv
3+
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
--
7+
^warning: ignoring
8+
--
9+
This crashes.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
MODULE submodule
2+
3+
MODULE main
4+
5+
VAR some_var: { red, green, yellow, off };
6+
7+
-- identifier already used
8+
VAR red : submodule;
9+

src/smvlang/parser.y

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,11 @@ enum_element: IDENTIFIER_Token
676676
{
677677
$$=$1;
678678
PARSER.module->enum_set.insert(stack_expr($1).id_string());
679+
680+
exprt expr(ID_symbol);
681+
expr.set(ID_identifier, stack_expr($1).id());
682+
PARSER.set_source_location(expr);
683+
PARSER.module->add_enum(std::move(expr));
679684
}
680685
;
681686

src/smvlang/smv_parse_tree.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ std::string to_string(smv_parse_treet::modulet::itemt::item_typet i)
7474
case smv_parse_treet::modulet::itemt::FAIRNESS: return "FAIRNESS";
7575
case smv_parse_treet::modulet::itemt::DEFINE:
7676
return "DEFINE";
77+
case smv_parse_treet::modulet::itemt::ENUM:
78+
return "ENUM";
7779
case smv_parse_treet::modulet::itemt::VAR:
7880
return "VAR";
7981

src/smvlang/smv_parse_tree.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class smv_parse_treet
4848
ASSIGN_NEXT,
4949
CTLSPEC,
5050
DEFINE,
51+
ENUM,
5152
FAIRNESS,
5253
INIT,
5354
INVAR,
@@ -127,6 +128,11 @@ class smv_parse_treet
127128
return item_type==INIT;
128129
}
129130

131+
bool is_enum() const
132+
{
133+
return item_type == ENUM;
134+
}
135+
130136
bool is_var() const
131137
{
132138
return item_type == VAR;
@@ -261,6 +267,12 @@ class smv_parse_treet
261267
items.emplace_back(itemt::VAR, std::move(expr), std::move(location));
262268
}
263269

270+
void add_enum(exprt expr)
271+
{
272+
auto location = expr.source_location();
273+
items.emplace_back(itemt::ENUM, std::move(expr), std::move(location));
274+
}
275+
264276
mc_varst vars;
265277
enum_sett enum_set;
266278

src/smvlang/smv_typecheck.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1877,6 +1877,7 @@ void smv_typecheckt::typecheck(
18771877
item.equal_expr().type() = bool_typet{};
18781878
return;
18791879

1880+
case smv_parse_treet::modulet::itemt::ENUM:
18801881
case smv_parse_treet::modulet::itemt::VAR:
18811882
return;
18821883
}
@@ -1984,6 +1985,19 @@ void smv_typecheckt::create_var_symbols(
19841985

19851986
symbol_table.insert(std::move(symbol));
19861987
}
1988+
else if(item.is_enum())
1989+
{
1990+
irep_idt base_name = to_symbol_expr(item.expr).get_identifier();
1991+
irep_idt identifier = module + "::var::" + id2string(base_name);
1992+
1993+
auto symbol_ptr = symbol_table.lookup(identifier);
1994+
if(symbol_ptr != nullptr)
1995+
{
1996+
throw errort{}.with_location(item.expr.source_location())
1997+
<< "enum " << base_name << " already declared, at "
1998+
<< symbol_ptr->location;
1999+
}
2000+
}
19872001
}
19882002
}
19892003

0 commit comments

Comments
 (0)