CBMC
language_file.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module:
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
9 
10 #ifndef CPROVER_LANGAPI_LANGUAGE_FILE_H
11 #define CPROVER_LANGAPI_LANGUAGE_FILE_H
12 
13 #include <iosfwd>
14 #include <map>
15 #include <memory> // unique_ptr
16 #include <set>
17 #include <string>
18 #include <unordered_set>
19 
20 #include <util/message.h>
21 #include <util/symbol_table_base.h>
22 
23 class language_filet;
24 class languaget;
25 class symbol_tablet;
26 
27 class language_modulet final
28 {
29 public:
30  std::string name;
33 
35  type_checked(false),
36  in_progress(false),
37  file(nullptr)
38  {}
39 };
40 
41 class language_filet final
42 {
43 public:
44  typedef std::set<std::string> modulest;
46 
47  std::unique_ptr<languaget> language;
48  std::string filename;
49 
50  void get_modules();
51 
53  const irep_idt &id,
54  symbol_table_baset &symbol_table);
55 
56  explicit language_filet(const std::string &filename);
57  language_filet(const language_filet &rhs);
58 
60 };
61 
63 {
64 private:
65  typedef std::map<std::string, language_filet> file_mapt;
67 
68  typedef std::map<std::string, language_modulet> module_mapt;
70 
71  // Contains pointers into file_map!
72  // This is safe-ish as long as this is std::map.
73  typedef std::map<irep_idt, language_filet *> lazy_method_mapt;
75 
76 public:
77  language_filet &add_file(const std::string &filename)
78  {
79  language_filet language_file(filename);
80  return file_map.emplace(filename, std::move(language_file)).first->second;
81  }
82 
83  void remove_file(const std::string &filename)
84  {
85  // Clear relevant entries from lazy_method_map
86  language_filet *language_file = &file_map.at(filename);
87  std::unordered_set<irep_idt> files_methods;
88  for(auto const &method : lazy_method_map)
89  {
90  if(method.second == language_file)
91  files_methods.insert(method.first);
92  }
93  for(const irep_idt &method_name : files_methods)
94  lazy_method_map.erase(method_name);
95 
96  file_map.erase(filename);
97  }
98 
99  void clear_files()
100  {
101  lazy_method_map.clear();
102  file_map.clear();
103  }
104 
105  bool parse();
106 
107  void show_parse(std::ostream &out);
108 
109  bool generate_support_functions(symbol_tablet &symbol_table);
110 
111  bool
112  typecheck(symbol_tablet &symbol_table, const bool keep_file_local = false);
113 
114  bool final(symbol_table_baset &symbol_table);
115 
116  bool interfaces(symbol_tablet &symbol_table);
117 
118  // The method must have been added to the symbol table and registered
119  // in lazy_method_map (currently always in language_filest::typecheck)
120  // for this to be legal.
122  const irep_idt &id,
123  symbol_table_baset &symbol_table)
124  {
125  PRECONDITION(symbol_table.has_symbol(id));
126  lazy_method_mapt::iterator it=lazy_method_map.find(id);
127  if(it!=lazy_method_map.end())
128  it->second->convert_lazy_method(id, symbol_table);
129  }
130 
131  bool can_convert_lazy_method(const irep_idt &id) const
132  {
133  return lazy_method_map.count(id) != 0;
134  }
135 
136  void clear()
137  {
138  file_map.clear();
139  module_map.clear();
140  lazy_method_map.clear();
141  }
142 
143 protected:
144  bool typecheck_module(
145  symbol_tablet &symbol_table,
146  language_modulet &module,
147  const bool keep_file_local);
148 
149  bool typecheck_module(
150  symbol_tablet &symbol_table,
151  const std::string &module,
152  const bool keep_file_local);
153 };
154 
155 #endif // CPROVER_UTIL_LANGUAGE_FILE_H
messaget
Class that provides messages with a built-in verbosity 'level'.
Definition: message.h:154
symbol_table_baset::has_symbol
bool has_symbol(const irep_idt &name) const
Check whether a symbol exists in the symbol table.
Definition: symbol_table_base.h:87
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
symbol_tablet
The symbol table.
Definition: symbol_table.h:13
language_filest::file_mapt
std::map< std::string, language_filet > file_mapt
Definition: language_file.h:65
language_filet::~language_filet
~language_filet()
To avoid compiler errors, the complete definition of a pointed-to type must be visible at the point a...
language_filest::lazy_method_map
lazy_method_mapt lazy_method_map
Definition: language_file.h:74
language_filet::get_modules
void get_modules()
Definition: language_file.cpp:33
language_filest::typecheck_module
bool typecheck_module(symbol_tablet &symbol_table, language_modulet &module, const bool keep_file_local)
Definition: language_file.cpp:222
language_filest::clear_files
void clear_files()
Definition: language_file.h:99
language_filest::module_mapt
std::map< std::string, language_modulet > module_mapt
Definition: language_file.h:68
language_filet::filename
std::string filename
Definition: language_file.h:48
language_filest::typecheck
bool typecheck(symbol_tablet &symbol_table, const bool keep_file_local=false)
Definition: language_file.cpp:83
language_filest::lazy_method_mapt
std::map< irep_idt, language_filet * > lazy_method_mapt
Definition: language_file.h:73
language_filet
Definition: language_file.h:41
language_modulet
Definition: language_file.h:27
language_filest::generate_support_functions
bool generate_support_functions(symbol_tablet &symbol_table)
Definition: language_file.cpp:163
language_filest::module_map
module_mapt module_map
Definition: language_file.h:69
language_filest::file_map
file_mapt file_map
Definition: language_file.h:66
language_modulet::file
language_filet * file
Definition: language_file.h:32
PRECONDITION
#define PRECONDITION(CONDITION)
Definition: invariant.h:463
symbol_table_baset
The symbol table base class interface.
Definition: symbol_table_base.h:21
language_filest::remove_file
void remove_file(const std::string &filename)
Definition: language_file.h:83
language_filest::show_parse
void show_parse(std::ostream &out)
Definition: language_file.cpp:45
language_modulet::name
std::string name
Definition: language_file.h:30
language_filest::add_file
language_filet & add_file(const std::string &filename)
Definition: language_file.h:77
language_filet::language
std::unique_ptr< languaget > language
Definition: language_file.h:47
language_filest::convert_lazy_method
void convert_lazy_method(const irep_idt &id, symbol_table_baset &symbol_table)
Definition: language_file.h:121
language_filet::modules
modulest modules
Definition: language_file.h:45
language_modulet::language_modulet
language_modulet()
Definition: language_file.h:34
language_filet::modulest
std::set< std::string > modulest
Definition: language_file.h:44
language_filest::clear
void clear()
Definition: language_file.h:136
language_filest::interfaces
bool interfaces(symbol_tablet &symbol_table)
Definition: language_file.cpp:192
language_filest::parse
bool parse()
Definition: language_file.cpp:51
languaget
Definition: language.h:37
language_modulet::in_progress
bool in_progress
Definition: language_file.h:31
language_filet::language_filet
language_filet(const std::string &filename)
Definition: language_file.cpp:28
language_filest::can_convert_lazy_method
bool can_convert_lazy_method(const irep_idt &id) const
Definition: language_file.h:131
symbol_table_base.h
Author: Diffblue Ltd.
message.h
language_modulet::type_checked
bool type_checked
Definition: language_file.h:31
language_filet::convert_lazy_method
void convert_lazy_method(const irep_idt &id, symbol_table_baset &symbol_table)
Definition: language_file.cpp:38
language_filest
Definition: language_file.h:62