CBMC
jsil_language.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Jsil Language
4 
5 Author: Michael Tautschnig, tautschn@amazon.com
6 
7 \*******************************************************************/
8 
11 
12 #include "jsil_language.h"
13 
14 #include <util/symbol_table.h>
15 #include <util/get_base_name.h>
16 
17 #include "expr2jsil.h"
18 #include "jsil_convert.h"
19 #include "jsil_entry_point.h"
21 #include "jsil_parser.h"
22 #include "jsil_typecheck.h"
23 
24 std::set<std::string> jsil_languaget::extensions() const
25 {
26  return { "jsil" };
27 }
28 
29 void jsil_languaget::modules_provided(std::set<std::string> &modules)
30 {
31  modules.insert(get_base_name(parse_path, true));
32 }
33 
36 {
37  if(jsil_convert(parse_tree, symbol_table, get_message_handler()))
38  return true;
39 
40  jsil_internal_additions(symbol_table);
41  return false;
42 }
43 
45  std::istream &,
46  const std::string &,
47  std::ostream &)
48 {
49  // there is no preprocessing!
50  return true;
51 }
52 
54  std::istream &instream,
55  const std::string &path)
56 {
57  // store the path
58  parse_path=path;
59 
60  // parsing
62  jsil_parser.set_file(path);
63  jsil_parser.in=&instream;
65 
67  bool result=jsil_parser.parse();
68 
69  // save result
71 
72  // save some memory
74 
75  return result;
76 }
77 
80  symbol_tablet &symbol_table,
81  const std::string &)
82 {
83  if(jsil_typecheck(symbol_table, get_message_handler()))
84  return true;
85 
86  return false;
87 }
88 
90  symbol_tablet &symbol_table)
91 {
92  return jsil_entry_point(
93  symbol_table,
95 }
96 
97 void jsil_languaget::show_parse(std::ostream &out)
98 {
99  parse_tree.output(out);
100 }
101 
102 std::unique_ptr<languaget> new_jsil_language()
103 {
104  return util_make_unique<jsil_languaget>();
105 }
106 
108  const exprt &expr,
109  std::string &code,
110  const namespacet &ns)
111 {
112  code=expr2jsil(expr, ns);
113  return false;
114 }
115 
117  const typet &type,
118  std::string &code,
119  const namespacet &ns)
120 {
121  code=type2jsil(type, ns);
122  return false;
123 }
124 
126  const std::string &code,
127  const std::string &,
128  exprt &expr,
129  const namespacet &ns)
130 {
131  expr.make_nil();
132  std::istringstream instream(code);
133 
134  // parsing
135 
136  jsil_parser.clear();
138  jsil_parser.in=&instream;
141 
142  bool result=jsil_parser.parse();
143 
144  if(jsil_parser.parse_tree.items.size()!=1)
145  result=true;
146  else
147  {
148  symbol_tablet symbol_table;
149  result=
150  jsil_convert(parse_tree, symbol_table, get_message_handler());
151 
152  if(symbol_table.symbols.size()!=1)
153  result=true;
154 
155  if(!result)
156  expr=symbol_table.symbols.begin()->second.value;
157 
158  // typecheck it
159  if(!result)
161  }
162 
163  // save some memory
164  jsil_parser.clear();
165 
166  return result;
167 }
168 
170 {
171 }
jsil_parse_treet::items
itemst items
Definition: jsil_parse_tree.h:104
get_base_name
std::string get_base_name(const std::string &in, bool strip_suffix)
cleans a filename from path and extension
Definition: get_base_name.cpp:16
symbol_tablet
The symbol table.
Definition: symbol_table.h:13
expr2jsil.h
jsil_scanner_init
void jsil_scanner_init()
jsil_internal_additions
void jsil_internal_additions(symbol_tablet &dest)
Definition: jsil_internal_additions.cpp:24
jsil_languaget::typecheck
virtual bool typecheck(symbol_tablet &context, const std::string &module) override
Converting from parse tree and type checking.
Definition: jsil_language.cpp:79
irept::make_nil
void make_nil()
Definition: irep.h:454
typet
The type of an expression, extends irept.
Definition: type.h:28
jsil_typecheck
bool jsil_typecheck(symbol_tablet &symbol_table, message_handlert &message_handler)
Definition: jsil_typecheck.cpp:900
jsil_languaget::show_parse
virtual void show_parse(std::ostream &out) override
Definition: jsil_language.cpp:97
jsil_languaget::~jsil_languaget
virtual ~jsil_languaget()
Definition: jsil_language.cpp:169
jsil_language.h
jsil_parser.h
jsil_languaget::interfaces
virtual bool interfaces(symbol_tablet &symbol_table) override
Adding symbols for all procedure declarations.
Definition: jsil_language.cpp:35
exprt
Base class for all expressions.
Definition: expr.h:55
irep_idt
dstringt irep_idt
Definition: irep.h:37
jsil_languaget::modules_provided
virtual void modules_provided(std::set< std::string > &modules) override
Definition: jsil_language.cpp:29
jsil_languaget::parse_tree
jsil_parse_treet parse_tree
Definition: jsil_language.h:75
jsil_parser
jsil_parsert jsil_parser
Definition: jsil_parser.cpp:14
jsil_parsert::parse_tree
jsil_parse_treet parse_tree
Definition: jsil_parser.h:24
jsil_languaget::to_expr
virtual bool to_expr(const std::string &code, const std::string &module, exprt &expr, const namespacet &ns) override
Parses the given string into an expression.
Definition: jsil_language.cpp:125
jsil_entry_point.h
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
jsil_parse_treet::output
void output(std::ostream &out) const
Definition: jsil_parse_tree.cpp:92
jsil_parsert::clear
virtual void clear() override
Definition: jsil_parser.h:31
messaget::result
mstreamt & result() const
Definition: message.h:409
parsert::in
std::istream * in
Definition: parser.h:26
jsil_languaget::parse_path
std::string parse_path
Definition: jsil_language.h:76
type2jsil
std::string type2jsil(const typet &type, const namespacet &ns)
Definition: expr2jsil.cpp:31
jsil_parse_treet::swap
void swap(jsil_parse_treet &other)
Definition: jsil_parse_tree.h:106
jsil_internal_additions.h
messaget::set_message_handler
virtual void set_message_handler(message_handlert &_message_handler)
Definition: message.h:179
jsil_convert.h
get_base_name.h
jsil_languaget::from_type
virtual bool from_type(const typet &type, std::string &code, const namespacet &ns) override
Formats the given type in a language-specific way.
Definition: jsil_language.cpp:116
jsil_languaget::preprocess
virtual bool preprocess(std::istream &instream, const std::string &path, std::ostream &outstream) override
Definition: jsil_language.cpp:44
jsil_languaget::generate_support_functions
virtual bool generate_support_functions(symbol_tablet &symbol_table) override
Create language-specific support functions, such as __CPROVER_start, __CPROVER_initialize and languag...
Definition: jsil_language.cpp:89
messaget::get_message_handler
message_handlert & get_message_handler()
Definition: message.h:184
jsil_entry_point
bool jsil_entry_point(symbol_tablet &symbol_table, message_handlert &message_handler)
Definition: jsil_entry_point.cpp:51
expr2jsil
std::string expr2jsil(const exprt &expr, const namespacet &ns)
Definition: expr2jsil.cpp:24
symbol_table_baset::symbols
const symbolst & symbols
Read-only field, used to look up symbols given their names.
Definition: symbol_table_base.h:30
jsil_typecheck.h
jsil_parsert::parse
virtual bool parse() override
Definition: jsil_parser.h:26
jsil_convert
bool jsil_convert(const jsil_parse_treet &parse_tree, symbol_tablet &symbol_table, message_handlert &message_handler)
Definition: jsil_convert.cpp:117
symbol_table.h
Author: Diffblue Ltd.
jsil_languaget::extensions
virtual std::set< std::string > extensions() const override
Definition: jsil_language.cpp:24
parsert::set_file
void set_file(const irep_idt &file)
Definition: parser.h:85
jsil_languaget::parse
virtual bool parse(std::istream &instream, const std::string &path) override
Definition: jsil_language.cpp:53
jsil_languaget::from_expr
virtual bool from_expr(const exprt &expr, std::string &code, const namespacet &ns) override
Formats the given expression in a language-specific way.
Definition: jsil_language.cpp:107
new_jsil_language
std::unique_ptr< languaget > new_jsil_language()
Definition: jsil_language.cpp:102