#pragma once #include #include struct ast { virtual ~ast(); }; 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); } }; using pattern_ptr = std::unique_ptr; struct branch { pattern_ptr pat; ast_ptr expr; branch(pattern_ptr&& p, ast_ptr&& a) : pat(std::move(p)), expr(std::move(a)) {} }; using branch_ptr = std::unique_ptr; enum binop { PLUS, MINUS, TIMES, DIVIDE }; struct ast_binop : public ast { binop op; ast_ptr left; ast_ptr right; ast_binop(binop o, ast_ptr&& l, ast_ptr&& r) : op(o), left(std::move(l)), right(std::move(r)) {} }; struct ast_app : public ast { ast_ptr left; ast_ptr right; ast_app(ast* l, ast* r) : left(l), right(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); } };