Skip to content

Commit 22188b2

Browse files
committed
SMV: store module parse trees in a list
The modules in the SMV parse tree are now stored in a list in order to preserve the original ordering as in the source file.
1 parent da3c187 commit 22188b2

File tree

5 files changed

+31
-22
lines changed

5 files changed

+31
-22
lines changed

src/smvlang/parser.y

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,9 @@ static smv_parse_treet::modulet &new_module(YYSTYPE &module_name)
181181
{
182182
auto base_name = stack_expr(module_name).id_string();
183183
const std::string identifier=smv_module_symbol(base_name);
184-
auto &module=PARSER.parse_tree.modules[identifier];
184+
PARSER.parse_tree.module_list.push_back(smv_parse_treet::modulet{});
185+
auto &module=PARSER.parse_tree.module_list.back();
186+
PARSER.parse_tree.module_map[identifier] = --PARSER.parse_tree.module_list.end();
185187
module.name = identifier;
186188
module.base_name = base_name;
187189
PARSER.module = &module;

src/smvlang/smv_language.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,13 @@ void smv_languaget::dependencies(
6262
const std::string &module,
6363
std::set<std::string> &module_set)
6464
{
65-
smv_parse_treet::modulest::const_iterator
66-
m_it=smv_parse_tree.modules.find(module);
65+
smv_parse_treet::module_mapt::const_iterator m_it =
66+
smv_parse_tree.module_map.find(module);
6767

68-
if(m_it==smv_parse_tree.modules.end()) return;
68+
if(m_it == smv_parse_tree.module_map.end())
69+
return;
6970

70-
const smv_parse_treet::modulet &smv_module=m_it->second;
71+
const smv_parse_treet::modulet &smv_module = *m_it->second;
7172

7273
for(auto &element : smv_module.elements)
7374
if(element.is_var() && element.expr.type().id() == ID_smv_submodule)
@@ -89,10 +90,8 @@ Function: smv_languaget::modules_provided
8990

9091
void smv_languaget::modules_provided(std::set<std::string> &module_set)
9192
{
92-
for(smv_parse_treet::modulest::const_iterator
93-
it=smv_parse_tree.modules.begin();
94-
it!=smv_parse_tree.modules.end(); it++)
95-
module_set.insert(id2string(it->second.name));
93+
for(const auto &module : smv_parse_tree.module_list)
94+
module_set.insert(id2string(module.name));
9695
}
9796

9897
/*******************************************************************\

src/smvlang/smv_parse_tree.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ Function: smv_parse_treet::swap
2828

2929
void smv_parse_treet::swap(smv_parse_treet &smv_parse_tree)
3030
{
31-
smv_parse_tree.modules.swap(modules);
31+
smv_parse_tree.module_list.swap(module_list);
32+
smv_parse_tree.module_map.swap(module_map);
3233
}
3334

3435
/*******************************************************************\
@@ -45,7 +46,8 @@ Function: smv_parse_treet::clear
4546

4647
void smv_parse_treet::clear()
4748
{
48-
modules.clear();
49+
module_map.clear();
50+
module_list.clear();
4951
}
5052

5153
/*******************************************************************\
@@ -99,10 +101,8 @@ std::string to_string(smv_parse_treet::modulet::elementt::element_typet i)
99101

100102
void smv_parse_treet::show(std::ostream &out) const
101103
{
102-
for(auto &module_it : modules)
104+
for(auto &module : module_list)
103105
{
104-
auto &module = module_it.second;
105-
106106
out << "Module: " << module.name << std::endl << std::endl;
107107

108108
out << " PARAMETERS:\n";

src/smvlang/smv_parse_tree.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ Author: Daniel Kroening, kroening@kroening.com
1919
class smv_parse_treet
2020
{
2121
public:
22+
smv_parse_treet() = default;
23+
24+
// don't copy, contains pointers
25+
smv_parse_treet(const smv_parse_treet &) = delete;
26+
2227
typedef std::unordered_set<irep_idt, irep_id_hash> enum_sett;
2328

2429
struct modulet
@@ -287,11 +292,14 @@ class smv_parse_treet
287292

288293
enum_sett enum_set;
289294
};
290-
291-
typedef std::unordered_map<irep_idt, modulet, irep_id_hash> modulest;
292-
293-
modulest modules;
294-
295+
296+
using module_listt = std::list<modulet>;
297+
module_listt module_list;
298+
299+
using module_mapt =
300+
std::unordered_map<irep_idt, module_listt::iterator, irep_id_hash>;
301+
module_mapt module_map;
302+
295303
void swap(smv_parse_treet &smv_parse_tree);
296304
void clear();
297305

src/smvlang/smv_typecheck.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2552,14 +2552,14 @@ Function: smv_typecheckt::typecheck
25522552

25532553
void smv_typecheckt::typecheck()
25542554
{
2555-
smv_parse_treet::modulest::iterator it=smv_parse_tree.modules.find(module);
2555+
auto it = smv_parse_tree.module_map.find(module);
25562556

2557-
if(it==smv_parse_tree.modules.end())
2557+
if(it == smv_parse_tree.module_map.end())
25582558
{
25592559
throw errort() << "failed to find module " << module;
25602560
}
25612561

2562-
convert(it->second);
2562+
convert(*it->second);
25632563
}
25642564

25652565
/*******************************************************************\

0 commit comments

Comments
 (0)