import tree:* import type:* import vec:* import set:* import util:* import str:* import mem:* adt ast { _translation_unit: str, _import: set, _identifier: pair, _binding: pair>, _type_def: str, _adt_def: str, _function: pair, _template: pair>, _declaration, _assignment, _block, _if, _match, _case, _while, _for, _return, _break, _continue, _defer, _call, _compiler_intrinsic: pair>, _cast: *type, _value: pair } fun to_string(a: ref ast): str { match(a) { ast::_translation_unit() return str("_translation_unit") ast::_import() return str("_import") ast::_identifier() return str("_identifier") ast::_binding() return str("_binding") ast::_type_def() return str("_type_def") ast::_adt_def() return str("_adt_def") ast::_function() return str("_function") ast::_template() return str("_template") ast::_declaration() return str("_declaration") ast::_assignment() return str("_assignment") ast::_block() return str("_block") ast::_if() return str("_if") ast::_match() return str("_match") ast::_case() return str("_case") ast::_while() return str("_while") ast::_for() return str("_for") ast::_return() return str("_return") ast::_break() return str("_break") ast::_continue() return str("_continue") ast::_defer() return str("_defer") ast::_call() return str("_call") ast::_compiler_intrinsic() return str("_compiler_intrinsic") ast::_cast() return str("_cast") ast::_value() return str("_value") } } fun _translation_unit(p: str): *tree { return new>()->construct(ast::_translation_unit(p)) } fun _import(p: set): *tree { return new>()->construct(ast::_import(p)) } fun _type_def(p: str): *tree { return new>()->construct(ast::_type_def(p)) } fun _adt_def(p: str): *tree { return new>()->construct(ast::_adt_def(p)) } fun _cast(p: *type): *tree { return new>()->construct(ast::_cast(p)) } fun _identifier(p1: str, p2: *type): *tree { return new>()->construct(ast::_identifier(make_pair(p1, p2))) } fun _binding(p1: str, p2: *tree): *tree { return new>()->construct(ast::_binding(make_pair(p1, p2))) } fun _function(p1: str, p2: *type): *tree { return new>()->construct(ast::_function(make_pair(p1, p2))) } fun _template(p1: str, p2: set): *tree { return new>()->construct(ast::_template(make_pair(p1, p2))) } fun _compiler_intrinsic(p1: str, p2: vec<*type>): *tree { return new>()->construct(ast::_compiler_intrinsic(make_pair(p1, p2))) } fun _value(p1: str, p2: *type): *tree { return new>()->construct(ast::_value(make_pair(p1, p2))) } fun _declaration(): *tree { return new>()->construct(ast::_declaration()) } fun _assignment(): *tree { return new>()->construct(ast::_assignment()) } fun _block(): *tree { return new>()->construct(ast::_block()) } fun _if(): *tree { return new>()->construct(ast::_if()) } fun _match(): *tree { return new>()->construct(ast::_match()) } fun _case(): *tree { return new>()->construct(ast::_case()) } fun _while(): *tree { return new>()->construct(ast::_while()) } fun _for(): *tree { return new>()->construct(ast::_for()) } fun _return(): *tree { return new>()->construct(ast::_return()) } fun _break(): *tree { return new>()->construct(ast::_break()) } fun _continue(): *tree { return new>()->construct(ast::_continue()) } fun _defer(): *tree { return new>()->construct(ast::_defer()) } fun _call(): *tree { return new>()->construct(ast::_call()) } fun _translation_unit(p: str, c: ref vec<*tree>): *tree { return new>()->construct(ast::_translation_unit(p), c) } fun _import(p: set, c: ref vec<*tree>): *tree { return new>()->construct(ast::_import(p), c) } fun _type_def(p: str, c: ref vec<*tree>): *tree { return new>()->construct(ast::_type_def(p), c) } fun _adt_def(p: str, c: ref vec<*tree>): *tree { return new>()->construct(ast::_adt_def(p), c) } fun _cast(p: *type, c: ref vec<*tree>): *tree { return new>()->construct(ast::_cast(p), c) } fun _identifier(p1: str, p2: *type, c: ref vec<*tree>): *tree { return new>()->construct(ast::_identifier(make_pair(p1, p2)), c) } fun _binding(p1: str, p2: *tree, c: ref vec<*tree>): *tree { return new>()->construct(ast::_binding(make_pair(p1, p2)), c) } fun _function(p1: str, p2: *type, c: ref vec<*tree>): *tree { return new>()->construct(ast::_function(make_pair(p1, p2)), c) } fun _template(p1: str, p2: set, c: ref vec<*tree>): *tree { return new>()->construct(ast::_template(make_pair(p1, p2)), c) } fun _compiler_intrinsic(p1: str, p2: vec<*type>, c: ref vec<*tree>): *tree { return new>()->construct(ast::_compiler_intrinsic(make_pair(p1, p2)), c) } fun _value(p1: str, p2: *type, c: ref vec<*tree>): *tree { return new>()->construct(ast::_value(make_pair(p1, p2)), c) } fun _declaration(c: ref vec<*tree>): *tree { return new>()->construct(ast::_declaration(), c) } fun _assignment(c: ref vec<*tree>): *tree { return new>()->construct(ast::_assignment(), c) } fun _block(c: ref vec<*tree>): *tree { return new>()->construct(ast::_block(), c) } fun _if(c: ref vec<*tree>): *tree { return new>()->construct(ast::_if(), c) } fun _match(c: ref vec<*tree>): *tree { return new>()->construct(ast::_match(), c) } fun _case(c: ref vec<*tree>): *tree { return new>()->construct(ast::_case(), c) } fun _while(c: ref vec<*tree>): *tree { return new>()->construct(ast::_while(), c) } fun _for(c: ref vec<*tree>): *tree { return new>()->construct(ast::_for(), c) } fun _return(c: ref vec<*tree>): *tree { return new>()->construct(ast::_return(), c) } fun _break(c: ref vec<*tree>): *tree { return new>()->construct(ast::_break(), c) } fun _continue(c: ref vec<*tree>): *tree { return new>()->construct(ast::_continue(), c) } fun _defer(c: ref vec<*tree>): *tree { return new>()->construct(ast::_defer(), c) } fun _call(c: ref vec<*tree>): *tree { return new>()->construct(ast::_call(), c) }