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 <list>
14#include <memory>
15
16#include "replace_all.h"
17
18#include "../thirdparty/interval_tree/EntityMap.h"
19
20namespace bpp {
21
28
34
41
42struct diagnostic {
44 std::string message;
45 uint32_t start_line;
46 uint32_t start_column;
47 uint32_t end_line;
48 uint32_t end_column;
49};
50
51// Forward declarations
52
53class bpp_entity;
54class bpp_code_entity;
55class bpp_string;
56class bpp_method;
58class bpp_class;
59class bpp_object;
60class bpp_datamember;
61class bpp_program;
62
63// Statement types
64class bash_while_loop;
66class bash_if;
67class bash_if_branch;
68class bash_case;
70class bash_for;
71class bash_function;
79
84inline const std::shared_ptr<bpp_entity> inaccessible_entity = std::make_shared<bpp_entity>();
85
90inline const std::shared_ptr<bpp_datamember> inaccessible_datamember = std::make_shared<bpp_datamember>();
91
96inline const std::shared_ptr<bpp_method> inaccessible_method = std::make_shared<bpp_method>();
97
102static const char bpp_nullptr[] = "0";
103
108inline constexpr const char* protected_keywords[] = {
109 "class", "constructor", "delete", "destructor",
110 "dynamic_cast", "include", "include_once", "method",
111 "new", "nullptr", "primitive", "private",
112 "protected", "public", "super", "this",
113 "typeof", "virtual"
114 };
115
120inline bool is_protected_keyword(const std::string& keyword) {
121 for (const char* protected_keyword : protected_keywords) {
122 if (keyword == protected_keyword) {
123 return true;
124 }
125 }
126 return false;
127}
128
134inline bool is_valid_identifier(const std::string& identifier) {
135 // Verify it's not empty, and not a reserved keyword
136 if (identifier.empty() || is_protected_keyword(identifier)) {
137 return false;
138 }
139
140 // Verify it doesn't contain two consecutive underscores
141 if (identifier.find("__") != std::string::npos) {
142 return false;
143 }
144
145 // Verify it starts with a letter or underscore, and contains only letters, digits, and underscores
146 if (!isalpha(identifier[0]) && identifier[0] != '_') {
147 return false;
148 }
149
150 for (char c : identifier) {
151 if (!isalnum(c) && c != '_') {
152 return false;
153 }
154 }
155
156 // If all checks passed, it's a valid identifier
157 return true;
158}
159
161 std::string file;
162 uint64_t line;
163 uint64_t column;
164
166 SymbolPosition(const std::string& file, uint64_t line, uint64_t column)
167 : file(file), line(line), column(column) {}
168};
169
178 protected:
179 std::string name = "";
184 std::unordered_map<std::string, std::shared_ptr<bpp_class>> classes;
185
190 std::unordered_map<std::string, std::shared_ptr<bpp_object>> objects;
191
196 std::unordered_map<std::string, std::shared_ptr<bpp_object>> local_objects;
197 std::shared_ptr<bpp_class> type = nullptr;
198 std::weak_ptr<bpp_class> containing_class;
199 std::vector<std::shared_ptr<bpp_class>> parents;
201 std::list<bpp::SymbolPosition> references;
202 public:
203 virtual ~bpp_entity() = default;
204 virtual bool add_class(std::shared_ptr<bpp_class> class_);
205 virtual bool add_object(std::shared_ptr<bpp_object> object, bool make_local = false);
206
207 virtual std::shared_ptr<bpp_class> get_class();
208 virtual std::string get_address() const;
209 virtual void set_name(const std::string& name);
210 virtual std::string get_name() const;
211 virtual std::weak_ptr<bpp::bpp_class> get_containing_class();
212 virtual bool set_containing_class(std::weak_ptr<bpp::bpp_class> containing_class);
213
214 virtual void inherit(std::shared_ptr<bpp_entity> parent);
215 virtual void inherit(std::shared_ptr<bpp_class> parent);
216
217 void set_definition_position(const std::string& file, uint64_t line, uint64_t column);
218 void add_reference(const std::string& file, uint64_t line, uint64_t column);
219
221 std::list<bpp::SymbolPosition> get_references() const;
222
223 std::unordered_map<std::string, std::shared_ptr<bpp_class>> get_classes() const;
224 std::unordered_map<std::string, std::shared_ptr<bpp_object>> get_objects() const;
225 std::shared_ptr<bpp_class> get_class(const std::string& name);
226 std::shared_ptr<bpp_object> get_object(const std::string& name);
227
228 std::shared_ptr<bpp_class> get_parent() const;
229};
230
249 protected:
250 std::shared_ptr<std::ostream> code = std::make_shared<std::ostringstream>();
251 std::string nextline_buffer = "";
252 std::string postline_buffer = "";
253 bool buffers_flushed = false;
254 public:
256
257 virtual void add_code(const std::string& code, bool add_newline = true);
258 virtual void add_code_to_previous_line(const std::string& code);
259 virtual void add_code_to_next_line(const std::string& code);
260
261 bool add_object(std::shared_ptr<bpp_object> object, bool make_local = false) override;
262
263 virtual void flush_nextline_buffer();
264 virtual void flush_postline_buffer();
265 virtual void flush_code_buffers();
266
267 virtual void clear_all_buffers();
268
269 virtual std::string get_code() const;
270 virtual std::string get_pre_code() const;
271 virtual std::string get_post_code() const;
272};
273
336 public:
337 bpp_string();
338
339 void add_code(const std::string& code, bool add_newline = true) override;
340 void add_code_to_previous_line(const std::string& code) override;
341 void add_code_to_next_line(const std::string& code) override;
342
343 std::string get_code() const override;
344 std::string get_pre_code() const override;
345 std::string get_post_code() const override;
346};
347
354 private:
355 std::vector<std::shared_ptr<bpp_method_parameter>> parameters;
357 bool m_is_virtual = false;
358 bool inherited = false;
359 bool add_object_as_parameter(std::shared_ptr<bpp_object> object);
360 public:
361 bpp_method();
362 explicit bpp_method(const std::string& name);
363 bpp_method(const std::string& name, bool is_virtual);
364
365 virtual bool add_parameter(std::shared_ptr<bpp_method_parameter> parameter);
367 void set_virtual(bool is_virtual);
368 void set_inherited(bool is_inherited);
369 bool add_object(std::shared_ptr<bpp_object> object, bool make_local) override;
370
371 std::vector<std::shared_ptr<bpp_method_parameter>> get_parameters() const;
372 bpp_scope get_scope() const;
373 bool is_virtual() const;
374 bool is_inherited() const;
375
376 void destruct_local_objects(std::shared_ptr<bpp_program> program);
377};
378
385 public:
386 explicit bpp_method_parameter(const std::string& name);
387
388 void set_type(std::shared_ptr<bpp_class>);
389 std::shared_ptr<bpp_class> get_type() const;
390};
391
397class bpp_class : public bpp_entity, public std::enable_shared_from_this<bpp_class> {
398 private:
399 std::vector<std::shared_ptr<bpp_method>> methods;
400 std::vector<std::shared_ptr<bpp_datamember>> datamembers;
403
408
409 bool finalized = false;
410 public:
411 bpp_class();
412
413 std::weak_ptr<bpp_class> get_containing_class() override;
414 bool set_containing_class(std::weak_ptr<bpp::bpp_class> containing_class) override;
415
416 std::shared_ptr<bpp_class> get_class() override;
417
418 void set_name(const std::string& name) override;
419 bool add_method(std::shared_ptr<bpp_method> method);
420 bool add_datamember(std::shared_ptr<bpp_datamember> datamember);
421
422 std::vector<std::shared_ptr<bpp_method>> get_methods() const;
423 std::vector<std::shared_ptr<bpp_datamember>> get_datamembers() const;
424
425 std::shared_ptr<bpp_method> get_method(const std::string& name, std::shared_ptr<bpp_entity> context);
426 std::shared_ptr<bpp_method> get_method_UNSAFE(const std::string& name);
427 std::shared_ptr<bpp_datamember> get_datamember(const std::string& name, std::shared_ptr<bpp_entity> context);
428
429 void inherit(std::shared_ptr<bpp_class> parent) override;
430 void inherit(std::shared_ptr<bpp_entity> parent) override;
431 std::shared_ptr<bpp::bpp_class> get_parent();
432
433 void finalize(std::shared_ptr<bpp_program> program);
434};
435
441class bpp_object : public bpp_entity {
442 protected:
443 std::string address = "";
444 std::string assignment_value = "";
445 std::string pre_access_code = "";
446 std::string post_access_code = "";
447 bool m_is_pointer = false;
448 std::shared_ptr<bpp::bpp_object> copy_from = nullptr;
449 public:
450 bpp_object();
451 explicit bpp_object(const std::string& name);
452 bpp_object(const std::string& name, bool is_pointer);
453
454 void set_class(std::shared_ptr<bpp_class> object_class);
455 void set_pointer(bool is_pointer);
456 void set_address(const std::string& address);
457 void set_assignment_value(const std::string& assignment_value);
458 void set_pre_access_code(const std::string& pre_access_code);
459 void set_post_access_code(const std::string& post_access_code);
460 void set_nullptr();
461
462 std::string get_address() const override;
463 std::string get_assignment_value() const;
464 std::shared_ptr<bpp_class> get_class() override;
465 std::string get_pre_access_code() const;
466 std::string get_post_access_code() const;
467 std::shared_ptr<bpp::bpp_object> get_copy_from() const;
468
469 bool is_pointer() const;
470};
471
478 private:
479 std::string default_value = "";
481 bool array = false;
482 public:
484
485 void set_default_value(const std::string& default_value);
487 void set_array(bool is_array);
488
489 std::string get_address() const override;
490 std::string get_default_value() const;
491 bpp_scope get_scope() const;
492 bool is_array() const;
493};
494
500class bpp_program : public bpp_code_entity, public std::enable_shared_from_this<bpp_program> {
501 private:
502 std::shared_ptr<bpp_class> primitive_class;
503 uint64_t supershell_counter = 0;
504 uint64_t assignment_counter = 0;
505 uint64_t function_counter = 0;
507 uint64_t typeof_counter = 0;
508 uint64_t object_counter = 0;
509
510 std::pair<uint16_t, uint16_t> target_bash_version = {5, 2};
511
512 std::string main_source_file;
513
514 // Source file -> EntityMap
515 std::unordered_map<std::string, EntityMap> entity_maps;
516 // s.t. requesting entity_maps["/path/to/file1.bpp"] returns an EntityMap
517 // which outlines for us which container entities are active at each point in the file
518
519 // Source file -> Diagnostics
520 std::unordered_map<std::string, std::vector<bpp::diagnostic>> diagnostics;
521 // Each 'diagnostic' contains a type (error, warning, etc), message, and position in the source file
522
523 // For debug info:
524 std::shared_ptr<std::vector<std::string>> include_paths;
525 public:
526 bpp_program();
527
528 bool set_containing_class(std::weak_ptr<bpp_class> containing_class) override;
529 void set_output_stream(std::shared_ptr<std::ostream> output_stream);
530
531 bool prepare_class(std::shared_ptr<bpp_class> class_);
532 bool add_class(std::shared_ptr<bpp_class> class_) override;
533
534 std::shared_ptr<bpp_class> get_primitive_class() const;
535
536 void set_include_paths(std::shared_ptr<std::vector<std::string>> paths);
537 std::shared_ptr<std::vector<std::string>> get_include_paths() const;
538
540 uint64_t get_supershell_counter() const;
541
543 uint64_t get_assignment_counter() const;
544
546 uint64_t get_function_counter() const;
547
549 uint64_t get_dynamic_cast_counter() const;
550
552 uint64_t get_typeof_counter() const;
553
555 uint64_t get_object_counter() const;
556
557 void set_target_bash_version(uint16_t major, uint16_t minor);
558 std::pair<uint16_t, uint16_t> get_target_bash_version() const;
559
560 void mark_entity(
561 const std::string& file,
562 uint32_t start_line, uint32_t start_column,
563 uint32_t end_line, uint32_t end_column,
564 std::shared_ptr<bpp::bpp_entity> entity
565 );
566
567 std::shared_ptr<bpp::bpp_entity> get_active_entity(
568 const std::string& file,
569 uint32_t line, uint32_t column
570 );
571
572 std::vector<std::string> get_source_files() const;
573 std::string get_main_source_file() const;
574 void set_main_source_file(const std::string& file);
575 void add_source_file(const std::string& file);
576
577 void add_diagnostic(
578 const std::string& file,
580 const std::string& message,
581 uint32_t start_line, uint32_t start_column,
582 uint32_t end_line, uint32_t end_column
583 );
584
585 std::vector<bpp::diagnostic> get_diagnostics(const std::string& file) const;
586 void clear_diagnostics(const std::string& file);
587};
588
604 private:
605 std::shared_ptr<bpp::bash_while_condition> while_condition;
606 public:
608
609 void set_while_condition(std::shared_ptr<bpp::bash_while_condition> while_condition);
610 std::shared_ptr<bpp::bash_while_condition> get_while_condition() const;
611
612 std::string get_code() const override;
613 std::string get_pre_code() const override;
614 std::string get_post_code() const override;
615};
616
625 private:
627 std::vector<std::string> supershell_function_calls = {};
628 public:
630
632 void add_supershell_function_call(const std::string& function_call);
633 std::vector<std::string> get_supershell_function_calls() const;
634};
635
654class bash_if : public bpp_string {
655 private:
658 std::vector<std::pair<std::string, std::string>> conditional_branches = {};
659 public:
660 bash_if();
661
662 void add_conditional_branch_pre_code(const std::string& pre_code);
663 void add_conditional_branch_post_code(const std::string& post_code);
664 void new_branch();
665 void add_condition_code(const std::string& condition_code);
666 void add_branch_code(const std::string& branch_code);
667 std::string get_conditional_branch_pre_code() const;
668 std::string get_conditional_branch_post_code() const;
669 const std::vector<std::pair<std::string, std::string>>& get_conditional_branches() const;
670};
671
683 private:
684 std::shared_ptr<bpp::bash_if> if_statement;
685 public:
687
688 void set_if_statement(std::shared_ptr<bpp::bash_if> if_statement);
689 std::shared_ptr<bpp::bash_if> get_if_statement() const;
690
691 std::string get_code() const override;
692 std::string get_pre_code() const override;
693 std::string get_post_code() const override;
694};
695
705class bash_case : public bpp_string {
706 private:
707 std::string cases = "";
708 public:
709 bash_case();
710
711 void add_case(const std::string& case_);
712
713 const std::string& get_cases() const;
714};
715
726 private:
727 std::string pattern = "";
728 std::shared_ptr<bpp::bash_case> containing_case;
729 public:
731
732 void set_pattern(const std::string& pattern);
733 void set_containing_case(std::shared_ptr<bpp::bash_case> containing_case);
734
735 const std::string& get_pattern() const;
736 std::shared_ptr<bpp::bash_case> get_containing_case() const;
737};
738
748class bash_for : public bpp_code_entity {
749 private:
750 std::string header_pre_code = "";
751 std::string header_post_code = "";
752 std::string header_code = "";
753 public:
754 bash_for();
755
756 void set_header_pre_code(const std::string& pre_code);
757 void set_header_post_code(const std::string& post_code);
758 void set_header_code(const std::string& code);
759
760 const std::string& get_header_pre_code() const;
761 const std::string& get_header_post_code() const;
762 const std::string& get_header_code() const;
763};
764
766 public:
768};
769
782 private:
783 std::shared_ptr<bpp::bpp_object> object_to_delete;
784 bool force_ptr = false;
785 public:
787
788 void set_object_to_delete(std::shared_ptr<bpp::bpp_object> object);
790 std::shared_ptr<bpp::bpp_object> get_object_to_delete() const;
791 bool force_pointer() const;
792};
793
806 private:
807 std::string cast_to;
808 public:
810
811 void set_cast_to(const std::string& cast_to);
812 std::string get_cast_to() const;
813};
814
823 private:
824 std::shared_ptr<bpp::bpp_value_assignment> value_assignment;
825 public:
827
828 void set_value_assignment(std::shared_ptr<bpp::bpp_value_assignment> value_assignment);
829 std::shared_ptr<bpp::bpp_value_assignment> get_value_assignment() const;
830};
831
840 private:
842 std::shared_ptr<bpp_entity> nonprimitive_object;
844 bool array_assignment = false;
845 bool adding = false;
846 public:
848
849 void set_nonprimitive_assignment(bool is_nonprimitive);
850 void set_nonprimitive_object(std::shared_ptr<bpp_entity> object);
851 void set_lvalue_nonprimitive(bool is_nonprimitive);
852 void set_array_assignment(bool is_array);
853 void set_adding(bool is_adding);
854
855 bool is_nonprimitive_assignment() const;
856 std::shared_ptr<bpp_entity> get_nonprimitive_object() const;
857 bool lvalue_is_nonprimitive() const;
858 bool is_array_assignment() const;
859 bool is_adding() const;
860};
861
870 private:
871 std::string lvalue = "";
872 std::string rvalue = "";
875 std::shared_ptr<bpp_entity> lvalue_object;
876 std::shared_ptr<bpp_entity> rvalue_object;
877 bool adding = false;
878 bool rvalue_array = false;
879 public:
881
882 void set_lvalue(const std::string& lvalue);
883 void set_rvalue(const std::string& rvalue);
884 void set_lvalue_nonprimitive(bool is_nonprimitive);
885 void set_rvalue_nonprimitive(bool is_nonprimitive);
886 void set_lvalue_object(std::shared_ptr<bpp_entity> object);
887 void set_rvalue_object(std::shared_ptr<bpp_entity> object);
888 void set_adding(bool is_adding);
889 void set_rvalue_array(bool is_array);
890
891 std::string get_lvalue() const;
892 std::string get_rvalue() const;
893 bool lvalue_is_nonprimitive() const;
894 bool rvalue_is_nonprimitive() const;
895 std::shared_ptr<bpp_entity> get_lvalue_object() const;
896 std::shared_ptr<bpp_entity> get_rvalue_object() const;
897 bool is_adding() const;
898 bool rvalue_is_array() const;
899};
900
909 private:
911 std::string array_index = "";
912 public:
914
916 void set_array_index(const std::string& array_index);
918 std::string get_array_index() const;
919};
920
929 public:
931};
932
933} // namespace bpp
934
935#endif // SRC_BPP_INCLUDE_BPP_H_
A pattern for a case statement in Bash++.
Definition bpp.h:725
std::string pattern
Definition bpp.h:727
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:728
std::shared_ptr< bpp::bash_case > get_containing_case() const
Definition bash_case_pattern.cpp:24
A case statement in Bash++.
Definition bpp.h:705
std::string cases
Definition bpp.h:707
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:748
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:752
std::string header_pre_code
Definition bpp.h:750
void set_header_pre_code(const std::string &pre_code)
Definition bash_for.cpp:12
std::string header_post_code
Definition bpp.h:751
const std::string & get_header_code() const
Definition bash_for.cpp:32
Definition bpp.h:765
bash_function()
Definition bash_function.cpp:10
A branch of an if statement in Bash++.
Definition bpp.h:682
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:684
An if statement in Bash++.
Definition bpp.h:654
std::vector< std::pair< std::string, std::string > > conditional_branches
Definition bpp.h:658
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:656
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:657
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:624
bash_while_condition()
Definition bash_while_condition.cpp:10
std::vector< std::string > supershell_function_calls
Definition bpp.h:627
int supershell_count
Definition bpp.h:626
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:603
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:605
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:397
void set_name(const std::string &name) override
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:402
bpp_class()
Definition bpp_class.cpp:11
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:355
bool finalized
Definition bpp.h:409
std::vector< std::shared_ptr< bpp_datamember > > datamembers
Definition bpp.h:400
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:401
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:340
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::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:154
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:399
An entity which can contain code.
Definition bpp.h:248
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:250
std::string postline_buffer
Definition bpp.h:252
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:251
bool buffers_flushed
Definition bpp.h:253
A data member in a class.
Definition bpp.h:477
bool is_array() const
Definition bpp_datamember.cpp:36
bool array
Definition bpp.h:481
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:480
std::string default_value
Definition bpp.h:479
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:781
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:784
std::shared_ptr< bpp::bpp_object > object_to_delete
Definition bpp.h:783
A dynamic_cast statement in Bash++.
Definition bpp.h:805
void set_cast_to(const std::string &cast_to)
Definition bpp_dynamic_cast_statement.cpp:12
std::string get_cast_to() const
Definition bpp_dynamic_cast_statement.cpp:16
bpp_dynamic_cast_statement()
Definition bpp_dynamic_cast_statement.cpp:10
std::string cast_to
Definition bpp.h:807
The base class for all entities in the Bash++ compiler.
Definition bpp.h:177
std::shared_ptr< bpp_class > get_parent() const
Definition bpp_entity.cpp:150
std::unordered_map< std::string, std::shared_ptr< bpp_object > > get_objects() const
Definition bpp_entity.cpp:121
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:184
virtual void set_name(const std::string &name)
Definition bpp_entity.cpp:53
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:196
virtual std::weak_ptr< bpp::bpp_class > get_containing_class()
Get the class which contains this entity.
Definition bpp_entity.cpp:66
std::string name
Definition bpp.h:179
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:117
void add_reference(const std::string &file, uint64_t line, uint64_t column)
Definition bpp_entity.cpp:84
std::vector< std::shared_ptr< bpp_class > > parents
Definition bpp.h:199
bpp::SymbolPosition get_initial_definition() const
Definition bpp_entity.cpp:80
std::shared_ptr< bpp_object > get_object(const std::string &name)
Definition bpp_entity.cpp:138
std::shared_ptr< bpp_class > type
Definition bpp.h:197
virtual std::string get_address() const
Definition bpp_entity.cpp:49
std::list< bpp::SymbolPosition > references
Definition bpp.h:201
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:190
std::weak_ptr< bpp_class > containing_class
Definition bpp.h:198
virtual bool set_containing_class(std::weak_ptr< bpp::bpp_class > containing_class)
Definition bpp_entity.cpp:70
virtual std::string get_name() const
Definition bpp_entity.cpp:57
std::list< bpp::SymbolPosition > get_references() const
Definition bpp_entity.cpp:88
virtual void inherit(std::shared_ptr< bpp_entity > parent)
Inherit from a parent entity.
Definition bpp_entity.cpp:99
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
void set_definition_position(const std::string &file, uint64_t line, uint64_t column)
Definition bpp_entity.cpp:75
virtual std::shared_ptr< bpp_class > get_class()
Definition bpp_entity.cpp:45
bpp::SymbolPosition initial_definition
Definition bpp.h:200
A parameter in a method.
Definition bpp.h:384
std::shared_ptr< bpp_class > get_type() const
Definition bpp_method_parameter.cpp:18
void set_type(std::shared_ptr< bpp_class >)
Definition bpp_method_parameter.cpp:14
A method in a class.
Definition bpp.h:353
bool inherited
Definition bpp.h:358
bool add_object(std::shared_ptr< bpp_object > object, bool make_local) override
Add an object to the code entity.
Definition bpp_method.cpp:130
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:23
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:54
bool is_virtual() const
Definition bpp_method.cpp:102
void set_scope(bpp_scope scope)
Definition bpp_method.cpp:82
bpp_scope scope
Definition bpp.h:356
std::vector< std::shared_ptr< bpp_method_parameter > > get_parameters() const
Definition bpp_method.cpp:94
bpp_method()
Definition bpp_method.cpp:11
void set_virtual(bool is_virtual)
Definition bpp_method.cpp:86
bpp_scope get_scope() const
Definition bpp_method.cpp:98
void set_inherited(bool is_inherited)
Definition bpp_method.cpp:90
void destruct_local_objects(std::shared_ptr< bpp_program > program)
Destruct all local objects.
Definition bpp_method.cpp:117
std::vector< std::shared_ptr< bpp_method_parameter > > parameters
Definition bpp.h:355
bool is_inherited() const
Definition bpp_method.cpp:106
bool m_is_virtual
Definition bpp.h:357
A statement which takes the address of an object in Bash++.
Definition bpp.h:928
An object assignment statement in Bash++.
Definition bpp.h:869
void set_rvalue_array(bool is_array)
Definition bpp_object_assignment.cpp:40
bool rvalue_array
Definition bpp.h:878
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:877
std::shared_ptr< bpp_entity > lvalue_object
Definition bpp.h:875
void set_rvalue_nonprimitive(bool is_nonprimitive)
Definition bpp_object_assignment.cpp:24
bool rvalue_nonprimitive
Definition bpp.h:874
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:876
std::string lvalue
Definition bpp.h:871
bool lvalue_is_nonprimitive() const
Definition bpp_object_assignment.cpp:52
std::string rvalue
Definition bpp.h:872
bool lvalue_nonprimitive
Definition bpp.h:873
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:908
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:910
bpp_object_reference()
Definition bpp_object_reference.cpp:10
std::string array_index
Definition bpp.h:911
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:441
std::string get_pre_access_code() const
Definition bpp_object.cpp:61
bool is_pointer() const
Definition bpp_object.cpp:69
void set_pre_access_code(const std::string &pre_access_code)
Definition bpp_object.cpp:35
void set_pointer(bool is_pointer)
Definition bpp_object.cpp:23
void set_address(const std::string &address)
Definition bpp_object.cpp:27
std::string address
Definition bpp.h:443
void set_post_access_code(const std::string &post_access_code)
Definition bpp_object.cpp:39
std::shared_ptr< bpp_class > get_class() override
Definition bpp_object.cpp:57
std::string get_post_access_code() const
Definition bpp_object.cpp:65
std::string get_assignment_value() const
Definition bpp_object.cpp:53
void set_assignment_value(const std::string &assignment_value)
Definition bpp_object.cpp:31
std::string pre_access_code
Definition bpp.h:445
void set_nullptr()
Definition bpp_object.cpp:43
std::string post_access_code
Definition bpp.h:446
bpp_object()
Definition bpp_object.cpp:10
bool m_is_pointer
Definition bpp.h:447
std::string assignment_value
Definition bpp.h:444
std::shared_ptr< bpp::bpp_object > get_copy_from() const
Definition bpp_object.cpp:73
std::string get_address() const override
Definition bpp_object.cpp:49
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:448
A pointer dereference in Bash++.
Definition bpp.h:822
bpp_pointer_dereference()
Definition bpp_pointer_dereference.cpp:10
std::shared_ptr< bpp::bpp_value_assignment > value_assignment
Definition bpp.h:824
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:500
uint64_t get_dynamic_cast_counter() const
Definition bpp_program.cpp:228
std::vector< std::string > get_source_files() const
Definition bpp_program.cpp:291
void add_diagnostic(const std::string &file, diagnostic_type type, const std::string &message, uint32_t start_line, uint32_t start_column, uint32_t end_line, uint32_t end_column)
Definition bpp_program.cpp:318
uint64_t assignment_counter
Definition bpp.h:504
std::shared_ptr< bpp_class > primitive_class
Definition bpp.h:502
uint64_t dynamic_cast_counter
Definition bpp.h:506
void set_main_source_file(const std::string &file)
Definition bpp_program.cpp:303
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:192
std::string get_main_source_file() const
Definition bpp_program.cpp:299
std::pair< uint16_t, uint16_t > get_target_bash_version() const
Definition bpp_program.cpp:258
void increment_typeof_counter()
Definition bpp_program.cpp:232
void increment_function_counter()
Definition bpp_program.cpp:204
std::unordered_map< std::string, EntityMap > entity_maps
Definition bpp.h:515
std::string main_source_file
Definition bpp.h:512
uint64_t get_typeof_counter() const
Definition bpp_program.cpp:242
uint64_t get_assignment_counter() const
Definition bpp_program.cpp:200
uint64_t object_counter
Definition bpp.h:508
std::shared_ptr< bpp_class > get_primitive_class() const
Definition bpp_program.cpp:32
std::shared_ptr< bpp::bpp_entity > get_active_entity(const std::string &file, uint32_t line, uint32_t column)
Definition bpp_program.cpp:273
uint64_t supershell_counter
Definition bpp.h:503
std::vector< bpp::diagnostic > get_diagnostics(const std::string &file) const
Definition bpp_program.cpp:335
void set_target_bash_version(uint16_t major, uint16_t minor)
Definition bpp_program.cpp:254
std::shared_ptr< std::vector< std::string > > get_include_paths() const
Definition bpp_program.cpp:175
uint64_t get_function_counter() const
Definition bpp_program.cpp:214
std::unordered_map< std::string, std::vector< bpp::diagnostic > > diagnostics
Definition bpp.h:520
uint64_t typeof_counter
Definition bpp.h:507
uint64_t function_counter
Definition bpp.h:505
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:250
void increment_dynamic_cast_counter()
Definition bpp_program.cpp:218
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 add_source_file(const std::string &file)
Definition bpp_program.cpp:311
void increment_supershell_counter()
Definition bpp_program.cpp:179
std::shared_ptr< std::vector< std::string > > include_paths
Definition bpp.h:524
void increment_assignment_counter()
Definition bpp_program.cpp:196
void mark_entity(const std::string &file, uint32_t start_line, uint32_t start_column, uint32_t end_line, uint32_t end_column, std::shared_ptr< bpp::bpp_entity > entity)
Definition bpp_program.cpp:262
void set_output_stream(std::shared_ptr< std::ostream > output_stream)
Definition bpp_program.cpp:28
void increment_object_counter()
Definition bpp_program.cpp:246
std::pair< uint16_t, uint16_t > target_bash_version
Definition bpp.h:510
void clear_diagnostics(const std::string &file)
Definition bpp_program.cpp:343
void set_include_paths(std::shared_ptr< std::vector< std::string > > paths)
Definition bpp_program.cpp:171
The practical difference between bpp_code_entity and bpp_string is how we handle the code buffers.
Definition bpp.h:335
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:839
bool is_array_assignment() const
Definition bpp_value_assignment.cpp:44
std::shared_ptr< bpp_entity > nonprimitive_object
Definition bpp.h:842
bool nonprimitive_assignment
Definition bpp.h:841
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:844
std::shared_ptr< bpp_entity > get_nonprimitive_object() const
Definition bpp_value_assignment.cpp:36
bool lvalue_nonprimitive
Definition bpp.h:843
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:845
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:96
const std::shared_ptr< bpp_datamember > inaccessible_datamember
A placeholder for an inaccessible data member of a class (scope handling)
Definition bpp.h:90
static const char bpp_nullptr[]
The secret internal value of '@nullptr' in Bash++.
Definition bpp.h:102
const std::shared_ptr< bpp_entity > inaccessible_entity
A placeholder for an inaccessible entity (scope handling)
Definition bpp.h:84
bool is_valid_identifier(const std::string &identifier)
Check if a string is a valid identifier in Bash++.
Definition bpp.h:134
constexpr const char * protected_keywords[]
A list of keywords that are reserved and cannot be used as identifiers in Bash++.
Definition bpp.h:108
diagnostic_type
Definition bpp.h:35
@ DIAGNOSTIC_INFO
Definition bpp.h:38
@ DIAGNOSTIC_ERROR
Definition bpp.h:36
@ DIAGNOSTIC_WARNING
Definition bpp.h:37
@ DIAGNOSTIC_HINT
Definition bpp.h:39
bool is_protected_keyword(const std::string &keyword)
Check if a string matches any of our protected keywords.
Definition bpp.h:120
bpp_scope
Definition bpp.h:22
@ SCOPE_PUBLIC
Definition bpp.h:23
@ SCOPE_INACCESSIBLE
Definition bpp.h:26
@ SCOPE_PRIVATE
Definition bpp.h:25
@ SCOPE_PROTECTED
Definition bpp.h:24
reference_type
Definition bpp.h:29
@ ref_method
Definition bpp.h:31
@ ref_object
Definition bpp.h:32
@ ref_primitive
Definition bpp.h:30
Definition bpp.h:160
std::string file
Definition bpp.h:161
SymbolPosition()
Definition bpp.h:165
uint64_t column
Definition bpp.h:163
SymbolPosition(const std::string &file, uint64_t line, uint64_t column)
Definition bpp.h:166
uint64_t line
Definition bpp.h:162
Definition bpp.h:42
uint32_t start_line
Definition bpp.h:45
uint32_t end_line
Definition bpp.h:47
diagnostic_type type
Definition bpp.h:43
std::string message
Definition bpp.h:44
uint32_t end_column
Definition bpp.h:48
uint32_t start_column
Definition bpp.h:46