Skip to content

Commit 0bc85f0

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 acc4ccd commit 0bc85f0

File tree

4 files changed

+9
-4
lines changed

4 files changed

+9
-4
lines changed

src/smvlang/parser.y

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,7 @@ enum_list : enum_element
685685
enum_element: IDENTIFIER_Token
686686
{
687687
$$=$1;
688-
PARSER.module->enum_set.insert(stack_expr($1).id_string());
688+
PARSER.parse_tree.enum_set.insert(stack_expr($1).id_string());
689689

690690
exprt expr(ID_smv_identifier);
691691
expr.set(ID_identifier, stack_expr($1).id());
@@ -942,6 +942,7 @@ identifier : IDENTIFIER_Token
942942

943943
variable_identifier: complex_identifier
944944
{
945+
// Could be a variable, or an enum
945946
auto id = merge_complex_identifier(stack_expr($1));
946947
init($$, ID_smv_identifier);
947948
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 & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,11 @@ class smv_parse_treet
287287
}
288288

289289
mc_varst vars;
290-
enum_sett enum_set;
291290
};
292-
291+
292+
// enums are global
293+
enum_sett enum_set;
294+
293295
typedef std::unordered_map<irep_idt, modulet, irep_id_hash> modulest;
294296

295297
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)