Skip to content

Commit 74c2c3d

Browse files
Utility functions to get mode and language
1 parent 8b20ebb commit 74c2c3d

File tree

3 files changed

+54
-30
lines changed

3 files changed

+54
-30
lines changed

src/langapi/language_util.cpp

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,12 @@ Author: Daniel Kroening, [email protected]
1717
#include "language.h"
1818
#include "mode.h"
1919

20-
static std::unique_ptr<languaget> get_language(
21-
const namespacet &ns,
22-
const irep_idt &identifier)
23-
{
24-
const symbolt *symbol;
25-
26-
if(identifier=="" ||
27-
ns.lookup(identifier, symbol) ||
28-
symbol->mode=="")
29-
return get_default_language();
30-
31-
std::unique_ptr<languaget> ptr=get_language_from_mode(symbol->mode);
32-
33-
if(ptr==nullptr)
34-
throw "symbol `"+id2string(symbol->name)+
35-
"' has unknown mode '"+id2string(symbol->mode)+"'";
36-
37-
return ptr;
38-
}
39-
4020
std::string from_expr(
4121
const namespacet &ns,
4222
const irep_idt &identifier,
4323
const exprt &expr)
4424
{
45-
std::unique_ptr<languaget> p(get_language(ns, identifier));
25+
std::unique_ptr<languaget> p(get_language_from_identifier(ns, identifier));
4626

4727
std::string result;
4828
p->from_expr(expr, result, ns);
@@ -55,7 +35,7 @@ std::string from_type(
5535
const irep_idt &identifier,
5636
const typet &type)
5737
{
58-
std::unique_ptr<languaget> p(get_language(ns, identifier));
38+
std::unique_ptr<languaget> p(get_language_from_identifier(ns, identifier));
5939

6040
std::string result;
6141
p->from_type(type, result, ns);
@@ -68,7 +48,7 @@ std::string type_to_name(
6848
const irep_idt &identifier,
6949
const typet &type)
7050
{
71-
std::unique_ptr<languaget> p(get_language(ns, identifier));
51+
std::unique_ptr<languaget> p(get_language_from_identifier(ns, identifier));
7252

7353
std::string result;
7454
p->type_to_name(type, result, ns);
@@ -93,7 +73,7 @@ exprt to_expr(
9373
const irep_idt &identifier,
9474
const std::string &src)
9575
{
96-
std::unique_ptr<languaget> p(get_language(ns, identifier));
76+
std::unique_ptr<languaget> p(get_language_from_identifier(ns, identifier));
9777

9878
null_message_handlert null_message_handler;
9979
p->set_message_handler(null_message_handler);

src/langapi/mode.cpp

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ Author: Daniel Kroening, [email protected]
1818

1919
#include "language.h"
2020

21+
#include <util/invariant.h>
22+
#include <util/namespace.h>
23+
2124
struct language_entryt
2225
{
2326
language_factoryt factory;
@@ -39,15 +42,51 @@ void register_language(language_factoryt factory)
3942

4043
std::unique_ptr<languaget> get_language_from_mode(const irep_idt &mode)
4144
{
42-
for(languagest::const_iterator it=languages.begin();
43-
it!=languages.end();
44-
it++)
45-
if(mode==it->mode)
46-
return it->factory();
45+
for(const auto &language : languages)
46+
if(mode == language.mode)
47+
return language.factory();
4748

4849
return nullptr;
4950
}
5051

52+
/// Get the mode of the given identifier's symbol
53+
/// \param ns: a namespace
54+
/// \param identifier: an identifier
55+
/// \return the mode, e.g. `ID_C`, if the identifier is in the given
56+
/// symbol table, or `ID_unknown` otherwise
57+
const irep_idt &
58+
get_mode_from_identifier(const namespacet &ns, const irep_idt &identifier)
59+
{
60+
if(identifier.empty())
61+
return ID_unknown;
62+
const symbolt *symbol;
63+
if(ns.lookup(identifier, symbol))
64+
return ID_unknown;
65+
return symbol->mode;
66+
}
67+
68+
/// Get the language corresponding to the mode of the given identifier's symbol
69+
/// \param ns: a namespace
70+
/// \param identifier: an identifier
71+
/// \return the corresponding language if the mode is not `ID_unknown`, or
72+
/// the default language otherwise;
73+
/// Note: It is assumed as an invariant that languages of symbols in the symbol
74+
/// table have been registered.
75+
std::unique_ptr<languaget>
76+
get_language_from_identifier(const namespacet &ns, const irep_idt &identifier)
77+
{
78+
const irep_idt &mode = get_mode_from_identifier(ns, identifier);
79+
if(mode == ID_unknown)
80+
return get_default_language();
81+
82+
std::unique_ptr<languaget> language = get_language_from_mode(mode);
83+
INVARIANT(
84+
language,
85+
"symbol `" + id2string(identifier) + "' has unknown mode '" +
86+
id2string(mode) + "'");
87+
return language;
88+
}
89+
5190
std::unique_ptr<languaget> get_language_from_filename(
5291
const std::string &filename)
5392
{
@@ -85,6 +124,6 @@ std::unique_ptr<languaget> get_language_from_filename(
85124

86125
std::unique_ptr<languaget> get_default_language()
87126
{
88-
assert(!languages.empty());
127+
PRECONDITION(!languages.empty());
89128
return languages.front().factory();
90129
}

src/langapi/mode.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,13 @@ Author: Daniel Kroening, [email protected]
1515
#include <memory> // unique_ptr
1616

1717
class languaget;
18+
class namespacet;
1819

1920
std::unique_ptr<languaget> get_language_from_mode(const irep_idt &mode);
21+
const irep_idt &
22+
get_mode_from_identifier(const namespacet &ns, const irep_idt &identifier);
23+
std::unique_ptr<languaget>
24+
get_language_from_identifier(const namespacet &ns, const irep_idt &identifier);
2025
std::unique_ptr<languaget> get_language_from_filename(
2126
const std::string &filename);
2227
std::unique_ptr<languaget> get_default_language();

0 commit comments

Comments
 (0)