cprover
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 <set>
15 #include <map>
16 #include <string>
17 #include <memory> // unique_ptr
18 
19 #include <util/message.h>
20 #include <util/symbol_table.h>
21 
22 #include "language.h"
23 
24 class language_filet;
25 
26 class language_modulet final
27 {
28 public:
29  std::string name;
32 
34  type_checked(false),
35  in_progress(false),
36  file(nullptr)
37  {}
38 };
39 
40 class language_filet final
41 {
42 public:
43  typedef std::set<std::string> modulest;
45 
46  std::unique_ptr<languaget> language;
47  std::string filename;
48 
49  void get_modules();
50 
52  const irep_idt &id,
53  symbol_table_baset &symbol_table);
54 
55  explicit language_filet(const std::string &filename);
56  language_filet(const language_filet &rhs);
57 
59 };
60 
62 {
63 private:
64  typedef std::map<std::string, language_filet> file_mapt;
66 
67  typedef std::map<std::string, language_modulet> module_mapt;
69 
70  // Contains pointers into file_map!
71  // This is safe-ish as long as this is std::map.
72  typedef std::map<irep_idt, language_filet *> lazy_method_mapt;
74 
75 public:
76  language_filet &add_file(const std::string &filename)
77  {
78  language_filet language_file(filename);
79  return file_map.emplace(filename, std::move(language_file)).first->second;
80  }
81 
82  void remove_file(const std::string &filename)
83  {
84  // Clear relevant entries from lazy_method_map
85  language_filet *language_file = &file_map.at(filename);
86  std::unordered_set<irep_idt> files_methods;
87  for(const std::pair<irep_idt, language_filet *> &method : lazy_method_map)
88  {
89  if(method.second == language_file)
90  files_methods.insert(method.first);
91  }
92  for(const irep_idt &method_name : files_methods)
93  lazy_method_map.erase(method_name);
94 
95  file_map.erase(filename);
96  }
97 
98  void clear_files()
99  {
100  lazy_method_map.clear();
101  file_map.clear();
102  }
103 
104  void set_should_generate_opaque_method_stubs(bool stubs_enabled);
105 
106  bool parse();
107 
108  void show_parse(std::ostream &out);
109 
110  bool generate_support_functions(symbol_tablet &symbol_table);
111 
112  bool typecheck(symbol_tablet &symbol_table);
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 
148  bool typecheck_module(
149  symbol_tablet &symbol_table,
150  const std::string &module);
151 };
152 
153 #endif // CPROVER_UTIL_LANGUAGE_FILE_H
void convert_lazy_method(const irep_idt &id, symbol_table_baset &symbol_table)
void show_parse(std::ostream &out)
bool interfaces(symbol_tablet &symbol_table)
language_filet & add_file(const std::string &filename)
Definition: language_file.h:76
std::set< std::string > modulest
Definition: language_file.h:43
bool can_convert_lazy_method(const irep_idt &id) const
std::unique_ptr< languaget > language
Definition: language_file.h:46
bool typecheck_module(symbol_tablet &symbol_table, language_modulet &module)
The symbol table.
Definition: symbol_table.h:19
std::map< std::string, language_filet > file_mapt
Definition: language_file.h:64
Abstract interface to support a programming language.
bool typecheck(symbol_tablet &symbol_table)
#define PRECONDITION(CONDITION)
Definition: invariant.h:230
std::map< irep_idt, language_filet * > lazy_method_mapt
Definition: language_file.h:72
lazy_method_mapt lazy_method_map
Definition: language_file.h:73
std::map< std::string, language_modulet > module_mapt
Definition: language_file.h:67
language_filet(const std::string &filename)
void set_should_generate_opaque_method_stubs(bool stubs_enabled)
Turn on or off stub generation for all the languages.
Author: Diffblue Ltd.
std::string name
Definition: language_file.h:29
bool has_symbol(const irep_idt &name) const
Check whether a symbol exists in the symbol table.
~language_filet()
To avoid compiler errors, the complete definition of a pointed-to type must be visible at the point a...
modulest modules
Definition: language_file.h:44
The symbol table base class interface.
file_mapt file_map
Definition: language_file.h:65
std::string filename
Definition: language_file.h:47
void remove_file(const std::string &filename)
Definition: language_file.h:82
bool generate_support_functions(symbol_tablet &symbol_table)
void convert_lazy_method(const irep_idt &id, symbol_table_baset &symbol_table)
module_mapt module_map
Definition: language_file.h:68
language_filet * file
Definition: language_file.h:31
Definition: kdev_t.h:19