17 language(rhs.language==nullptr?nullptr:rhs.language->new_language()),
18 filename(rhs.filename)
42 for(file_mapt::iterator it=file_map.begin();
43 it!=file_map.end(); it++)
44 it->second.language->show_parse(out);
49 for(file_mapt::iterator it=file_map.begin();
50 it!=file_map.end(); it++)
54 std::ifstream infile(it->first);
58 error() <<
"Failed to open " << it->first << eom;
66 if(language.
parse(infile, it->first))
68 error() <<
"Parsing of " << it->first <<
" failed" << eom;
74 it->second.get_modules();
84 for(file_mapt::iterator it=file_map.begin();
85 it!=file_map.end(); it++)
87 if(it->second.language->interfaces(symbol_table))
93 unsigned collision_counter=0;
95 for(file_mapt::iterator fm_it=file_map.begin();
96 fm_it!=file_map.end(); fm_it++)
99 fm_it->second.modules;
101 for(language_filet::modulest::const_iterator
102 mo_it=modules.begin();
103 mo_it!=modules.end();
107 std::string module_name=*mo_it;
109 while(module_map.find(module_name)!=module_map.end())
111 module_name=*mo_it+
"#"+std::to_string(collision_counter);
116 module.
file=&fm_it->second;
117 module.
name=module_name;
119 std::pair<std::string, language_modulet>(module.
name, module));
125 for(file_mapt::iterator it=file_map.begin();
126 it!=file_map.end(); it++)
128 if(it->second.modules.empty())
130 if(it->second.language->typecheck(symbol_table,
""))
135 std::set<irep_idt> lazy_method_ids;
136 it->second.language->lazy_methods_provided(lazy_method_ids);
137 for(
const auto &
id : lazy_method_ids)
138 lazy_method_map[id]=&it->second;
144 for(module_mapt::iterator it=module_map.begin();
145 it!=module_map.end(); it++)
147 if(typecheck_module(symbol_table, it->second))
159 for(file_mapt::iterator it=file_map.begin();
160 it!=file_map.end(); it++)
162 if(languages.insert(it->second.language->id()).second)
163 if(it->second.language->final(symbol_table))
173 for(file_mapt::iterator it=file_map.begin();
174 it!=file_map.end(); it++)
176 if(it->second.language->interfaces(symbol_table))
185 const std::string &module)
189 module_mapt::iterator it=module_map.find(module);
191 if(it==module_map.end())
193 error() <<
"found no file that provides module " << module << eom;
197 return typecheck_module(symbol_table, it->second);
213 error() <<
"circular dependency in " << module.
name << eom;
221 std::set<std::string> dependency_set;
225 for(std::set<std::string>::const_iterator it=
226 dependency_set.begin();
227 it!=dependency_set.end();
230 if(typecheck_module(symbol_table, *it))
239 status() <<
"Type-checking " << module.
name << eom;
void show_parse(std::ostream &out)
bool interfaces(symbol_tablet &symbol_table)
std::set< std::string > modulest
virtual void modules_provided(std::set< std::string > &modules)
virtual bool typecheck(symbol_tablet &symbol_table, const std::string &module)=0
bool typecheck_module(symbol_tablet &symbol_table, language_modulet &module)
Abstract interface to support a programming language.
bool typecheck(symbol_tablet &symbol_table)
bool final(symbol_tablet &symbol_table)
virtual void dependencies(const std::string &module, std::set< std::string > &modules)
void convert_lazy_method(const irep_idt &id, symbol_tablet &symbol_table)
virtual void convert_lazy_method(const irep_idt &id, symbol_tablet &)
virtual bool parse(std::istream &instream, const std::string &path)=0