Skip to content

Commit 493d603

Browse files
committed
SMV: enums are global
SMV's enum name space is global, i.e., crosses modules. This moves the resolution of identifier to variables or enums from the parser to the typechecking phase.
1 parent 91f0773 commit 493d603

File tree

4 files changed

+9
-5
lines changed

4 files changed

+9
-5
lines changed

src/smvlang/parser.y

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,7 @@ enum_list : enum_element
662662
enum_element: IDENTIFIER_Token
663663
{
664664
$$=$1;
665-
PARSER.module->enum_set.insert(stack_expr($1).id_string());
665+
PARSER.parse_tree.enum_set.insert(stack_expr($1).id_string());
666666
PARSER.module->add_enum(
667667
smv_identifier_exprt{stack_expr($1).id(), PARSER.source_location()});
668668
}
@@ -905,6 +905,7 @@ identifier : IDENTIFIER_Token
905905

906906
variable_identifier: complex_identifier
907907
{
908+
// Could be a variable, or an enum
908909
auto id = merge_complex_identifier(stack_expr($1));
909910
init($$, ID_smv_identifier);
910911
stack_expr($$).set(ID_identifier, id);

src/smvlang/smv_parse_tree.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ Function: smv_parse_treet::swap
2323
void smv_parse_treet::swap(smv_parse_treet &smv_parse_tree)
2424
{
2525
smv_parse_tree.modules.swap(modules);
26+
smv_parse_tree.enum_set.swap(enum_set);
2627
}
2728

2829
/*******************************************************************\

src/smvlang/smv_parse_tree.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -271,10 +271,11 @@ class smv_parse_treet
271271
auto location = expr.source_location();
272272
items.emplace_back(itemt::ENUM, std::move(expr), std::move(location));
273273
}
274-
275-
enum_sett enum_set;
276274
};
277-
275+
276+
// enums are global
277+
enum_sett enum_set;
278+
278279
typedef std::unordered_map<irep_idt, modulet, irep_id_hash> modulest;
279280

280281
modulest modules;

src/smvlang/smv_typecheck.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1895,7 +1895,8 @@ void smv_typecheckt::convert(exprt &expr)
18951895
identifier.find("::") == std::string::npos, "conversion is done once");
18961896

18971897
// enum or variable?
1898-
if(modulep->enum_set.find(identifier) == modulep->enum_set.end())
1898+
if(
1899+
smv_parse_tree.enum_set.find(identifier) == smv_parse_tree.enum_set.end())
18991900
{
19001901
std::string id = module + "::var::" + identifier;
19011902

0 commit comments

Comments
 (0)