diff --git a/code/compiler_ast.hpp b/code/compiler_ast.hpp index ea3497d..e734d78 100644 --- a/code/compiler_ast.hpp +++ b/code/compiler_ast.hpp @@ -3,30 +3,13 @@ #include struct ast { - virtual ~ast(); + virtual ~ast() = default; }; using ast_ptr = std::unique_ptr; struct pattern { - virtual ~pattern(); -}; - -struct pattern_var : public pattern { - std::string var; - - pattern_var(const char* v) - : var(v) {} -}; - -struct pattern_constr : public pattern { - std::string constr; - std::vector params; - - pattern_constr(const char* c, std::vector&& p) - : constr(c) { - std::swap(params, p); - } + virtual ~pattern() = default; }; using pattern_ptr = std::unique_ptr; @@ -35,12 +18,18 @@ struct branch { pattern_ptr pat; ast_ptr expr; - branch(pattern_ptr&& p, ast_ptr&& a) + branch(pattern_ptr p, ast_ptr a) : pat(std::move(p)), expr(std::move(a)) {} }; using branch_ptr = std::unique_ptr; +struct definition { + virtual ~definition() = default; +}; + +using definition_ptr = std::unique_ptr; + enum binop { PLUS, MINUS, @@ -48,12 +37,33 @@ enum binop { DIVIDE }; +struct ast_int : public ast { + int value; + + explicit ast_int(int v) + : value(v) {} +}; + +struct ast_lid : public ast { + std::string id; + + explicit ast_lid(std::string i) + : id(std::move(i)) {} +}; + +struct ast_uid : public ast { + std::string id; + + explicit ast_uid(std::string i) + : id(std::move(i)) {} +}; + struct ast_binop : public ast { binop op; ast_ptr left; ast_ptr right; - ast_binop(binop o, ast_ptr&& l, ast_ptr&& r) + ast_binop(binop o, ast_ptr l, ast_ptr r) : op(o), left(std::move(l)), right(std::move(r)) {} }; @@ -61,16 +71,40 @@ struct ast_app : public ast { ast_ptr left; ast_ptr right; - ast_app(ast* l, ast* r) - : left(l), right(r) {} + ast_app(ast_ptr l, ast_ptr r) + : left(std::move(l)), right(std::move(r)) {} }; struct ast_case : public ast { ast_ptr of; std::vector branches; - ast_case(ast_ptr&& o, std::vector&& b) - : of(std::move(o)) { - std::swap(branches, b); + ast_case(ast_ptr o, std::vector b) + : of(std::move(o)), branches(std::move(b)) {} +}; + +struct pattern_var : public pattern { + std::string var; + + pattern_var(std::string v) + : var(std::move(v)) {} +}; + +struct pattern_constr : public pattern { + std::string constr; + std::vector params; + + pattern_constr(std::string c, std::vector p) + : constr(std::move(c)), params(std::move(p)) {} +}; + +struct definition_defn : public definition { + std::string name; + std::vector params; + ast_ptr body; + + definition_defn(std::string n, std::vector p, ast_ptr b) + : name(std::move(n)), params(std::move(p)), body(std::move(b)) { + } };