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 inline const std::shared_ptr<bpp_entity> inaccessible_entity = std::make_shared<bpp_entity>();
66 
71 inline const std::shared_ptr<bpp_datamember> inaccessible_datamember = std::make_shared<bpp_datamember>();
72 
77 inline 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();
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();
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  std::unordered_map<std::string, std::shared_ptr<bpp_class>> get_classes() const;
129  std::unordered_map<std::string, std::shared_ptr<bpp_object>> get_objects() const;
130  std::shared_ptr<bpp_class> get_class(const std::string& name);
131  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() override;
325  bool set_containing_class(std::weak_ptr<bpp::bpp_class> containing_class) override;
326 
327  std::shared_ptr<bpp_class> get_class() 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() 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 prepare_class(std::shared_ptr<bpp_class> class_);
429  bool add_class(std::shared_ptr<bpp_class> class_) override;
430 
431  std::shared_ptr<bpp_class> get_primitive_class() const;
432 
434  uint64_t get_supershell_counter() const;
435 
437  uint64_t get_assignment_counter() const;
438 
440  uint64_t get_function_counter() const;
441 
443  uint64_t get_dynamic_cast_counter() const;
444 
446  uint64_t get_object_counter() const;
447 };
448 
464  private:
465  std::shared_ptr<bpp::bash_while_condition> while_condition;
466  public:
467  bash_while_loop();
468 
469  void set_while_condition(std::shared_ptr<bpp::bash_while_condition> while_condition);
470  std::shared_ptr<bpp::bash_while_condition> get_while_condition() const;
471 
472  std::string get_code() const override;
473  std::string get_pre_code() const override;
474  std::string get_post_code() const override;
475 };
476 
485  private:
487  std::vector<std::string> supershell_function_calls = {};
488  public:
490 
492  void add_supershell_function_call(const std::string& function_call);
493  std::vector<std::string> get_supershell_function_calls() const;
494 };
495 
514 class bash_if : public bpp_string {
515  private:
516  std::string conditional_branch_pre_code = "";
518  std::vector<std::pair<std::string, std::string>> conditional_branches = {};
519  public:
520  bash_if();
521 
522  void add_conditional_branch_pre_code(const std::string& pre_code);
523  void add_conditional_branch_post_code(const std::string& post_code);
524  void new_branch();
525  void add_condition_code(const std::string& condition_code);
526  void add_branch_code(const std::string& branch_code);
527  std::string get_conditional_branch_pre_code() const;
528  std::string get_conditional_branch_post_code() const;
529  const std::vector<std::pair<std::string, std::string>>& get_conditional_branches() const;
530 };
531 
543  private:
544  std::shared_ptr<bpp::bash_if> if_statement;
545  public:
546  bash_if_branch();
547 
548  void set_if_statement(std::shared_ptr<bpp::bash_if> if_statement);
549  std::shared_ptr<bpp::bash_if> get_if_statement() const;
550 
551  std::string get_code() const override;
552  std::string get_pre_code() const override;
553  std::string get_post_code() const override;
554 };
555 
565 class bash_case : public bpp_string {
566  private:
567  std::string cases = "";
568  public:
569  bash_case();
570 
571  void add_case(const std::string& case_);
572 
573  const std::string& get_cases() const;
574 };
575 
586  private:
587  std::string pattern = "";
588  std::shared_ptr<bpp::bash_case> containing_case;
589  public:
591 
592  void set_pattern(const std::string& pattern);
593  void set_containing_case(std::shared_ptr<bpp::bash_case> containing_case);
594 
595  const std::string& get_pattern() const;
596  std::shared_ptr<bpp::bash_case> get_containing_case() const;
597 };
598 
608 class bash_for : public bpp_code_entity {
609  private:
610  std::string header_pre_code = "";
611  std::string header_post_code = "";
612  std::string header_code = "";
613  public:
614  bash_for();
615 
616  void set_header_pre_code(const std::string& pre_code);
617  void set_header_post_code(const std::string& post_code);
618  void set_header_code(const std::string& code);
619 
620  const std::string& get_header_pre_code() const;
621  const std::string& get_header_post_code() const;
622  const std::string& get_header_code() const;
623 };
624 
626  private:
627  std::string name = "";
628  public:
629  bash_function();
630 
631  void set_name(const std::string& name);
632  std::string get_name() const override;
633 };
634 
647  private:
648  std::shared_ptr<bpp::bpp_object> object_to_delete;
649  bool force_ptr = false;
650  public:
651  bpp_delete_statement() = default;
652 
653  void set_object_to_delete(std::shared_ptr<bpp::bpp_object> object);
654  void set_force_pointer(bool force_pointer);
655  std::shared_ptr<bpp::bpp_object> get_object_to_delete() const;
656  bool force_pointer() const;
657 };
658 
671  private:
672  std::shared_ptr<bpp::bpp_class> cast_to;
673  public:
675 
676  void set_cast_to(std::shared_ptr<bpp::bpp_class> cast_to);
677  std::shared_ptr<bpp::bpp_class> get_cast_to() const;
678 };
679 
688  private:
689  std::shared_ptr<bpp::bpp_value_assignment> value_assignment;
690  public:
692 
693  void set_value_assignment(std::shared_ptr<bpp::bpp_value_assignment> value_assignment);
694  std::shared_ptr<bpp::bpp_value_assignment> get_value_assignment() const;
695 };
696 
705  private:
707  std::shared_ptr<bpp_entity> nonprimitive_object;
708  bool lvalue_nonprimitive = false;
709  bool array_assignment = false;
710  bool adding = false;
711  public:
713 
714  void set_nonprimitive_assignment(bool is_nonprimitive);
715  void set_nonprimitive_object(std::shared_ptr<bpp_entity> object);
716  void set_lvalue_nonprimitive(bool is_nonprimitive);
717  void set_array_assignment(bool is_array);
718  void set_adding(bool is_adding);
719 
720  bool is_nonprimitive_assignment() const;
721  std::shared_ptr<bpp_entity> get_nonprimitive_object() const;
722  bool lvalue_is_nonprimitive() const;
723  bool is_array_assignment() const;
724  bool is_adding() const;
725 };
726 
735  private:
736  std::string lvalue = "";
737  std::string rvalue = "";
738  bool lvalue_nonprimitive = false;
739  bool rvalue_nonprimitive = false;
740  std::shared_ptr<bpp_entity> lvalue_object;
741  std::shared_ptr<bpp_entity> rvalue_object;
742  bool adding = false;
743  bool rvalue_array = false;
744  public:
746 
747  void set_lvalue(const std::string& lvalue);
748  void set_rvalue(const std::string& rvalue);
749  void set_lvalue_nonprimitive(bool is_nonprimitive);
750  void set_rvalue_nonprimitive(bool is_nonprimitive);
751  void set_lvalue_object(std::shared_ptr<bpp_entity> object);
752  void set_rvalue_object(std::shared_ptr<bpp_entity> object);
753  void set_adding(bool is_adding);
754  void set_rvalue_array(bool is_array);
755 
756  std::string get_lvalue() const;
757  std::string get_rvalue() const;
758  bool lvalue_is_nonprimitive() const;
759  bool rvalue_is_nonprimitive() const;
760  std::shared_ptr<bpp_entity> get_lvalue_object() const;
761  std::shared_ptr<bpp_entity> get_rvalue_object() const;
762  bool is_adding() const;
763  bool rvalue_is_array() const;
764 };
765 
774  private:
776  std::string array_index = "";
777  public:
779 
781  void set_array_index(const std::string& array_index);
783  std::string get_array_index() const;
784 };
785 
794  public:
795  bpp_object_address() = default;
796 };
797 
798 } // namespace bpp
799 
800 #endif // SRC_BPP_INCLUDE_BPP_H_
A pattern for a case statement in Bash++.
Definition: bpp.h:585
std::string pattern
Definition: bpp.h:587
void set_containing_case(std::shared_ptr< bpp::bash_case > containing_case)
Definition: bash_case_pattern.cpp:16
const std::string & get_pattern() const
Definition: bash_case_pattern.cpp:20
void set_pattern(const std::string &pattern)
Definition: bash_case_pattern.cpp:12
bash_case_pattern()
Definition: bash_case_pattern.cpp:10
std::shared_ptr< bpp::bash_case > containing_case
Definition: bpp.h:588
std::shared_ptr< bpp::bash_case > get_containing_case() const
Definition: bash_case_pattern.cpp:24
A case statement in Bash++.
Definition: bpp.h:565
std::string cases
Definition: bpp.h:567
bash_case()
Definition: bash_case.cpp:10
const std::string & get_cases() const
Definition: bash_case.cpp:16
void add_case(const std::string &case_)
Definition: bash_case.cpp:12
A for loop in Bash++.
Definition: bpp.h:608
const std::string & get_header_post_code() const
Definition: bash_for.cpp:28
bash_for()
Definition: bash_for.cpp:10
void set_header_post_code(const std::string &post_code)
Definition: bash_for.cpp:16
const std::string & get_header_pre_code() const
Definition: bash_for.cpp:24
void set_header_code(const std::string &code)
Definition: bash_for.cpp:20
std::string header_code
Definition: bpp.h:612
std::string header_pre_code
Definition: bpp.h:610
void set_header_pre_code(const std::string &pre_code)
Definition: bash_for.cpp:12
std::string header_post_code
Definition: bpp.h:611
const std::string & get_header_code() const
Definition: bash_for.cpp:32
Definition: bpp.h:625
void set_name(const std::string &name)
Definition: bash_function.cpp:12
bash_function()
Definition: bash_function.cpp:10
std::string get_name() const override
Definition: bash_function.cpp:16
std::string name
Definition: bpp.h:627
A branch of an if statement in Bash++.
Definition: bpp.h:542
void set_if_statement(std::shared_ptr< bpp::bash_if > if_statement)
Definition: bash_if_branch.cpp:12
std::shared_ptr< bpp::bash_if > get_if_statement() const
Definition: bash_if_branch.cpp:16
bash_if_branch()
Definition: bash_if_branch.cpp:10
std::string get_pre_code() const override
Return the contents of the pre-code buffer as a string.
Definition: bash_if_branch.cpp:24
std::string get_post_code() const override
Return the contents of the post-code buffer as a string.
Definition: bash_if_branch.cpp:32
std::string get_code() const override
Return the contents of the main code buffer as a string.
Definition: bash_if_branch.cpp:20
std::shared_ptr< bpp::bash_if > if_statement
Definition: bpp.h:544
An if statement in Bash++.
Definition: bpp.h:514
std::vector< std::pair< std::string, std::string > > conditional_branches
Definition: bpp.h:518
void add_conditional_branch_post_code(const std::string &post_code)
Definition: bash_if.cpp:16
void new_branch()
Definition: bash_if.cpp:20
std::string conditional_branch_pre_code
Definition: bpp.h:516
void add_branch_code(const std::string &branch_code)
Definition: bash_if.cpp:28
void add_condition_code(const std::string &condition_code)
Definition: bash_if.cpp:24
std::string get_conditional_branch_post_code() const
Definition: bash_if.cpp:36
bash_if()
Definition: bash_if.cpp:10
const std::vector< std::pair< std::string, std::string > > & get_conditional_branches() const
Definition: bash_if.cpp:40
std::string conditional_branch_post_code
Definition: bpp.h:517
void add_conditional_branch_pre_code(const std::string &pre_code)
Definition: bash_if.cpp:12
std::string get_conditional_branch_pre_code() const
Definition: bash_if.cpp:32
The condition for a while loop in Bash++.
Definition: bpp.h:484
bash_while_condition()
Definition: bash_while_condition.cpp:10
std::vector< std::string > supershell_function_calls
Definition: bpp.h:487
int supershell_count
Definition: bpp.h:486
void increment_supershell_count()
Definition: bash_while_condition.cpp:12
std::vector< std::string > get_supershell_function_calls() const
Definition: bash_while_condition.cpp:20
void add_supershell_function_call(const std::string &function_call)
Definition: bash_while_condition.cpp:16
A while loop in Bash++.
Definition: bpp.h:463
std::string get_post_code() const override
Return the contents of the post-code buffer as a string.
Definition: bash_while_loop.cpp:32
void set_while_condition(std::shared_ptr< bpp::bash_while_condition > while_condition)
Definition: bash_while_loop.cpp:12
std::shared_ptr< bpp::bash_while_condition > while_condition
Definition: bpp.h:465
std::string get_code() const override
Return the contents of the main code buffer as a string.
Definition: bash_while_loop.cpp:20
bash_while_loop()
Definition: bash_while_loop.cpp:10
std::string get_pre_code() const override
Return the contents of the pre-code buffer as a string.
Definition: bash_while_loop.cpp:24
std::shared_ptr< bpp::bash_while_condition > get_while_condition() const
Definition: bash_while_loop.cpp:16
A class in Bash++.
Definition: bpp.h:307
void set_name(const std::string &name)
Definition: bpp_class.cpp:97
bool set_containing_class(std::weak_ptr< bpp::bpp_class > containing_class) override
Definition: bpp_class.cpp:93
bool has_custom_destructor
Definition: bpp.h:313
bpp_class()
Definition: bpp_class.cpp:11
std::string name
Definition: bpp.h:309
std::shared_ptr< bpp_class > get_class() override
Definition: bpp_class.cpp:89
void add_default_destructor()
Add the default destructor method.
Definition: bpp_class.cpp:74
void inherit(std::shared_ptr< bpp_class > parent) override
Inherit from a parent class.
Definition: bpp_class.cpp:281
bool add_method(std::shared_ptr< bpp_method > method)
Add a method to the class.
Definition: bpp_class.cpp:106
std::vector< std::shared_ptr< bpp_datamember > > get_datamembers() const
Definition: bpp_class.cpp:179
void add_default_toPrimitive()
Add the default toPrimitive method.
Definition: bpp_class.cpp:39
void finalize(std::shared_ptr< bpp_program > program)
Finalize the class.
Definition: bpp_class.cpp:340
bool finalized
Definition: bpp.h:320
std::vector< std::shared_ptr< bpp_datamember > > datamembers
Definition: bpp.h:311
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:251
bool has_custom_toPrimitive
Definition: bpp.h:312
void remove_default_toPrimitive()
Remove the default toPrimitive method.
Definition: bpp_class.cpp:21
std::shared_ptr< bpp::bpp_class > get_parent()
Definition: bpp_class.cpp:325
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:196
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:229
std::vector< std::shared_ptr< bpp_method > > get_methods() const
Definition: bpp_class.cpp:175
std::string get_name() const override
Definition: bpp_class.cpp:171
std::weak_ptr< bpp_class > get_containing_class() override
Get the class which contains this entity.
Definition: bpp_class.cpp:85
bool add_datamember(std::shared_ptr< bpp_datamember > datamember)
Add a datamember to the class.
Definition: bpp_class.cpp:152
void remove_default_destructor()
Remove the default destructor method.
Definition: bpp_class.cpp:55
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:57
bpp_code_entity()
Definition: bpp_code_entity.cpp:10
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:82
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:49
virtual void flush_postline_buffer()
Definition: bpp_code_entity.cpp:72
virtual std::string get_post_code() const
Return the contents of the post-code buffer as a string.
Definition: bpp_code_entity.cpp:168
virtual std::string get_pre_code() const
Return the contents of the pre-code buffer as a string.
Definition: bpp_code_entity.cpp:161
virtual void flush_nextline_buffer()
Definition: bpp_code_entity.cpp:62
virtual void clear_all_buffers()
Definition: bpp_code_entity.cpp:88
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:108
virtual void add_code(const std::string &code, bool add_newline=true)
Add code to the code entity.
Definition: bpp_code_entity.cpp:22
virtual std::string get_code() const
Return the contents of the main code buffer as a string.
Definition: bpp_code_entity.cpp:150
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:36
bool array
Definition: bpp.h:395
void set_scope(bpp_scope scope)
Definition: bpp_datamember.cpp:16
std::string get_default_value() const
Definition: bpp_datamember.cpp:28
void set_default_value(const std::string &default_value)
Definition: bpp_datamember.cpp:12
std::string get_address() const override
Definition: bpp_datamember.cpp:24
bpp_scope scope
Definition: bpp.h:394
std::string default_value
Definition: bpp.h:393
bpp_scope get_scope() const
Definition: bpp_datamember.cpp:32
bpp_datamember()
Definition: bpp_datamember.cpp:10
void set_array(bool is_array)
Definition: bpp_datamember.cpp:20
A delete statement in Bash++.
Definition: bpp.h:646
std::shared_ptr< bpp::bpp_object > get_object_to_delete() const
Definition: bpp_delete_statement.cpp:18
void set_force_pointer(bool force_pointer)
Definition: bpp_delete_statement.cpp:14
void set_object_to_delete(std::shared_ptr< bpp::bpp_object > object)
Definition: bpp_delete_statement.cpp:10
bool force_pointer() const
Definition: bpp_delete_statement.cpp:22
bool force_ptr
Definition: bpp.h:649
std::shared_ptr< bpp::bpp_object > object_to_delete
Definition: bpp.h:648
A dynamic_cast statement in Bash++.
Definition: bpp.h:670
std::shared_ptr< bpp::bpp_class > get_cast_to() const
Definition: bpp_dynamic_cast_statement.cpp:16
bpp_dynamic_cast_statement()
Definition: bpp_dynamic_cast_statement.cpp:10
std::shared_ptr< bpp::bpp_class > cast_to
Definition: bpp.h:672
void set_cast_to(std::shared_ptr< bpp::bpp_class > cast_to)
Definition: bpp_dynamic_cast_statement.cpp:12
The base class for all entities in the Bash++ compiler.
Definition: bpp.h:92
std::unordered_map< std::string, std::shared_ptr< bpp_object > > get_objects() const
Definition: bpp_entity.cpp:100
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 std::weak_ptr< bpp::bpp_class > get_containing_class()
Get the class which contains this entity.
Definition: bpp_entity.cpp:62
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:29
virtual ~bpp_entity()=default
std::unordered_map< std::string, std::shared_ptr< bpp_class > > get_classes() const
Definition: bpp_entity.cpp:96
std::vector< std::shared_ptr< bpp_class > > parents
Definition: bpp.h:113
std::shared_ptr< bpp_object > get_object(const std::string &name)
Definition: bpp_entity.cpp:117
std::shared_ptr< bpp_class > type
Definition: bpp.h:111
virtual std::string get_address() const
Definition: bpp_entity.cpp:49
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:66
virtual std::string get_name() const
Definition: bpp_entity.cpp:53
virtual void inherit(std::shared_ptr< bpp_entity > parent)
Inherit from a parent entity.
Definition: bpp_entity.cpp:78
virtual bool add_class(std::shared_ptr< bpp_class > class_)
Add a class to this entity's list of classes.
Definition: bpp_entity.cpp:15
virtual std::shared_ptr< bpp_class > get_class()
Definition: bpp_entity.cpp:45
A parameter in a method.
Definition: bpp.h:290
std::shared_ptr< bpp_class > get_type() const
Definition: bpp_method_parameter.cpp:20
bpp_method_parameter(const std::string &name)
Definition: bpp_method_parameter.cpp:10
void set_type(std::shared_ptr< bpp_class >)
Definition: bpp_method_parameter.cpp:12
std::string name
Definition: bpp.h:292
std::string get_name() const override
Definition: bpp_method_parameter.cpp:16
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:125
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:21
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:45
bool is_virtual() const
Definition: bpp_method.cpp:96
std::string name
Definition: bpp.h:258
void set_scope(bpp_scope scope)
Definition: bpp_method.cpp:72
bpp_scope scope
Definition: bpp.h:260
std::vector< std::shared_ptr< bpp_method_parameter > > get_parameters() const
Definition: bpp_method.cpp:88
bpp_method()
Definition: bpp_method.cpp:11
void set_virtual(bool is_virtual)
Definition: bpp_method.cpp:76
bpp_scope get_scope() const
Definition: bpp_method.cpp:92
void set_inherited(bool is_inherited)
Definition: bpp_method.cpp:80
void destruct_local_objects(std::shared_ptr< bpp_program > program)
Destruct all local objects.
Definition: bpp_method.cpp:111
void set_name(const std::string &name)
Definition: bpp_method.cpp:68
std::vector< std::shared_ptr< bpp_method_parameter > > parameters
Definition: bpp.h:259
bool is_inherited() const
Definition: bpp_method.cpp:100
bool m_is_virtual
Definition: bpp.h:261
std::string get_name() const override
Definition: bpp_method.cpp:84
A statement which takes the address of an object in Bash++.
Definition: bpp.h:793
An object assignment statement in Bash++.
Definition: bpp.h:734
void set_rvalue_array(bool is_array)
Definition: bpp_object_assignment.cpp:40
bool rvalue_array
Definition: bpp.h:743
bool rvalue_is_array() const
Definition: bpp_object_assignment.cpp:72
void set_adding(bool is_adding)
Definition: bpp_object_assignment.cpp:36
bool adding
Definition: bpp.h:742
std::shared_ptr< bpp_entity > lvalue_object
Definition: bpp.h:740
void set_rvalue_nonprimitive(bool is_nonprimitive)
Definition: bpp_object_assignment.cpp:24
bool rvalue_nonprimitive
Definition: bpp.h:739
bpp_object_assignment()
Definition: bpp_object_assignment.cpp:10
std::shared_ptr< bpp_entity > get_lvalue_object() const
Definition: bpp_object_assignment.cpp:60
void set_lvalue(const std::string &lvalue)
Definition: bpp_object_assignment.cpp:12
bool rvalue_is_nonprimitive() const
Definition: bpp_object_assignment.cpp:56
void set_lvalue_object(std::shared_ptr< bpp_entity > object)
Definition: bpp_object_assignment.cpp:28
std::string get_rvalue() const
Definition: bpp_object_assignment.cpp:48
std::string get_lvalue() const
Definition: bpp_object_assignment.cpp:44
void set_lvalue_nonprimitive(bool is_nonprimitive)
Definition: bpp_object_assignment.cpp:20
void set_rvalue(const std::string &rvalue)
Definition: bpp_object_assignment.cpp:16
std::shared_ptr< bpp_entity > rvalue_object
Definition: bpp.h:741
std::string lvalue
Definition: bpp.h:736
bool lvalue_is_nonprimitive() const
Definition: bpp_object_assignment.cpp:52
std::string rvalue
Definition: bpp.h:737
bool lvalue_nonprimitive
Definition: bpp.h:738
bool is_adding() const
Definition: bpp_object_assignment.cpp:68
std::shared_ptr< bpp_entity > get_rvalue_object() const
Definition: bpp_object_assignment.cpp:64
void set_rvalue_object(std::shared_ptr< bpp_entity > object)
Definition: bpp_object_assignment.cpp:32
An object reference in Bash++.
Definition: bpp.h:773
void set_array_index(const std::string &array_index)
Definition: bpp_object_reference.cpp:16
bpp::reference_type get_reference_type() const
Definition: bpp_object_reference.cpp:20
bpp::reference_type reference_type
Definition: bpp.h:775
bpp_object_reference()
Definition: bpp_object_reference.cpp:10
std::string array_index
Definition: bpp.h:776
std::string get_array_index() const
Definition: bpp_object_reference.cpp:24
void set_reference_type(bpp::reference_type reference_type)
Definition: bpp_object_reference.cpp:12
An object in Bash++.
Definition: bpp.h:352
std::string get_pre_access_code() const
Definition: bpp_object.cpp:66
bool is_pointer() const
Definition: bpp_object.cpp:74
void set_pre_access_code(const std::string &pre_access_code)
Definition: bpp_object.cpp:36
void set_pointer(bool is_pointer)
Definition: bpp_object.cpp:20
void set_address(const std::string &address)
Definition: bpp_object.cpp:28
std::string address
Definition: bpp.h:355
void set_post_access_code(const std::string &post_access_code)
Definition: bpp_object.cpp:40
std::shared_ptr< bpp_class > get_class() override
Definition: bpp_object.cpp:62
std::string get_post_access_code() const
Definition: bpp_object.cpp:70
std::string get_assignment_value() const
Definition: bpp_object.cpp:58
void set_assignment_value(const std::string &assignment_value)
Definition: bpp_object.cpp:32
std::string pre_access_code
Definition: bpp.h:357
void set_nullptr()
Definition: bpp_object.cpp:44
std::string post_access_code
Definition: bpp.h:358
bpp_object()
Definition: bpp_object.cpp:10
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:50
std::shared_ptr< bpp::bpp_object > get_copy_from() const
Definition: bpp_object.cpp:78
std::string get_address() const override
Definition: bpp_object.cpp:54
void set_name(const std::string &name)
Definition: bpp_object.cpp:24
std::string name
Definition: bpp.h:354
void set_class(std::shared_ptr< bpp_class > object_class)
Definition: bpp_object.cpp:16
std::shared_ptr< bpp::bpp_object > copy_from
Definition: bpp.h:360
A pointer dereference in Bash++.
Definition: bpp.h:687
bpp_pointer_dereference()
Definition: bpp_pointer_dereference.cpp:10
std::shared_ptr< bpp::bpp_value_assignment > value_assignment
Definition: bpp.h:689
std::shared_ptr< bpp::bpp_value_assignment > get_value_assignment() const
Definition: bpp_pointer_dereference.cpp:16
void set_value_assignment(std::shared_ptr< bpp::bpp_value_assignment > value_assignment)
Definition: bpp_pointer_dereference.cpp:12
The main program.
Definition: bpp.h:414
uint64_t get_dynamic_cast_counter() const
Definition: bpp_program.cpp:208
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:24
uint64_t get_supershell_counter() const
Definition: bpp_program.cpp:172
void increment_function_counter()
Definition: bpp_program.cpp:184
uint64_t get_assignment_counter() const
Definition: bpp_program.cpp:180
uint64_t object_counter
Definition: bpp.h:421
std::shared_ptr< bpp_class > get_primitive_class() const
Definition: bpp_program.cpp:32
uint64_t supershell_counter
Definition: bpp.h:417
uint64_t get_function_counter() const
Definition: bpp_program.cpp:194
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:60
uint64_t get_object_counter() const
Definition: bpp_program.cpp:216
void increment_dynamic_cast_counter()
Definition: bpp_program.cpp:198
bpp_program()
Definition: bpp_program.cpp:12
bool prepare_class(std::shared_ptr< bpp_class > class_)
Prepare a class for addition to the program by adding it to the classes map.
Definition: bpp_program.cpp:46
void increment_supershell_counter()
Definition: bpp_program.cpp:163
void increment_assignment_counter()
Definition: bpp_program.cpp:176
void set_output_stream(std::shared_ptr< std::ostream > output_stream)
Definition: bpp_program.cpp:28
void increment_object_counter()
Definition: bpp_program.cpp:212
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:40
void add_code(const std::string &code, bool add_newline=true) override
Add code to the primary buffer.
Definition: bpp_string.cpp:18
void add_code_to_previous_line(const std::string &code) override
Add code to the pre-code buffer.
Definition: bpp_string.cpp:25
void add_code_to_next_line(const std::string &code) override
Add code to the post-code buffer.
Definition: bpp_string.cpp:32
bpp_string()
Definition: bpp_string.cpp:10
std::string get_code() const override
Return the contents of the main code buffer as a string.
Definition: bpp_string.cpp:36
std::string get_post_code() const override
Return the contents of the post-code buffer as a string.
Definition: bpp_string.cpp:48
A value assignment statement in Bash++.
Definition: bpp.h:704
bool is_array_assignment() const
Definition: bpp_value_assignment.cpp:44
std::shared_ptr< bpp_entity > nonprimitive_object
Definition: bpp.h:707
bool nonprimitive_assignment
Definition: bpp.h:706
bool is_nonprimitive_assignment() const
Definition: bpp_value_assignment.cpp:32
bpp_value_assignment()
Definition: bpp_value_assignment.cpp:10
bool array_assignment
Definition: bpp.h:709
std::shared_ptr< bpp_entity > get_nonprimitive_object() const
Definition: bpp_value_assignment.cpp:36
bool lvalue_nonprimitive
Definition: bpp.h:708
void set_adding(bool is_adding)
Definition: bpp_value_assignment.cpp:28
void set_lvalue_nonprimitive(bool is_nonprimitive)
Definition: bpp_value_assignment.cpp:20
void set_array_assignment(bool is_array)
Definition: bpp_value_assignment.cpp:24
void set_nonprimitive_assignment(bool is_nonprimitive)
Definition: bpp_value_assignment.cpp:12
bool lvalue_is_nonprimitive() const
Definition: bpp_value_assignment.cpp:40
bool is_adding() const
Definition: bpp_value_assignment.cpp:48
void set_nonprimitive_object(std::shared_ptr< bpp_entity > object)
Definition: bpp_value_assignment.cpp:16
bool adding
Definition: bpp.h:710
Definition: bash_case.cpp:8
const std::shared_ptr< bpp_method > inaccessible_method
A placeholder for an inaccessible method of a class (scope handling)
Definition: bpp.h:77
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
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