Bash++
Bash++ compiler internal documentation
bpp.h
Go to the documentation of this file.
1 
6 #ifndef SRC_BPP_INCLUDE_BPP_H_
7 #define SRC_BPP_INCLUDE_BPP_H_
8 
9 #include <string>
10 #include <sstream>
11 #include <vector>
12 #include <unordered_map>
13 #include <memory>
14 
15 #include "replace_all.h"
16 
17 namespace bpp {
18 
19 enum bpp_scope {
24 };
25 
30 };
31 
32 // Forward declarations
33 
34 class bpp_entity;
35 class bpp_code_entity;
36 class bpp_string;
37 class bpp_method;
38 class bpp_method_parameter;
39 class bpp_class;
40 class bpp_object;
41 class bpp_datamember;
42 class bpp_program;
43 
44 // Statement types
45 class bash_while_loop;
46 class bash_while_condition;
47 class bash_if;
48 class bash_if_branch;
49 class bash_case;
50 class bash_case_pattern;
51 class bash_for;
52 class bash_function;
53 class bpp_delete_statement;
54 class bpp_dynamic_cast_statement;
55 class bpp_pointer_dereference;
56 class bpp_value_assignment;
57 class bpp_object_assignment;
58 class bpp_object_reference;
59 class bpp_object_address;
60 
65 static const std::shared_ptr<bpp_entity> inaccessible_entity = std::make_shared<bpp_entity>();
66 
71 static const std::shared_ptr<bpp_datamember> inaccessible_datamember = std::make_shared<bpp_datamember>();
72 
77 static const std::shared_ptr<bpp_method> inaccessible_method = std::make_shared<bpp_method>();
78 
83 static const char bpp_nullptr[] = "0";
84 
92 class bpp_entity {
93  protected:
98  std::unordered_map<std::string, std::shared_ptr<bpp_class>> classes;
99 
104  std::unordered_map<std::string, std::shared_ptr<bpp_object>> objects;
105 
110  std::unordered_map<std::string, std::shared_ptr<bpp_object>> local_objects;
111  std::shared_ptr<bpp_class> type = nullptr;
112  std::weak_ptr<bpp_class> containing_class;
113  std::vector<std::shared_ptr<bpp_class>> parents;
114  public:
115  virtual ~bpp_entity() = default;
116  virtual bool add_class(std::shared_ptr<bpp_class> class_);
117  virtual bool add_object(std::shared_ptr<bpp_object> object, bool make_local = false);
118 
119  virtual std::shared_ptr<bpp_class> get_class() const;
120  virtual std::string get_address() const;
121  virtual std::string get_name() const;
122  virtual std::weak_ptr<bpp::bpp_class> get_containing_class() const;
123  virtual bool set_containing_class(std::weak_ptr<bpp::bpp_class> containing_class);
124 
125  virtual void inherit(std::shared_ptr<bpp_entity> parent);
126  virtual void inherit(std::shared_ptr<bpp_class> parent);
127 
128  virtual std::unordered_map<std::string, std::shared_ptr<bpp_class>> get_classes() const;
129  virtual std::unordered_map<std::string, std::shared_ptr<bpp_object>> get_objects() const;
130  virtual std::shared_ptr<bpp_class> get_class(const std::string& name);
131  virtual std::shared_ptr<bpp_object> get_object(const std::string& name);
132 };
133 
151 class bpp_code_entity : public bpp_entity {
152  protected:
153  std::shared_ptr<std::ostream> code = std::make_shared<std::ostringstream>();
154  std::string nextline_buffer = "";
155  std::string postline_buffer = "";
156  bool buffers_flushed = false;
157  public:
158  bpp_code_entity();
159 
160  virtual void add_code(const std::string& code, bool add_newline = true);
161  virtual void add_code_to_previous_line(const std::string& code);
162  virtual void add_code_to_next_line(const std::string& code);
163 
164  bool add_object(std::shared_ptr<bpp_object> object, bool make_local = false) override;
165 
166  virtual void flush_nextline_buffer();
167  virtual void flush_postline_buffer();
168  virtual void flush_code_buffers();
169 
170  virtual void clear_all_buffers();
171 
172  virtual std::string get_code() const;
173  virtual std::string get_pre_code() const;
174  virtual std::string get_post_code() const;
175 };
176 
238 class bpp_string : public bpp_code_entity {
239  public:
240  bpp_string();
241 
242  void add_code(const std::string& code, bool add_newline = true) override;
243  void add_code_to_previous_line(const std::string& code) override;
244  void add_code_to_next_line(const std::string& code) override;
245 
246  std::string get_code() const override;
247  std::string get_pre_code() const override;
248  std::string get_post_code() const override;
249 };
250 
256 class bpp_method : public bpp_code_entity {
257  private:
258  std::string name;
259  std::vector<std::shared_ptr<bpp_method_parameter>> parameters;
261  bool m_is_virtual = false;
262  bool inherited = false;
263  bool add_object_as_parameter(std::shared_ptr<bpp_object> object);
264  public:
265  bpp_method();
266  explicit bpp_method(const std::string& name);
267  bpp_method(const std::string& name, bool is_virtual);
268 
269  virtual bool add_parameter(std::shared_ptr<bpp_method_parameter> parameter);
270  void set_name(const std::string& name);
271  void set_scope(bpp_scope scope);
272  void set_virtual(bool is_virtual);
273  void set_inherited(bool is_inherited);
274  bool add_object(std::shared_ptr<bpp_object> object, bool make_local) override;
275 
276  std::string get_name() const override;
277  std::vector<std::shared_ptr<bpp_method_parameter>> get_parameters() const;
278  bpp_scope get_scope() const;
279  bool is_virtual() const;
280  bool is_inherited() const;
281 
282  void destruct_local_objects(std::shared_ptr<bpp_program> program);
283 };
284 
291  private:
292  std::string name;
293  public:
294  explicit bpp_method_parameter(const std::string& name);
295 
296  void set_type(std::shared_ptr<bpp_class>);
297 
298  std::string get_name() const override;
299  std::shared_ptr<bpp_class> get_type() const;
300 };
301 
307 class bpp_class : public bpp_entity, public std::enable_shared_from_this<bpp_class> {
308  private:
309  std::string name;
310  std::vector<std::shared_ptr<bpp_method>> methods;
311  std::vector<std::shared_ptr<bpp_datamember>> datamembers;
313  bool has_custom_destructor = false;
314 
318  void add_default_destructor();
319 
320  bool finalized = false;
321  public:
322  bpp_class();
323 
324  std::weak_ptr<bpp_class> get_containing_class() const override;
325  bool set_containing_class(std::weak_ptr<bpp::bpp_class> containing_class) override;
326 
327  std::shared_ptr<bpp_class> get_class() const override;
328 
329  void set_name(const std::string& name);
330  bool add_method(std::shared_ptr<bpp_method> method);
331  bool add_datamember(std::shared_ptr<bpp_datamember> datamember);
332 
333  std::string get_name() const override;
334  std::vector<std::shared_ptr<bpp_method>> get_methods() const;
335  std::vector<std::shared_ptr<bpp_datamember>> get_datamembers() const;
336 
337  std::shared_ptr<bpp_method> get_method(const std::string& name, std::shared_ptr<bpp_entity> context);
338  std::shared_ptr<bpp_method> get_method_UNSAFE(const std::string& name);
339  std::shared_ptr<bpp_datamember> get_datamember(const std::string& name, std::shared_ptr<bpp_entity> context);
340 
341  void inherit(std::shared_ptr<bpp_class> parent) override;
342  std::shared_ptr<bpp::bpp_class> get_parent();
343 
344  void finalize(std::shared_ptr<bpp_program> program);
345 };
346 
352 class bpp_object : public bpp_entity {
353  protected:
354  std::string name = "";
355  std::string address = "";
356  std::string assignment_value = "";
357  std::string pre_access_code = "";
358  std::string post_access_code = "";
359  bool m_is_pointer = false;
360  std::shared_ptr<bpp::bpp_object> copy_from = nullptr;
361  public:
362  bpp_object();
363  explicit bpp_object(const std::string& name);
364  bpp_object(const std::string& name, bool is_pointer);
365 
366  void set_class(std::shared_ptr<bpp_class> object_class);
367  void set_pointer(bool is_pointer);
368  void set_name(const std::string& name);
369  void set_address(const std::string& address);
370  void set_assignment_value(const std::string& assignment_value);
371  void set_pre_access_code(const std::string& pre_access_code);
372  void set_post_access_code(const std::string& post_access_code);
373  void set_nullptr();
374 
375  std::string get_name() const override;
376  std::string get_address() const override;
377  std::string get_assignment_value() const;
378  std::shared_ptr<bpp_class> get_class() const override;
379  std::string get_pre_access_code() const;
380  std::string get_post_access_code() const;
381  std::shared_ptr<bpp::bpp_object> get_copy_from() const;
382 
383  bool is_pointer() const;
384 };
385 
391 class bpp_datamember : public bpp_object {
392  private:
393  std::string default_value = "";
395  bool array = false;
396  public:
397  bpp_datamember();
398 
399  void set_default_value(const std::string& default_value);
400  void set_scope(bpp_scope scope);
401  void set_array(bool is_array);
402 
403  std::string get_address() const override;
404  std::string get_default_value() const;
405  bpp_scope get_scope() const;
406  bool is_array() const;
407 };
408 
414 class bpp_program : public bpp_code_entity, public std::enable_shared_from_this<bpp_program> {
415  private:
416  std::shared_ptr<bpp_class> primitive_class;
417  uint64_t supershell_counter = 0;
418  uint64_t assignment_counter = 0;
419  uint64_t function_counter = 0;
420  uint64_t dynamic_cast_counter = 0;
421  uint64_t object_counter = 0;
422  public:
423  bpp_program();
424 
425  bool set_containing_class(std::weak_ptr<bpp_class> containing_class) override;
426  void set_output_stream(std::shared_ptr<std::ostream> output_stream);
427 
428  bool add_class(std::shared_ptr<bpp_class> class_) override;
429 
430  std::shared_ptr<bpp_class> get_primitive_class() const;
431 
433  uint64_t get_supershell_counter() const;
434 
436  uint64_t get_assignment_counter() const;
437 
439  uint64_t get_function_counter() const;
440 
442  uint64_t get_dynamic_cast_counter() const;
443 
445  uint64_t get_object_counter() const;
446 };
447 
463  private:
464  std::shared_ptr<bpp::bash_while_condition> while_condition;
465  public:
466  bash_while_loop();
467 
468  void set_while_condition(std::shared_ptr<bpp::bash_while_condition> while_condition);
469  std::shared_ptr<bpp::bash_while_condition> get_while_condition() const;
470 
471  std::string get_code() const override;
472  std::string get_pre_code() const override;
473  std::string get_post_code() const override;
474 };
475 
484  private:
486  std::vector<std::string> supershell_function_calls = {};
487  public:
489 
491  void add_supershell_function_call(const std::string& function_call);
492  std::vector<std::string> get_supershell_function_calls() const;
493 };
494 
513 class bash_if : public bpp_string {
514  private:
515  std::string conditional_branch_pre_code = "";
517  std::vector<std::pair<std::string, std::string>> conditional_branches = {};
518  public:
519  bash_if();
520 
521  void add_conditional_branch_pre_code(const std::string& pre_code);
522  void add_conditional_branch_post_code(const std::string& post_code);
523  void new_branch();
524  void add_condition_code(const std::string& condition_code);
525  void add_branch_code(const std::string& branch_code);
526  std::string get_conditional_branch_pre_code() const;
527  std::string get_conditional_branch_post_code() const;
528  const std::vector<std::pair<std::string, std::string>>& get_conditional_branches() const;
529 };
530 
542  private:
543  std::shared_ptr<bpp::bash_if> if_statement;
544  public:
545  bash_if_branch();
546 
547  void set_if_statement(std::shared_ptr<bpp::bash_if> if_statement);
548  std::shared_ptr<bpp::bash_if> get_if_statement() const;
549 
550  std::string get_code() const override;
551  std::string get_pre_code() const override;
552  std::string get_post_code() const override;
553 };
554 
564 class bash_case : public bpp_string {
565  private:
566  std::string cases = "";
567  public:
568  bash_case();
569 
570  void add_case(const std::string& case_);
571 
572  const std::string& get_cases() const;
573 };
574 
585  private:
586  std::string pattern = "";
587  std::shared_ptr<bpp::bash_case> containing_case;
588  public:
590 
591  void set_pattern(const std::string& pattern);
592  void set_containing_case(std::shared_ptr<bpp::bash_case> containing_case);
593 
594  const std::string& get_pattern() const;
595  std::shared_ptr<bpp::bash_case> get_containing_case() const;
596 };
597 
607 class bash_for : public bpp_code_entity {
608  private:
609  std::string header_pre_code = "";
610  std::string header_post_code = "";
611  std::string header_code = "";
612  public:
613  bash_for();
614 
615  void set_header_pre_code(const std::string& pre_code);
616  void set_header_post_code(const std::string& post_code);
617  void set_header_code(const std::string& code);
618 
619  const std::string& get_header_pre_code() const;
620  const std::string& get_header_post_code() const;
621  const std::string& get_header_code() const;
622 };
623 
625  private:
626  std::string name = "";
627  public:
628  bash_function();
629 
630  void set_name(const std::string& name);
631  std::string get_name() const override;
632 };
633 
646  private:
647  std::shared_ptr<bpp::bpp_object> object_to_delete;
648  bool force_ptr = false;
649  public:
650  bpp_delete_statement() = default;
651 
652  void set_object_to_delete(std::shared_ptr<bpp::bpp_object> object);
653  void set_force_pointer(bool force_pointer);
654  std::shared_ptr<bpp::bpp_object> get_object_to_delete() const;
655  bool force_pointer() const;
656 };
657 
670  private:
671  std::shared_ptr<bpp::bpp_class> cast_to;
672  std::string cast_address = "";
673  public:
675 
676  void set_cast_to(std::shared_ptr<bpp::bpp_class> cast_to);
677  void set_cast_address(const std::string& cast_address);
678  std::shared_ptr<bpp::bpp_class> get_cast_to() const;
679  std::string get_cast_address() const;
680 };
681 
690  private:
691  std::shared_ptr<bpp::bpp_value_assignment> value_assignment;
692  public:
694 
695  void set_value_assignment(std::shared_ptr<bpp::bpp_value_assignment> value_assignment);
696  std::shared_ptr<bpp::bpp_value_assignment> get_value_assignment() const;
697 };
698 
707  private:
709  std::shared_ptr<bpp_entity> nonprimitive_object;
710  bool lvalue_nonprimitive = false;
711  bool array_assignment = false;
712  bool adding = false;
713  public:
715 
716  void set_nonprimitive_assignment(bool is_nonprimitive);
717  void set_nonprimitive_object(std::shared_ptr<bpp_entity> object);
718  void set_lvalue_nonprimitive(bool is_nonprimitive);
719  void set_array_assignment(bool is_array);
720  void set_adding(bool is_adding);
721 
722  bool is_nonprimitive_assignment() const;
723  std::shared_ptr<bpp_entity> get_nonprimitive_object() const;
724  bool lvalue_is_nonprimitive() const;
725  bool is_array_assignment() const;
726  bool is_adding() const;
727 };
728 
737  private:
738  std::string lvalue = "";
739  std::string rvalue = "";
740  bool lvalue_nonprimitive = false;
741  bool rvalue_nonprimitive = false;
742  std::shared_ptr<bpp_entity> lvalue_object;
743  std::shared_ptr<bpp_entity> rvalue_object;
744  bool adding = false;
745  bool rvalue_array = false;
746  public:
748 
749  void set_lvalue(const std::string& lvalue);
750  void set_rvalue(const std::string& rvalue);
751  void set_lvalue_nonprimitive(bool is_nonprimitive);
752  void set_rvalue_nonprimitive(bool is_nonprimitive);
753  void set_lvalue_object(std::shared_ptr<bpp_entity> object);
754  void set_rvalue_object(std::shared_ptr<bpp_entity> object);
755  void set_adding(bool is_adding);
756  void set_rvalue_array(bool is_array);
757 
758  std::string get_lvalue() const;
759  std::string get_rvalue() const;
760  bool lvalue_is_nonprimitive() const;
761  bool rvalue_is_nonprimitive() const;
762  std::shared_ptr<bpp_entity> get_lvalue_object() const;
763  std::shared_ptr<bpp_entity> get_rvalue_object() const;
764  bool is_adding() const;
765  bool rvalue_is_array() const;
766 };
767 
776  private:
778  std::string array_index = "";
779  public:
781 
783  void set_array_index(const std::string& array_index);
785  std::string get_array_index() const;
786 };
787 
796  public:
797  bpp_object_address() = default;
798 };
799 
800 } // namespace bpp
801 
802 #endif // SRC_BPP_INCLUDE_BPP_H_
A pattern for a case statement in Bash++.
Definition: bpp.h:584
std::string pattern
Definition: bpp.h:586
void set_containing_case(std::shared_ptr< bpp::bash_case > containing_case)
Definition: bash_case_pattern.cpp:19
const std::string & get_pattern() const
Definition: bash_case_pattern.cpp:23
void set_pattern(const std::string &pattern)
Definition: bash_case_pattern.cpp:15
bash_case_pattern()
Definition: bash_case_pattern.cpp:13
std::shared_ptr< bpp::bash_case > containing_case
Definition: bpp.h:587
std::shared_ptr< bpp::bash_case > get_containing_case() const
Definition: bash_case_pattern.cpp:27
A case statement in Bash++.
Definition: bpp.h:564
std::string cases
Definition: bpp.h:566
bash_case()
Definition: bash_case.cpp:13
const std::string & get_cases() const
Definition: bash_case.cpp:19
void add_case(const std::string &case_)
Definition: bash_case.cpp:15
A for loop in Bash++.
Definition: bpp.h:607
const std::string & get_header_post_code() const
Definition: bash_for.cpp:31
bash_for()
Definition: bash_for.cpp:13
void set_header_post_code(const std::string &post_code)
Definition: bash_for.cpp:19
const std::string & get_header_pre_code() const
Definition: bash_for.cpp:27
void set_header_code(const std::string &code)
Definition: bash_for.cpp:23
std::string header_code
Definition: bpp.h:611
std::string header_pre_code
Definition: bpp.h:609
void set_header_pre_code(const std::string &pre_code)
Definition: bash_for.cpp:15
std::string header_post_code
Definition: bpp.h:610
const std::string & get_header_code() const
Definition: bash_for.cpp:35
Definition: bpp.h:624
void set_name(const std::string &name)
Definition: bash_function.cpp:15
bash_function()
Definition: bash_function.cpp:13
std::string get_name() const override
Definition: bash_function.cpp:19
std::string name
Definition: bpp.h:626
A branch of an if statement in Bash++.
Definition: bpp.h:541
void set_if_statement(std::shared_ptr< bpp::bash_if > if_statement)
Definition: bash_if_branch.cpp:15
std::shared_ptr< bpp::bash_if > get_if_statement() const
Definition: bash_if_branch.cpp:19
bash_if_branch()
Definition: bash_if_branch.cpp:13
std::string get_pre_code() const override
Return the contents of the pre-code buffer as a string.
Definition: bash_if_branch.cpp:27
std::string get_post_code() const override
Return the contents of the post-code buffer as a string.
Definition: bash_if_branch.cpp:35
std::string get_code() const override
Return the contents of the main code buffer as a string.
Definition: bash_if_branch.cpp:23
std::shared_ptr< bpp::bash_if > if_statement
Definition: bpp.h:543
An if statement in Bash++.
Definition: bpp.h:513
std::vector< std::pair< std::string, std::string > > conditional_branches
Definition: bpp.h:517
void add_conditional_branch_post_code(const std::string &post_code)
Definition: bash_if.cpp:19
void new_branch()
Definition: bash_if.cpp:23
std::string conditional_branch_pre_code
Definition: bpp.h:515
void add_branch_code(const std::string &branch_code)
Definition: bash_if.cpp:31
void add_condition_code(const std::string &condition_code)
Definition: bash_if.cpp:27
std::string get_conditional_branch_post_code() const
Definition: bash_if.cpp:39
bash_if()
Definition: bash_if.cpp:13
const std::vector< std::pair< std::string, std::string > > & get_conditional_branches() const
Definition: bash_if.cpp:43
std::string conditional_branch_post_code
Definition: bpp.h:516
void add_conditional_branch_pre_code(const std::string &pre_code)
Definition: bash_if.cpp:15
std::string get_conditional_branch_pre_code() const
Definition: bash_if.cpp:35
The condition for a while loop in Bash++.
Definition: bpp.h:483
bash_while_condition()
Definition: bash_while_condition.cpp:13
std::vector< std::string > supershell_function_calls
Definition: bpp.h:486
int supershell_count
Definition: bpp.h:485
void increment_supershell_count()
Definition: bash_while_condition.cpp:15
std::vector< std::string > get_supershell_function_calls() const
Definition: bash_while_condition.cpp:23
void add_supershell_function_call(const std::string &function_call)
Definition: bash_while_condition.cpp:19
A while loop in Bash++.
Definition: bpp.h:462
std::string get_post_code() const override
Return the contents of the post-code buffer as a string.
Definition: bash_while_loop.cpp:35
void set_while_condition(std::shared_ptr< bpp::bash_while_condition > while_condition)
Definition: bash_while_loop.cpp:15
std::shared_ptr< bpp::bash_while_condition > while_condition
Definition: bpp.h:464
std::string get_code() const override
Return the contents of the main code buffer as a string.
Definition: bash_while_loop.cpp:23
bash_while_loop()
Definition: bash_while_loop.cpp:13
std::string get_pre_code() const override
Return the contents of the pre-code buffer as a string.
Definition: bash_while_loop.cpp:27
std::shared_ptr< bpp::bash_while_condition > get_while_condition() const
Definition: bash_while_loop.cpp:19
A class in Bash++.
Definition: bpp.h:307
void set_name(const std::string &name)
Definition: bpp_class.cpp:100
bool set_containing_class(std::weak_ptr< bpp::bpp_class > containing_class) override
Definition: bpp_class.cpp:96
bool has_custom_destructor
Definition: bpp.h:313
bpp_class()
Definition: bpp_class.cpp:14
std::string name
Definition: bpp.h:309
void add_default_destructor()
Add the default destructor method.
Definition: bpp_class.cpp:77
void inherit(std::shared_ptr< bpp_class > parent) override
Inherit from a parent class.
Definition: bpp_class.cpp:284
bool add_method(std::shared_ptr< bpp_method > method)
Add a method to the class.
Definition: bpp_class.cpp:109
std::weak_ptr< bpp_class > get_containing_class() const override
Get the class which contains this entity.
Definition: bpp_class.cpp:88
std::vector< std::shared_ptr< bpp_datamember > > get_datamembers() const
Definition: bpp_class.cpp:182
void add_default_toPrimitive()
Add the default toPrimitive method.
Definition: bpp_class.cpp:42
void finalize(std::shared_ptr< bpp_program > program)
Finalize the class.
Definition: bpp_class.cpp:343
bool finalized
Definition: bpp.h:320
std::vector< std::shared_ptr< bpp_datamember > > datamembers
Definition: bpp.h:311
std::shared_ptr< bpp_class > get_class() const override
Definition: bpp_class.cpp:92
std::shared_ptr< bpp_datamember > get_datamember(const std::string &name, std::shared_ptr< bpp_entity > context)
Get a datamember by name.
Definition: bpp_class.cpp:254
bool has_custom_toPrimitive
Definition: bpp.h:312
void remove_default_toPrimitive()
Remove the default toPrimitive method.
Definition: bpp_class.cpp:24
std::shared_ptr< bpp::bpp_class > get_parent()
Definition: bpp_class.cpp:328
std::shared_ptr< bpp_method > get_method(const std::string &name, std::shared_ptr< bpp_entity > context)
Get a method by name.
Definition: bpp_class.cpp:199
std::shared_ptr< bpp_method > get_method_UNSAFE(const std::string &name)
Get a method by name without checking the context.
Definition: bpp_class.cpp:232
std::vector< std::shared_ptr< bpp_method > > get_methods() const
Definition: bpp_class.cpp:178
std::string get_name() const override
Definition: bpp_class.cpp:174
bool add_datamember(std::shared_ptr< bpp_datamember > datamember)
Add a datamember to the class.
Definition: bpp_class.cpp:155
void remove_default_destructor()
Remove the default destructor method.
Definition: bpp_class.cpp:58
std::vector< std::shared_ptr< bpp_method > > methods
Definition: bpp.h:310
An entity which can contain code.
Definition: bpp.h:151
virtual void add_code_to_next_line(const std::string &code)
Add code to the code entity's post-code buffer.
Definition: bpp_code_entity.cpp:60
bpp_code_entity()
Definition: bpp_code_entity.cpp:13
std::shared_ptr< std::ostream > code
Definition: bpp.h:153
std::string postline_buffer
Definition: bpp.h:155
virtual void flush_code_buffers()
Definition: bpp_code_entity.cpp:85
virtual void add_code_to_previous_line(const std::string &code)
Add code to the code entity's pre-code buffer.
Definition: bpp_code_entity.cpp:52
virtual void flush_postline_buffer()
Definition: bpp_code_entity.cpp:75
virtual std::string get_post_code() const
Return the contents of the post-code buffer as a string.
Definition: bpp_code_entity.cpp:171
virtual std::string get_pre_code() const
Return the contents of the pre-code buffer as a string.
Definition: bpp_code_entity.cpp:164
virtual void flush_nextline_buffer()
Definition: bpp_code_entity.cpp:65
virtual void clear_all_buffers()
Definition: bpp_code_entity.cpp:91
bool add_object(std::shared_ptr< bpp_object > object, bool make_local=false) override
Add an object to the code entity.
Definition: bpp_code_entity.cpp:111
virtual void add_code(const std::string &code, bool add_newline=true)
Add code to the code entity.
Definition: bpp_code_entity.cpp:25
virtual std::string get_code() const
Return the contents of the main code buffer as a string.
Definition: bpp_code_entity.cpp:153
std::string nextline_buffer
Definition: bpp.h:154
bool buffers_flushed
Definition: bpp.h:156
A data member in a class.
Definition: bpp.h:391
bool is_array() const
Definition: bpp_datamember.cpp:39
bool array
Definition: bpp.h:395
void set_scope(bpp_scope scope)
Definition: bpp_datamember.cpp:19
std::string get_default_value() const
Definition: bpp_datamember.cpp:31
void set_default_value(const std::string &default_value)
Definition: bpp_datamember.cpp:15
std::string get_address() const override
Definition: bpp_datamember.cpp:27
bpp_scope scope
Definition: bpp.h:394
std::string default_value
Definition: bpp.h:393
bpp_scope get_scope() const
Definition: bpp_datamember.cpp:35
bpp_datamember()
Definition: bpp_datamember.cpp:13
void set_array(bool is_array)
Definition: bpp_datamember.cpp:23
A delete statement in Bash++.
Definition: bpp.h:645
std::shared_ptr< bpp::bpp_object > get_object_to_delete() const
Definition: bpp_delete_statement.cpp:21
void set_force_pointer(bool force_pointer)
Definition: bpp_delete_statement.cpp:17
void set_object_to_delete(std::shared_ptr< bpp::bpp_object > object)
Definition: bpp_delete_statement.cpp:13
bool force_pointer() const
Definition: bpp_delete_statement.cpp:25
bool force_ptr
Definition: bpp.h:648
std::shared_ptr< bpp::bpp_object > object_to_delete
Definition: bpp.h:647
A dynamic_cast statement in Bash++.
Definition: bpp.h:669
std::string cast_address
Definition: bpp.h:672
std::shared_ptr< bpp::bpp_class > get_cast_to() const
Definition: bpp_dynamic_cast_statement.cpp:23
void set_cast_address(const std::string &cast_address)
Definition: bpp_dynamic_cast_statement.cpp:19
bpp_dynamic_cast_statement()
Definition: bpp_dynamic_cast_statement.cpp:13
std::shared_ptr< bpp::bpp_class > cast_to
Definition: bpp.h:671
void set_cast_to(std::shared_ptr< bpp::bpp_class > cast_to)
Definition: bpp_dynamic_cast_statement.cpp:15
std::string get_cast_address() const
Definition: bpp_dynamic_cast_statement.cpp:27
The base class for all entities in the Bash++ compiler.
Definition: bpp.h:92
virtual std::unordered_map< std::string, std::shared_ptr< bpp_object > > get_objects() const
Definition: bpp_entity.cpp:103
virtual std::shared_ptr< bpp_class > get_class() const
Definition: bpp_entity.cpp:48
std::unordered_map< std::string, std::shared_ptr< bpp_class > > classes
A map of class names to class objects within this entity.
Definition: bpp.h:98
std::unordered_map< std::string, std::shared_ptr< bpp_object > > local_objects
Like objects, but only for objects whose scope is local to this entity.
Definition: bpp.h:110
virtual bool add_object(std::shared_ptr< bpp_object > object, bool make_local=false)
Add an object to this entity's list of objects.
Definition: bpp_entity.cpp:32
virtual ~bpp_entity()=default
virtual std::unordered_map< std::string, std::shared_ptr< bpp_class > > get_classes() const
Definition: bpp_entity.cpp:99
std::vector< std::shared_ptr< bpp_class > > parents
Definition: bpp.h:113
virtual std::shared_ptr< bpp_object > get_object(const std::string &name)
Definition: bpp_entity.cpp:118
std::shared_ptr< bpp_class > type
Definition: bpp.h:111
virtual std::string get_address() const
Definition: bpp_entity.cpp:52
virtual std::weak_ptr< bpp::bpp_class > get_containing_class() const
Get the class which contains this entity.
Definition: bpp_entity.cpp:65
std::unordered_map< std::string, std::shared_ptr< bpp_object > > objects
A map of object names to bpp_objects within this entity.
Definition: bpp.h:104
std::weak_ptr< bpp_class > containing_class
Definition: bpp.h:112
virtual bool set_containing_class(std::weak_ptr< bpp::bpp_class > containing_class)
Definition: bpp_entity.cpp:69
virtual std::string get_name() const
Definition: bpp_entity.cpp:56
virtual void inherit(std::shared_ptr< bpp_entity > parent)
Inherit from a parent entity.
Definition: bpp_entity.cpp:81
virtual bool add_class(std::shared_ptr< bpp_class > class_)
Add a class to this entity's list of classes.
Definition: bpp_entity.cpp:18
A parameter in a method.
Definition: bpp.h:290
std::shared_ptr< bpp_class > get_type() const
Definition: bpp_method_parameter.cpp:23
bpp_method_parameter(const std::string &name)
Definition: bpp_method_parameter.cpp:13
void set_type(std::shared_ptr< bpp_class >)
Definition: bpp_method_parameter.cpp:15
std::string name
Definition: bpp.h:292
std::string get_name() const override
Definition: bpp_method_parameter.cpp:19
A method in a class.
Definition: bpp.h:256
bool inherited
Definition: bpp.h:262
bool add_object(std::shared_ptr< bpp_object > object, bool make_local) override
Add an object to the code entity.
Definition: bpp_method.cpp:128
bool add_object_as_parameter(std::shared_ptr< bpp_object > object)
Add a pointer to a non-primitive object as a parameter to the method.
Definition: bpp_method.cpp:24
bpp_method(const std::string &name, bool is_virtual)
virtual bool add_parameter(std::shared_ptr< bpp_method_parameter > parameter)
Add a parameter to the method.
Definition: bpp_method.cpp:48
bool is_virtual() const
Definition: bpp_method.cpp:99
std::string name
Definition: bpp.h:258
void set_scope(bpp_scope scope)
Definition: bpp_method.cpp:75
bpp_scope scope
Definition: bpp.h:260
std::vector< std::shared_ptr< bpp_method_parameter > > get_parameters() const
Definition: bpp_method.cpp:91
bpp_method()
Definition: bpp_method.cpp:14
void set_virtual(bool is_virtual)
Definition: bpp_method.cpp:79
bpp_scope get_scope() const
Definition: bpp_method.cpp:95
void set_inherited(bool is_inherited)
Definition: bpp_method.cpp:83
void destruct_local_objects(std::shared_ptr< bpp_program > program)
Destruct all local objects.
Definition: bpp_method.cpp:114
void set_name(const std::string &name)
Definition: bpp_method.cpp:71
std::vector< std::shared_ptr< bpp_method_parameter > > parameters
Definition: bpp.h:259
bool is_inherited() const
Definition: bpp_method.cpp:103
bool m_is_virtual
Definition: bpp.h:261
std::string get_name() const override
Definition: bpp_method.cpp:87
A statement which takes the address of an object in Bash++.
Definition: bpp.h:795
An object assignment statement in Bash++.
Definition: bpp.h:736
void set_rvalue_array(bool is_array)
Definition: bpp_object_assignment.cpp:43
bool rvalue_array
Definition: bpp.h:745
bool rvalue_is_array() const
Definition: bpp_object_assignment.cpp:75
void set_adding(bool is_adding)
Definition: bpp_object_assignment.cpp:39
bool adding
Definition: bpp.h:744
std::shared_ptr< bpp_entity > lvalue_object
Definition: bpp.h:742
void set_rvalue_nonprimitive(bool is_nonprimitive)
Definition: bpp_object_assignment.cpp:27
bool rvalue_nonprimitive
Definition: bpp.h:741
bpp_object_assignment()
Definition: bpp_object_assignment.cpp:13
std::shared_ptr< bpp_entity > get_lvalue_object() const
Definition: bpp_object_assignment.cpp:63
void set_lvalue(const std::string &lvalue)
Definition: bpp_object_assignment.cpp:15
bool rvalue_is_nonprimitive() const
Definition: bpp_object_assignment.cpp:59
void set_lvalue_object(std::shared_ptr< bpp_entity > object)
Definition: bpp_object_assignment.cpp:31
std::string get_rvalue() const
Definition: bpp_object_assignment.cpp:51
std::string get_lvalue() const
Definition: bpp_object_assignment.cpp:47
void set_lvalue_nonprimitive(bool is_nonprimitive)
Definition: bpp_object_assignment.cpp:23
void set_rvalue(const std::string &rvalue)
Definition: bpp_object_assignment.cpp:19
std::shared_ptr< bpp_entity > rvalue_object
Definition: bpp.h:743
std::string lvalue
Definition: bpp.h:738
bool lvalue_is_nonprimitive() const
Definition: bpp_object_assignment.cpp:55
std::string rvalue
Definition: bpp.h:739
bool lvalue_nonprimitive
Definition: bpp.h:740
bool is_adding() const
Definition: bpp_object_assignment.cpp:71
std::shared_ptr< bpp_entity > get_rvalue_object() const
Definition: bpp_object_assignment.cpp:67
void set_rvalue_object(std::shared_ptr< bpp_entity > object)
Definition: bpp_object_assignment.cpp:35
An object reference in Bash++.
Definition: bpp.h:775
void set_array_index(const std::string &array_index)
Definition: bpp_object_reference.cpp:19
bpp::reference_type get_reference_type() const
Definition: bpp_object_reference.cpp:23
bpp::reference_type reference_type
Definition: bpp.h:777
bpp_object_reference()
Definition: bpp_object_reference.cpp:13
std::string array_index
Definition: bpp.h:778
std::string get_array_index() const
Definition: bpp_object_reference.cpp:27
void set_reference_type(bpp::reference_type reference_type)
Definition: bpp_object_reference.cpp:15
An object in Bash++.
Definition: bpp.h:352
std::string get_pre_access_code() const
Definition: bpp_object.cpp:69
bool is_pointer() const
Definition: bpp_object.cpp:77
void set_pre_access_code(const std::string &pre_access_code)
Definition: bpp_object.cpp:39
void set_pointer(bool is_pointer)
Definition: bpp_object.cpp:23
void set_address(const std::string &address)
Definition: bpp_object.cpp:31
std::string address
Definition: bpp.h:355
void set_post_access_code(const std::string &post_access_code)
Definition: bpp_object.cpp:43
std::string get_post_access_code() const
Definition: bpp_object.cpp:73
std::string get_assignment_value() const
Definition: bpp_object.cpp:61
void set_assignment_value(const std::string &assignment_value)
Definition: bpp_object.cpp:35
std::string pre_access_code
Definition: bpp.h:357
void set_nullptr()
Definition: bpp_object.cpp:47
std::string post_access_code
Definition: bpp.h:358
bpp_object()
Definition: bpp_object.cpp:13
bool m_is_pointer
Definition: bpp.h:359
std::string assignment_value
Definition: bpp.h:356
std::string get_name() const override
Definition: bpp_object.cpp:53
std::shared_ptr< bpp::bpp_object > get_copy_from() const
Definition: bpp_object.cpp:81
std::string get_address() const override
Definition: bpp_object.cpp:57
std::shared_ptr< bpp_class > get_class() const override
Definition: bpp_object.cpp:65
void set_name(const std::string &name)
Definition: bpp_object.cpp:27
std::string name
Definition: bpp.h:354
void set_class(std::shared_ptr< bpp_class > object_class)
Definition: bpp_object.cpp:19
std::shared_ptr< bpp::bpp_object > copy_from
Definition: bpp.h:360
A pointer dereference in Bash++.
Definition: bpp.h:689
bpp_pointer_dereference()
Definition: bpp_pointer_dereference.cpp:13
std::shared_ptr< bpp::bpp_value_assignment > value_assignment
Definition: bpp.h:691
std::shared_ptr< bpp::bpp_value_assignment > get_value_assignment() const
Definition: bpp_pointer_dereference.cpp:19
void set_value_assignment(std::shared_ptr< bpp::bpp_value_assignment > value_assignment)
Definition: bpp_pointer_dereference.cpp:15
The main program.
Definition: bpp.h:414
uint64_t get_dynamic_cast_counter() const
Definition: bpp_program.cpp:191
uint64_t assignment_counter
Definition: bpp.h:418
std::shared_ptr< bpp_class > primitive_class
Definition: bpp.h:416
uint64_t dynamic_cast_counter
Definition: bpp.h:420
bool set_containing_class(std::weak_ptr< bpp_class > containing_class) override
Definition: bpp_program.cpp:27
uint64_t get_supershell_counter() const
Definition: bpp_program.cpp:155
void increment_function_counter()
Definition: bpp_program.cpp:167
uint64_t get_assignment_counter() const
Definition: bpp_program.cpp:163
uint64_t object_counter
Definition: bpp.h:421
std::shared_ptr< bpp_class > get_primitive_class() const
Definition: bpp_program.cpp:35
uint64_t supershell_counter
Definition: bpp.h:417
uint64_t get_function_counter() const
Definition: bpp_program.cpp:177
uint64_t function_counter
Definition: bpp.h:419
bool add_class(std::shared_ptr< bpp_class > class_) override
Add a class to the program.
Definition: bpp_program.cpp:44
uint64_t get_object_counter() const
Definition: bpp_program.cpp:199
void increment_dynamic_cast_counter()
Definition: bpp_program.cpp:181
bpp_program()
Definition: bpp_program.cpp:15
void increment_supershell_counter()
Definition: bpp_program.cpp:146
void increment_assignment_counter()
Definition: bpp_program.cpp:159
void set_output_stream(std::shared_ptr< std::ostream > output_stream)
Definition: bpp_program.cpp:31
void increment_object_counter()
Definition: bpp_program.cpp:195
The practical difference between bpp_code_entity and bpp_string is how we handle the code buffers.
Definition: bpp.h:238
std::string get_pre_code() const override
Return the contents of the pre-code buffer as a string.
Definition: bpp_string.cpp:43
void add_code(const std::string &code, bool add_newline=true) override
Add code to the primary buffer.
Definition: bpp_string.cpp:21
void add_code_to_previous_line(const std::string &code) override
Add code to the pre-code buffer.
Definition: bpp_string.cpp:28
void add_code_to_next_line(const std::string &code) override
Add code to the post-code buffer.
Definition: bpp_string.cpp:35
bpp_string()
Definition: bpp_string.cpp:13
std::string get_code() const override
Return the contents of the main code buffer as a string.
Definition: bpp_string.cpp:39
std::string get_post_code() const override
Return the contents of the post-code buffer as a string.
Definition: bpp_string.cpp:51
A value assignment statement in Bash++.
Definition: bpp.h:706
bool is_array_assignment() const
Definition: bpp_value_assignment.cpp:47
std::shared_ptr< bpp_entity > nonprimitive_object
Definition: bpp.h:709
bool nonprimitive_assignment
Definition: bpp.h:708
bool is_nonprimitive_assignment() const
Definition: bpp_value_assignment.cpp:35
bpp_value_assignment()
Definition: bpp_value_assignment.cpp:13
bool array_assignment
Definition: bpp.h:711
std::shared_ptr< bpp_entity > get_nonprimitive_object() const
Definition: bpp_value_assignment.cpp:39
bool lvalue_nonprimitive
Definition: bpp.h:710
void set_adding(bool is_adding)
Definition: bpp_value_assignment.cpp:31
void set_lvalue_nonprimitive(bool is_nonprimitive)
Definition: bpp_value_assignment.cpp:23
void set_array_assignment(bool is_array)
Definition: bpp_value_assignment.cpp:27
void set_nonprimitive_assignment(bool is_nonprimitive)
Definition: bpp_value_assignment.cpp:15
bool lvalue_is_nonprimitive() const
Definition: bpp_value_assignment.cpp:43
bool is_adding() const
Definition: bpp_value_assignment.cpp:51
void set_nonprimitive_object(std::shared_ptr< bpp_entity > object)
Definition: bpp_value_assignment.cpp:19
bool adding
Definition: bpp.h:712
Definition: bash_case.cpp:11
static const std::shared_ptr< bpp_method > inaccessible_method
A placeholder for an inaccessible method of a class (scope handling)
Definition: bpp.h:77
static const std::shared_ptr< bpp_datamember > inaccessible_datamember
A placeholder for an inaccessible data member of a class (scope handling)
Definition: bpp.h:71
static const char bpp_nullptr[]
The secret internal value of '@nullptr' in Bash++.
Definition: bpp.h:83
static const std::shared_ptr< bpp_entity > inaccessible_entity
A placeholder for an inaccessible entity (scope handling)
Definition: bpp.h:65
bpp_scope
Definition: bpp.h:19
@ SCOPE_PUBLIC
Definition: bpp.h:20
@ SCOPE_INACCESSIBLE
Definition: bpp.h:23
@ SCOPE_PRIVATE
Definition: bpp.h:22
@ SCOPE_PROTECTED
Definition: bpp.h:21
reference_type
Definition: bpp.h:26
@ ref_method
Definition: bpp.h:28
@ ref_object
Definition: bpp.h:29
@ ref_primitive
Definition: bpp.h:27