-
Notifications
You must be signed in to change notification settings - Fork 273
/
Copy pathjson_symbol_table.cpp
55 lines (40 loc) · 1.42 KB
/
json_symbol_table.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*******************************************************************\
Module: JSON symbol table deserialization
Author: Chris Smowton, [email protected]
\*******************************************************************/
#include "json_symbol_table.h"
#include <util/exception_utils.h>
#include <util/json.h>
#include <util/symbol_table_base.h>
#include "json_symbol.h"
void symbol_table_from_json(const jsont &in, symbol_table_baset &symbol_table)
{
if(!in.is_object())
{
throw deserialization_exceptiont(
"symbol_table_from_json: JSON input must be an object");
}
const json_objectt &json_object = to_json_object(in);
const auto it = json_object.find("symbolTable");
if(it == json_object.end())
{
throw deserialization_exceptiont(
"symbol_table_from_json: JSON object must have key `symbolTable`");
}
if(!it->second.is_object())
{
throw deserialization_exceptiont(
"symbol_table_from_json: JSON symbol table must be an object");
}
const json_objectt &json_symbol_table = to_json_object(it->second);
for(const auto &pair : json_symbol_table)
{
const jsont &json_symbol = pair.second;
symbolt symbol = symbol_from_json(json_symbol);
if(symbol_table.add(symbol))
throw deserialization_exceptiont(
"symbol_table_from_json: duplicate symbol name `" +
id2string(symbol.name) + "`");
}
symbol_table.validate(validation_modet::EXCEPTION);
}