Construct the parse tree with raw pointers
This commit is contained in:
@ -262,7 +262,7 @@ namespace source
|
||||
*/
|
||||
class declaration : public definition
|
||||
{
|
||||
std::unique_ptr<type_expression> m_type;
|
||||
type_expression *m_type;
|
||||
|
||||
public:
|
||||
/**
|
||||
@ -273,10 +273,12 @@ namespace source
|
||||
* \param type Declared type.
|
||||
*/
|
||||
declaration(const struct position position, const std::string& identifier,
|
||||
std::unique_ptr<type_expression>&& type);
|
||||
type_expression *type);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
type_expression& type() noexcept;
|
||||
|
||||
virtual ~declaration() override;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -284,7 +286,7 @@ namespace source
|
||||
*/
|
||||
class constant_definition : public definition
|
||||
{
|
||||
std::unique_ptr<number_literal<std::int32_t>> m_body;
|
||||
number_literal<std::int32_t> *m_body;
|
||||
|
||||
public:
|
||||
/**
|
||||
@ -293,10 +295,12 @@ namespace source
|
||||
* \param body Constant value.
|
||||
*/
|
||||
constant_definition(const struct position position, const std::string& identifier,
|
||||
std::unique_ptr<number_literal<std::int32_t>>&& body);
|
||||
number_literal<std::int32_t> *body);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
number_literal<std::int32_t>& body();
|
||||
|
||||
virtual ~constant_definition() override;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -304,8 +308,8 @@ namespace source
|
||||
*/
|
||||
class procedure_definition : public definition
|
||||
{
|
||||
std::unique_ptr<block> m_body;
|
||||
std::vector<std::unique_ptr<declaration>> m_parameters;
|
||||
block *m_body;
|
||||
std::vector<declaration *> m_parameters;
|
||||
|
||||
public:
|
||||
/**
|
||||
@ -314,11 +318,13 @@ namespace source
|
||||
* \param body Procedure body.
|
||||
*/
|
||||
procedure_definition(const struct position position, const std::string& identifier,
|
||||
std::unique_ptr<block>&& body);
|
||||
block *body);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
block& body();
|
||||
std::vector<std::unique_ptr<declaration>>& parameters() noexcept;
|
||||
std::vector<declaration *>& parameters() noexcept;
|
||||
|
||||
virtual ~procedure_definition() override;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -327,7 +333,7 @@ namespace source
|
||||
class call_statement : public statement
|
||||
{
|
||||
std::string m_name;
|
||||
std::vector<std::unique_ptr<expression>> m_arguments;
|
||||
std::vector<expression *> m_arguments;
|
||||
|
||||
public:
|
||||
/**
|
||||
@ -338,24 +344,28 @@ namespace source
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
std::string& name() noexcept;
|
||||
std::vector<std::unique_ptr<expression>>& arguments() noexcept;
|
||||
std::vector<expression *>& arguments() noexcept;
|
||||
|
||||
virtual ~call_statement() override;
|
||||
};
|
||||
|
||||
class compound_statement : public statement
|
||||
{
|
||||
std::vector<std::unique_ptr<statement>> m_statements;
|
||||
std::vector<statement *> m_statements;
|
||||
|
||||
public:
|
||||
explicit compound_statement(const struct position position);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
std::vector<std::unique_ptr<statement>>& statements();
|
||||
std::vector<statement *>& statements();
|
||||
|
||||
virtual ~compound_statement() override;
|
||||
};
|
||||
|
||||
class assign_statement : public statement
|
||||
{
|
||||
std::string m_lvalue;
|
||||
std::unique_ptr<expression> m_rvalue;
|
||||
expression *m_rvalue;
|
||||
|
||||
public:
|
||||
/**
|
||||
@ -364,11 +374,13 @@ namespace source
|
||||
* \param rvalue Assigned expression.
|
||||
*/
|
||||
assign_statement(const struct position position, const std::string& lvalue,
|
||||
std::unique_ptr<expression>&& rvalue);
|
||||
expression *rvalue);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
std::string& lvalue() noexcept;
|
||||
expression& rvalue();
|
||||
|
||||
virtual ~assign_statement() override;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -376,9 +388,9 @@ namespace source
|
||||
*/
|
||||
class if_statement : public statement
|
||||
{
|
||||
std::unique_ptr<expression> m_prerequisite;
|
||||
std::unique_ptr<statement> m_body;
|
||||
std::unique_ptr<statement> m_alternative;
|
||||
expression *m_prerequisite;
|
||||
statement *m_body;
|
||||
statement *m_alternative;
|
||||
|
||||
public:
|
||||
/**
|
||||
@ -387,13 +399,15 @@ namespace source
|
||||
* \param body Statement executed if the condition is met.
|
||||
* \param alternative Statement executed if the condition is not met.
|
||||
*/
|
||||
if_statement(const struct position position, std::unique_ptr<expression>&& prerequisite,
|
||||
std::unique_ptr<statement>&& body, std::unique_ptr<statement>&& alternative = nullptr);
|
||||
if_statement(const struct position position, expression *prerequisite,
|
||||
statement *body, statement *alternative = nullptr);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
expression& prerequisite();
|
||||
statement& body();
|
||||
std::unique_ptr<statement>& alternative();
|
||||
statement *alternative();
|
||||
|
||||
virtual ~if_statement() override;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -401,8 +415,8 @@ namespace source
|
||||
*/
|
||||
class while_statement : public statement
|
||||
{
|
||||
std::unique_ptr<expression> m_prerequisite;
|
||||
std::unique_ptr<statement> m_body;
|
||||
expression *m_prerequisite;
|
||||
statement *m_body;
|
||||
|
||||
public:
|
||||
/**
|
||||
@ -410,37 +424,41 @@ namespace source
|
||||
* \param prerequisite Condition.
|
||||
* \param body Statement executed while the condition is met.
|
||||
*/
|
||||
while_statement(const struct position position, std::unique_ptr<expression>&& prerequisite,
|
||||
std::unique_ptr<statement>&& body);
|
||||
while_statement(const struct position position, expression *prerequisite,
|
||||
statement *body);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
expression& prerequisite();
|
||||
statement& body();
|
||||
|
||||
virtual ~while_statement() override;
|
||||
};
|
||||
|
||||
class block : public node
|
||||
{
|
||||
std::vector<std::unique_ptr<definition>> m_definitions;
|
||||
std::vector<std::unique_ptr<declaration>> m_declarations;
|
||||
std::unique_ptr<statement> m_body;
|
||||
std::vector<definition *> m_definitions;
|
||||
std::vector<declaration *> m_declarations;
|
||||
statement *m_body;
|
||||
|
||||
public:
|
||||
block(const struct position position, std::vector<std::unique_ptr<definition>>&& definitions,
|
||||
std::vector<std::unique_ptr<declaration>>&& declarations,
|
||||
std::unique_ptr<statement>&& body);
|
||||
block(const struct position position, std::vector<definition *>&& definitions,
|
||||
std::vector<declaration *>&& declarations,
|
||||
statement *body);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
statement& body();
|
||||
std::vector<std::unique_ptr<definition>>& definitions() noexcept;
|
||||
std::vector<std::unique_ptr<declaration>>& declarations() noexcept;
|
||||
std::vector<definition *>& definitions() noexcept;
|
||||
std::vector<declaration *>& declarations() noexcept;
|
||||
|
||||
virtual ~block() override;
|
||||
};
|
||||
|
||||
class program : public block
|
||||
{
|
||||
public:
|
||||
program(const struct position position, std::vector<std::unique_ptr<definition>>&& definitions,
|
||||
std::vector<std::unique_ptr<declaration>>&& declarations,
|
||||
std::unique_ptr<statement>&& body);
|
||||
program(const struct position position, std::vector<definition *>&& definitions,
|
||||
std::vector<declaration *>&& declarations,
|
||||
statement *body);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
};
|
||||
|
||||
@ -501,32 +519,36 @@ namespace source
|
||||
|
||||
class binary_expression : public expression
|
||||
{
|
||||
std::unique_ptr<expression> m_lhs;
|
||||
std::unique_ptr<expression> m_rhs;
|
||||
expression *m_lhs;
|
||||
expression *m_rhs;
|
||||
binary_operator m_operator;
|
||||
|
||||
public:
|
||||
binary_expression(const struct position position, std::unique_ptr<expression>&& lhs,
|
||||
std::unique_ptr<expression>&& rhs, const unsigned char operation);
|
||||
binary_expression(const struct position position, expression *lhs,
|
||||
expression *rhs, const unsigned char operation);
|
||||
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
expression& lhs();
|
||||
expression& rhs();
|
||||
binary_operator operation() const noexcept;
|
||||
|
||||
virtual ~binary_expression() override;
|
||||
};
|
||||
|
||||
class unary_expression : public expression
|
||||
{
|
||||
std::unique_ptr<expression> m_operand;
|
||||
expression *m_operand;
|
||||
unary_operator m_operator;
|
||||
|
||||
public:
|
||||
unary_expression(const struct position position, std::unique_ptr<expression>&& operand,
|
||||
unary_expression(const struct position position, expression *operand,
|
||||
const unsigned char operation);
|
||||
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
expression& operand();
|
||||
unary_operator operation() const noexcept;
|
||||
|
||||
virtual ~unary_expression() override;
|
||||
};
|
||||
|
||||
const char *print_binary_operator(const binary_operator operation);
|
||||
|
Reference in New Issue
Block a user