6 #ifndef SRC_LISTENER_BASHPPLISTENER_H_
7 #define SRC_LISTENER_BASHPPLISTENER_H_
15 #include <antlr4-runtime.h>
17 #include "../antlr/BashppParserBaseListener.h"
21 #include "../bpp_include/bpp_codegen.h"
28 #include "../bpp_include/bpp.h"
30 #include "../syntax_error.cpp"
31 #include "../internal_error.cpp"
33 #define skip_syntax_errors if (error_thrown) { \
34 if (error_context == ctx) { \
35 error_thrown = false; \
36 error_context = nullptr; \
61 class BashppListener :
public BashppParserBaseListener, std::enable_shared_from_this<BashppListener> {
106 std::shared_ptr<bpp::bpp_program>
program = std::make_shared<bpp::bpp_program>();
126 "class",
"constructor",
"delete",
"destructor",
127 "dynamic_cast",
"include",
"include_once",
"method",
128 "new",
"nullptr",
"primitive",
"private",
129 "protected",
"public",
"this",
"virtual"
134 if (keyword == protected_keyword) {
148 #define set_error_context error_thrown = true; error_context = ctx;
150 #define output_syntax_error(symbol, msg) \
151 int line = static_cast<int>(symbol->getLine()); \
152 int column = static_cast<int>(symbol->getCharPositionInLine()); \
153 std::string text = symbol->getText(); \
154 print_syntax_error_or_warning(source_file, line, column, text, msg, get_include_stack()); \
155 program_has_errors = true;
157 #define throw_syntax_error_sym(symbol, msg) \
158 output_syntax_error(symbol, msg) \
162 #define throw_syntax_error(token, msg) antlr4::Token* symbol = token->getSymbol(); \
163 throw_syntax_error_sym(symbol, msg) \
167 #define throw_syntax_error_from_exitRule(token, msg) antlr4::Token* symbol = token->getSymbol(); \
168 output_syntax_error(symbol, msg) \
171 #define show_warning_sym(symbol, msg) \
172 if (!suppress_warnings) { \
173 int line = static_cast<int>(symbol->getLine()); \
174 int column = static_cast<int>(symbol->getCharPositionInLine()); \
175 std::string text = symbol->getText(); \
176 print_syntax_error_or_warning(source_file, line, column, text, msg, get_include_stack(), true); \
179 #define show_warning(token, msg) antlr4::Token* symbol = token->getSymbol(); \
180 show_warning_sym(symbol, msg)
199 void enterProgram(BashppParser::ProgramContext *ctx)
override;
200 void exitProgram(BashppParser::ProgramContext *ctx)
override;
235 void enterStatement(BashppParser::StatementContext *ctx)
override;
236 void exitStatement(BashppParser::StatementContext *ctx)
override;
273 void exitSupershell(BashppParser::SupershellContext *ctx)
override;
275 void enterSubshell(BashppParser::SubshellContext *ctx)
override;
276 void exitSubshell(BashppParser::SubshellContext *ctx)
override;
284 void enterString(BashppParser::StringContext *ctx)
override;
285 void exitString(BashppParser::StringContext *ctx)
override;
290 void enterParameter(BashppParser::ParameterContext *ctx)
override;
291 void exitParameter(BashppParser::ParameterContext *ctx)
override;
297 void exitRaw_rvalue(BashppParser::Raw_rvalueContext *ctx)
override;
341 void enterHeredoc(BashppParser::HeredocContext *ctx)
override;
342 void exitHeredoc(BashppParser::HeredocContext *ctx)
override;
bpp::code_segment code_segment
Definition: BashppListener.h:22
The main listener class for the Bash++ compiler.
Definition: BashppListener.h:61
void enterValue_assignment(BashppParser::Value_assignmentContext *ctx) override
Definition: value_assignment.cpp:11
void enterBash_while_loop(BashppParser::Bash_while_loopContext *ctx) override
Definition: bash_while_loop.cpp:17
void enterArray_index(BashppParser::Array_indexContext *ctx) override
Definition: array_index.cpp:11
bool in_method
Definition: BashppListener.h:110
void exitBash_for_header(BashppParser::Bash_for_headerContext *ctx) override
Definition: bash_for_loop.cpp:66
std::shared_ptr< bpp::bash_while_condition > current_while_condition
Definition: BashppListener.h:109
void exitObject_assignment(BashppParser::Object_assignmentContext *ctx) override
Definition: object_assignment.cpp:24
void exitBash_if_root_branch(BashppParser::Bash_if_root_branchContext *ctx) override
Definition: bash_if_statement.cpp:139
void exitDelete_statement(BashppParser::Delete_statementContext *ctx) override
Definition: delete_statement.cpp:36
void enterBash_case_statement(BashppParser::Bash_case_statementContext *ctx) override
Definition: bash_case_statement.cpp:18
void enterBash_if_root_branch(BashppParser::Bash_if_root_branchContext *ctx) override
Definition: bash_if_statement.cpp:120
void enterMember_declaration(BashppParser::Member_declarationContext *ctx) override
Definition: member_declaration.cpp:11
bool run_on_exit
Definition: BashppListener.h:98
void exitArray_value(BashppParser::Array_valueContext *ctx) override
Definition: array_value.cpp:36
std::stack< std::string > include_stack
A chain of included files, from the main file to the current file (used for error reporting)
Definition: BashppListener.h:90
bool error_thrown
Definition: BashppListener.h:143
void set_include_paths(std::shared_ptr< std::vector< std::string >> include_paths)
Definition: BashppListener.cpp:15
void set_output_file(std::string output_file)
Definition: BashppListener.cpp:45
void exitRaw_rvalue(BashppParser::Raw_rvalueContext *ctx) override
Definition: raw_rvalue.cpp:20
bool program_has_errors
Definition: BashppListener.h:146
void exitBash_case_statement(BashppParser::Bash_case_statementContext *ctx) override
Definition: bash_case_statement.cpp:49
void exitSelf_reference(BashppParser::Self_referenceContext *ctx) override
Definition: self_reference.cpp:41
void enterHeredoc_header(BashppParser::Heredoc_headerContext *ctx) override
Definition: heredoc.cpp:50
void enterBash_while_condition(BashppParser::Bash_while_conditionContext *ctx) override
Definition: bash_while_loop.cpp:64
void set_run_on_exit(bool run_on_exit)
Definition: BashppListener.cpp:49
void enterInclude_statement(BashppParser::Include_statementContext *ctx) override
Handles.
Definition: include_statement.cpp:28
void enterSubshell(BashppParser::SubshellContext *ctx) override
Definition: subshell.cpp:11
void exitSinglequote_string(BashppParser::Singlequote_stringContext *ctx) override
Definition: singlequote_string.cpp:22
void exitTerminal_token(BashppParser::Terminal_tokenContext *ctx) override
Definition: terminal_token.cpp:21
void enterPointer_dereference(BashppParser::Pointer_dereferenceContext *ctx) override
Definition: pointer_dereference.cpp:11
std::vector< char * > arguments
Command-line arguments to pass to the compiled program if run_on_exit is true.
Definition: BashppListener.h:104
void enterClass_definition(BashppParser::Class_definitionContext *ctx) override
Definition: class_definition.cpp:11
void enterArray_value(BashppParser::Array_valueContext *ctx) override
Definition: array_value.cpp:11
void exitNullptr_ref(BashppParser::Nullptr_refContext *ctx) override
Definition: nullptr_ref.cpp:28
void enterSelf_reference(BashppParser::Self_referenceContext *ctx) override
Definition: self_reference.cpp:11
void exitClass_definition(BashppParser::Class_definitionContext *ctx) override
Definition: class_definition.cpp:55
void exitConstructor_definition(BashppParser::Constructor_definitionContext *ctx) override
Definition: constructor_definition.cpp:34
void set_source_file(std::string source_file)
Definition: BashppListener.cpp:11
void set_output_stream(std::shared_ptr< std::ostream > output_stream)
Definition: BashppListener.cpp:41
void exitObject_reference_as_lvalue(BashppParser::Object_reference_as_lvalueContext *ctx) override
Definition: object_reference_as_lvalue.cpp:272
void exitBash_if_statement(BashppParser::Bash_if_statementContext *ctx) override
Definition: bash_if_statement.cpp:92
void enterSelf_reference_as_lvalue(BashppParser::Self_reference_as_lvalueContext *ctx) override
Definition: self_reference_as_lvalue.cpp:11
void set_errors()
Sets the program_has_errors flag to true.
Definition: BashppListener.cpp:37
bool in_while_condition
Definition: BashppListener.h:108
void enterDelete_statement(BashppParser::Delete_statementContext *ctx) override
Definition: delete_statement.cpp:11
void enterBash_for_loop(BashppParser::Bash_for_loopContext *ctx) override
Definition: bash_for_loop.cpp:17
void enterOther_statement(BashppParser::Other_statementContext *ctx) override
Definition: other_statement.cpp:11
void set_included(bool included)
Definition: BashppListener.cpp:19
std::shared_ptr< std::ostream > output_stream
Pointer to the output stream to write the compiled code to.
Definition: BashppListener.h:96
std::set< std::string > get_included_files()
Definition: BashppListener.cpp:65
void enterBash_function(BashppParser::Bash_functionContext *ctx) override
Definition: bash_function.cpp:11
void exitBash_arithmetic(BashppParser::Bash_arithmeticContext *ctx) override
Definition: bash_arithmetic.cpp:36
void set_included_from(BashppListener *included_from)
Sets the included_from pointer to the given listener.
Definition: BashppListener.cpp:26
void enterMethod_definition(BashppParser::Method_definitionContext *ctx) override
Definition: method_definition.cpp:11
void exitHeredoc_header(BashppParser::Heredoc_headerContext *ctx) override
Definition: heredoc.cpp:64
std::string output_file
Definition: BashppListener.h:97
void exitDynamic_cast_statement(BashppParser::Dynamic_cast_statementContext *ctx) override
Definition: dynamic_cast.cpp:44
void enterExtra_statement(BashppParser::Extra_statementContext *ctx) override
Definition: extra_statement.cpp:11
void enterStatement(BashppParser::StatementContext *ctx) override
Definition: statement.cpp:11
void exitBash_for_loop(BashppParser::Bash_for_loopContext *ctx) override
Definition: bash_for_loop.cpp:31
void enterObject_instantiation(BashppParser::Object_instantiationContext *ctx) override
Definition: object_instantiation.cpp:11
void exitObject_address(BashppParser::Object_addressContext *ctx) override
Definition: object_address.cpp:33
void exitMember_declaration(BashppParser::Member_declarationContext *ctx) override
Definition: member_declaration.cpp:68
bool included
Definition: BashppListener.h:69
void exitExtra_statement(BashppParser::Extra_statementContext *ctx) override
Definition: extra_statement.cpp:21
void exitParameter(BashppParser::ParameterContext *ctx) override
Definition: parameter.cpp:62
bool suppress_warnings
Definition: BashppListener.h:77
void set_arguments(std::vector< char * > arguments)
Definition: BashppListener.cpp:57
antlr4::ParserRuleContext * error_context
Definition: BashppListener.h:144
void enterSinglequote_string(BashppParser::Singlequote_stringContext *ctx) override
Definition: singlequote_string.cpp:11
void enterParameter(BashppParser::ParameterContext *ctx) override
Definition: parameter.cpp:11
void enterObject_reference(BashppParser::Object_referenceContext *ctx) override
Definition: object_reference.cpp:11
std::stack< std::shared_ptr< bpp::bpp_entity > > entity_stack
A stack to keep track of the current entity being processed.
Definition: BashppListener.h:123
std::set< std::string > included_files
A set of (unique) included files (used for '@include_once' directives)
Definition: BashppListener.h:83
void enterNullptr_ref(BashppParser::Nullptr_refContext *ctx) override
Definition: nullptr_ref.cpp:11
void exitBash_case_pattern(BashppParser::Bash_case_patternContext *ctx) override
Definition: bash_case_statement.cpp:87
void enterNew_statement(BashppParser::New_statementContext *ctx) override
Definition: new_statement.cpp:11
void enterBash_if_condition(BashppParser::Bash_if_conditionContext *ctx) override
Definition: bash_if_statement.cpp:201
void enterBash_if_else_branch(BashppParser::Bash_if_else_branchContext *ctx) override
Definition: bash_if_statement.cpp:158
void exitObject_instantiation(BashppParser::Object_instantiationContext *ctx) override
Definition: object_instantiation.cpp:87
void enterBash_if_statement(BashppParser::Bash_if_statementContext *ctx) override
Definition: bash_if_statement.cpp:19
void exitHeredoc(BashppParser::HeredocContext *ctx) override
Definition: heredoc.cpp:31
bool is_protected_keyword(const std::string &keyword)
Definition: BashppListener.h:132
void enterTerminal_token(BashppParser::Terminal_tokenContext *ctx) override
Definition: terminal_token.cpp:11
void enterObject_assignment(BashppParser::Object_assignmentContext *ctx) override
Definition: object_assignment.cpp:11
BashppListener * included_from
Definition: BashppListener.h:84
void enterBash_arithmetic(BashppParser::Bash_arithmeticContext *ctx) override
Definition: bash_arithmetic.cpp:11
void enterHeredoc(BashppParser::HeredocContext *ctx) override
Definition: heredoc.cpp:17
std::shared_ptr< std::vector< std::string > > include_paths
A list of paths to search for included files.
Definition: BashppListener.h:75
void exitBash_while_loop(BashppParser::Bash_while_loopContext *ctx) override
Definition: bash_while_loop.cpp:31
void enterDestructor_definition(BashppParser::Destructor_definitionContext *ctx) override
Definition: destructor_definition.cpp:11
void set_suppress_warnings(bool suppress_warnings)
Definition: BashppListener.cpp:53
void enterBash_case_pattern(BashppParser::Bash_case_patternContext *ctx) override
Definition: bash_case_statement.cpp:70
void enterGeneral_statement(BashppParser::General_statementContext *ctx) override
Definition: general_statement.cpp:11
void enterString(BashppParser::StringContext *ctx) override
Definition: string.cpp:11
void enterDynamic_cast_statement(BashppParser::Dynamic_cast_statementContext *ctx) override
Definition: dynamic_cast.cpp:11
void exitSupershell(BashppParser::SupershellContext *ctx) override
Definition: supershell.cpp:32
void exitOther_statement(BashppParser::Other_statementContext *ctx) override
Definition: other_statement.cpp:28
void exitNew_statement(BashppParser::New_statementContext *ctx) override
Definition: new_statement.cpp:54
void enterSupershell(BashppParser::SupershellContext *ctx) override
Definition: supershell.cpp:11
std::shared_ptr< bpp::bpp_class > primitive
Definition: BashppListener.h:141
void enterBash_case_pattern_header(BashppParser::Bash_case_pattern_headerContext *ctx) override
Definition: bash_case_statement.cpp:110
void exitBash_while_condition(BashppParser::Bash_while_conditionContext *ctx) override
Definition: bash_while_loop.cpp:83
void exitGeneral_statement(BashppParser::General_statementContext *ctx) override
Definition: general_statement.cpp:22
void exitPointer_dereference(BashppParser::Pointer_dereferenceContext *ctx) override
Definition: pointer_dereference.cpp:46
void exitProgram(BashppParser::ProgramContext *ctx) override
Definition: program.cpp:31
void exitSubshell(BashppParser::SubshellContext *ctx) override
Definition: subshell.cpp:29
void enterPointer_declaration(BashppParser::Pointer_declarationContext *ctx) override
Definition: pointer_declaration.cpp:11
void exitArray_index(BashppParser::Array_indexContext *ctx) override
Definition: array_index.cpp:37
void exitBash_case_pattern_header(BashppParser::Bash_case_pattern_headerContext *ctx) override
Definition: bash_case_statement.cpp:125
void exitClass_body_statement(BashppParser::Class_body_statementContext *ctx) override
Definition: class_body_statement.cpp:42
void exitString(BashppParser::StringContext *ctx) override
Definition: string.cpp:33
void enterRaw_rvalue(BashppParser::Raw_rvalueContext *ctx) override
Definition: raw_rvalue.cpp:11
void enterProgram(BashppParser::ProgramContext *ctx) override
Definition: program.cpp:14
void exitDestructor_definition(BashppParser::Destructor_definitionContext *ctx) override
Definition: destructor_definition.cpp:34
void enterDeprecated_subshell(BashppParser::Deprecated_subshellContext *ctx) override
Definition: deprecated_subshell.cpp:11
void exitObject_reference(BashppParser::Object_referenceContext *ctx) override
Definition: object_reference.cpp:38
void exitBash_function(BashppParser::Bash_functionContext *ctx) override
Definition: bash_function.cpp:51
void exitInclude_statement(BashppParser::Include_statementContext *ctx) override
Definition: include_statement.cpp:218
std::shared_ptr< bpp::bpp_program > program
Definition: BashppListener.h:106
void enterObject_reference_as_lvalue(BashppParser::Object_reference_as_lvalueContext *ctx) override
Definition: object_reference_as_lvalue.cpp:11
std::string source_file
Path to the source file being compiled (used for error reporting)
Definition: BashppListener.h:67
void enterConstructor_definition(BashppParser::Constructor_definitionContext *ctx) override
Definition: constructor_definition.cpp:11
void enterClass_body_statement(BashppParser::Class_body_statementContext *ctx) override
Definition: class_body_statement.cpp:11
std::shared_ptr< bpp::bpp_program > get_program()
Definition: BashppListener.cpp:61
void exitValue_assignment(BashppParser::Value_assignmentContext *ctx) override
Definition: value_assignment.cpp:33
void enterBash_for_header(BashppParser::Bash_for_headerContext *ctx) override
Definition: bash_for_loop.cpp:52
void exitStatement(BashppParser::StatementContext *ctx) override
Definition: statement.cpp:15
void exitBash_if_else_branch(BashppParser::Bash_if_else_branchContext *ctx) override
Definition: bash_if_statement.cpp:182
void exitPointer_declaration(BashppParser::Pointer_declarationContext *ctx) override
Definition: pointer_declaration.cpp:97
void exitSelf_reference_as_lvalue(BashppParser::Self_reference_as_lvalueContext *ctx) override
Definition: self_reference_as_lvalue.cpp:203
void enterObject_address(BashppParser::Object_addressContext *ctx) override
Definition: object_address.cpp:11
static constexpr const char * protected_keywords[]
Definition: BashppListener.h:125
void exitBash_if_condition(BashppParser::Bash_if_conditionContext *ctx) override
Definition: bash_if_statement.cpp:218
std::stack< std::string > get_include_stack()
Definition: BashppListener.cpp:69
void exitMethod_definition(BashppParser::Method_definitionContext *ctx) override
Definition: method_definition.cpp:63
void exitDeprecated_subshell(BashppParser::Deprecated_subshellContext *ctx) override
Definition: deprecated_subshell.cpp:29
code_segment generate_supershell_code(const std::string &code_to_run, bool in_while_condition, std::shared_ptr< bash_while_condition > current_while_condition, std::shared_ptr< bpp::bpp_program > program)
Generates a supershell code segment for executing a bash command.
Definition: bpp_codegen.cpp:30
code_segment generate_dynamic_cast_code(const std::string &reference_code, const std::string &class_name, std::shared_ptr< bpp::bpp_program > program)
Generates a code segment for performing a dynamic cast.
Definition: bpp_codegen.cpp:162
code_segment generate_delete_code(std::shared_ptr< bpp::bpp_object > object, const std::string &object_ref, std::shared_ptr< bpp::bpp_program > program)
Generates a code segment for deleting an object.
Definition: bpp_codegen.cpp:78
code_segment generate_method_call_code(const std::string &reference_code, const std::string &method_name, std::shared_ptr< bpp::bpp_class > assumed_class, std::shared_ptr< bpp::bpp_program > program)
Generates a code segment for calling a method.
Definition: bpp_codegen.cpp:116
A struct to hold (compiled) code segments.
Definition: bpp_codegen.h:35