From c0a6b614d097615bce10669ff07e97099bf4da62 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Wed, 10 Oct 2018 01:13:47 -0400 Subject: [PATCH] Fix pointer/ref parsing --- k.krak | 19 +++++++++++-------- stdlib/type2.krak | 4 ++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/k.krak b/k.krak index c663714..9a7a375 100644 --- a/k.krak +++ b/k.krak @@ -726,13 +726,13 @@ fun main(argc: int, argv: **char): int { str("main"), binding_p(type::_fun(make_triple(make_pair(vec( binding_p(type::_int()), - binding_p(type::_char()) + binding_p(type::_ptr(binding_p(type::_ptr(binding_p(type::_char()))))) ), binding_p(type::_int()) ), false, false))), true, vec( _identifier(str("argc"), binding_p(type::_int())), - _identifier(str("argv"), binding_p(type::_char())), + _identifier(str("argv"), binding_p(type::_ptr(binding_p(type::_ptr(binding_p(type::_char())))))), _return(vec(_call(vec(make_ast_binding("fmain"), make_ast_binding("argc"), make_ast_binding("argv"))))) ) ) @@ -775,14 +775,17 @@ fun main(argc: int, argv: **char): int { fun parse_type(syntax: *tree, declared_template_types: ref map>): *binding { var is_ref = get_node("\"ref\"", syntax) != null>() - var indr = 0 syntax = get_node("pre_reffed", syntax) + if (is_ref) + return binding_p(type::_ref(parse_type_helper(syntax, declared_template_types))) + else + return parse_type_helper(syntax, declared_template_types) +} +fun parse_type_helper(syntax: *tree, declared_template_types: ref map>): *binding { var next = get_node("pre_reffed", syntax) - while(next != null>()) { - indr++ - syntax = next - next = get_node("pre_reffed", syntax) - } + if (next != null>()) + return binding_p(type::_ptr(parse_type_helper(next, declared_template_types))) + var ident = get_node("scoped_identifier", syntax) var func = get_node("function_type", syntax) var first_child_name = syntax->children[0]->data.name diff --git a/stdlib/type2.krak b/stdlib/type2.krak index 3c2ce69..cd7f486 100644 --- a/stdlib/type2.krak +++ b/stdlib/type2.krak @@ -124,8 +124,8 @@ fun to_string(it: *type): str { match (*it) { type::_unknown() return str("_unknown") type::_void() return str("_void") - type::_ptr(p) return "*" + to_string(p) - type::_ref(r) return "ref" + to_string(r) + type::_ptr(p) return "*" + to_string(p->bound_to) + type::_ref(r) return "ref" + to_string(r->bound_to) type::_obj(b) { return "_obj(" + to_string(b->data) + ")" }