57 lines
2.1 KiB
C++
57 lines
2.1 KiB
C++
#pragma once
|
|
|
|
#include "elna/source/ast.h"
|
|
#include "elna/gcc/elna-tree.h"
|
|
|
|
#include "config.h"
|
|
#include "system.h"
|
|
#include "coretypes.h"
|
|
#include "tree.h"
|
|
#include "tree-iterator.h"
|
|
|
|
#include <unordered_map>
|
|
#include <string>
|
|
|
|
namespace elna
|
|
{
|
|
namespace gcc
|
|
{
|
|
class generic_visitor final : public source::empty_visitor
|
|
{
|
|
tree current_statements{ NULL_TREE };
|
|
tree current_expression{ NULL_TREE };
|
|
std::unordered_map<std::string, tree> symbol_map;
|
|
tree main_fndecl{ NULL_TREE };
|
|
tree_chain variable_chain;
|
|
|
|
tree build_label_decl(const char *name, location_t loc);
|
|
tree build_type(source::type_expression& type);
|
|
|
|
void enter_scope();
|
|
tree_symbol_mapping leave_scope();
|
|
|
|
public:
|
|
void visit(source::program *program) override;
|
|
void visit(source::procedure_definition *definition) override;
|
|
void visit(source::call_statement *statement) override;
|
|
void visit(source::number_literal<std::int32_t> *literal) override;
|
|
void visit(source::number_literal<double> *literal) override;
|
|
void visit(source::number_literal<bool> *boolean) override;
|
|
void visit(source::char_literal *character) override;
|
|
void visit(source::string_literal *string) override;
|
|
void visit(source::binary_expression *expression) override;
|
|
void visit(source::unary_expression *expression) override;
|
|
void visit(source::constant_definition *definition) override;
|
|
void visit(source::type_definition *definition) override;
|
|
void visit(source::variable_declaration *declaration) override;
|
|
void visit(source::variable_expression *expression) override;
|
|
void visit(source::array_access_expression *expression) override;
|
|
void visit(source::field_access_expression *expression) override;
|
|
void visit(source::dereference_expression *expression) override;
|
|
void visit(source::assign_statement *statement) override;
|
|
void visit(source::if_statement *statement) override;
|
|
void visit(source::while_statement *statement) override;
|
|
};
|
|
}
|
|
}
|