*/
struct ast_member : ast_expression
{
+ static ast_member *make(lex_ctx_t ctx, ast_expression *owner, unsigned int field, const std::string &name);
+ ~ast_member();
+
ast_expression *m_owner;
unsigned int m_field;
- const char *m_name;
+ std::string m_name;
bool m_rvalue;
-};
-ast_member* ast_member_new(lex_ctx_t ctx, ast_expression *owner, unsigned int field, const char *name);
-void ast_member_delete(ast_member*);
-bool ast_member_set_name(ast_member*, const char *name);
+private:
+ ast_member() = delete;
+ ast_member(lex_ctx_t ctx, ast_expression *owner, unsigned int field, const std::string &name);
+};
/* Array index access:
*
*/
struct ast_array_index : ast_expression
{
+ static ast_array_index* make(lex_ctx_t ctx, ast_expression *array, ast_expression *index);
+ ~ast_array_index();
ast_expression *m_array;
ast_expression *m_index;
+private:
+ ast_array_index() = delete;
+ ast_array_index(lex_ctx_t ctx, ast_expression *array, ast_expression *index);
};
-ast_array_index* ast_array_index_new(lex_ctx_t ctx, ast_expression *array, ast_expression *index);
/* Vararg pipe node:
*
*/
struct ast_argpipe : ast_expression
{
+ ast_argpipe() = delete;
+ ast_argpipe(lex_ctx_t ctx, ast_expression *index);
+ ~ast_argpipe();
ast_expression *m_index;
};
-ast_argpipe* ast_argpipe_new(lex_ctx_t ctx, ast_expression *index);
/* Store
*
*/
struct ast_store : ast_expression
{
+ ast_store() = delete;
+ ast_store(lex_ctx_t ctx, int op, ast_expression *d, ast_expression *s);
+ ~ast_store();
int m_op;
ast_expression *m_dest;
ast_expression *m_source;
};
-ast_store* ast_store_new(lex_ctx_t ctx, int op,
- ast_expression *d, ast_expression *s);
/* If
*
*/
struct ast_ifthen : ast_expression
{
+ ast_ifthen() = delete;
+ ast_ifthen(lex_ctx_t ctx, ast_expression *cond, ast_expression *ontrue, ast_expression *onfalse);
+ ~ast_ifthen();
ast_expression *m_cond;
/* It's all just 'expressions', since an ast_block is one too. */
ast_expression *m_on_true;
ast_expression *m_on_false;
};
-ast_ifthen* ast_ifthen_new(lex_ctx_t ctx, ast_expression *cond, ast_expression *ontrue, ast_expression *onfalse);
/* Ternary expressions...
*
*/
struct ast_ternary : ast_expression
{
+ ast_ternary() = delete;
+ ast_ternary(lex_ctx_t ctx, ast_expression *cond, ast_expression *ontrue, ast_expression *onfalse);
+ ~ast_ternary();
ast_expression *m_cond;
/* It's all just 'expressions', since an ast_block is one too. */
ast_expression *m_on_true;
ast_expression *m_on_false;
};
-ast_ternary* ast_ternary_new(lex_ctx_t ctx, ast_expression *cond, ast_expression *ontrue, ast_expression *onfalse);
/* A general loop node
*
*/
struct ast_loop : ast_expression
{
+ ast_loop() = delete;
+ ast_loop(lex_ctx_t ctx,
+ ast_expression *initexpr,
+ ast_expression *precond, bool pre_not,
+ ast_expression *postcond, bool post_not,
+ ast_expression *increment,
+ ast_expression *body);
+ ~ast_loop();
ast_expression *m_initexpr;
ast_expression *m_precond;
ast_expression *m_postcond;
bool m_pre_not;
bool m_post_not;
};
-ast_loop* ast_loop_new(lex_ctx_t ctx,
- ast_expression *initexpr,
- ast_expression *precond, bool pre_not,
- ast_expression *postcond, bool post_not,
- ast_expression *increment,
- ast_expression *body);
/* Break/Continue
*/