diff --git a/krakenGrammer.kgm b/krakenGrammer.kgm index 2b6e781..0b1ab53 100644 --- a/krakenGrammer.kgm +++ b/krakenGrammer.kgm @@ -137,7 +137,7 @@ integer = numeric | hexadecimal ; floating_literal = numeric "." float_end ; float_end = "(0|1|2|3|4|5|6|7|8|9)+" | "(0|1|2|3|4|5|6|7|8|9)+f" | "(0|1|2|3|4|5|6|7|8|9)+d" ; bool = "true" | "false" ; -character = "'(`|1|2|3|4|5|6|7|8|9|0|-|=|(\\t)|q|w|e|r|t|y|u|i|o|p|[|]|(\\\\)|a|s|d|f|g|h|j|k|l|;|'|(\\n)|z|x|c|v|b|n|m|,|.|/|~|!|@|#|$|%|^|&|\*|\(|\)|_|\+|Q|W|E|R|T|Y|U|I|O|P|{|}|\||A|S|D|F|G|H|J|K|L|:|\"|Z|X|C|V|B|N|M|<|>|\?| |(\\0))'" ; +character = "'(`|1|2|3|4|5|6|7|8|9|0|-|=|(\\t)|q|w|e|r|t|y|u|i|o|p|[|]|(\\\\)|a|s|d|f|g|h|j|k|l|;|(\\')|(\\n)|z|x|c|v|b|n|m|,|.|/|~|!|@|#|$|%|^|&|\*|\(|\)|_|\+|Q|W|E|R|T|Y|U|I|O|P|{|}|\||A|S|D|F|G|H|J|K|L|:|\"|Z|X|C|V|B|N|M|<|>|\?| |(\\0))'" ; keywords_also_identifiers = "obj" | "def" | "fun" | "var" | "adt" | "import" | "simple_passthrough" ; alpha_alphanumeric = "(a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|_)(a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|_|0|1|2|3|4|5|6|7|8|9)*" ; diff --git a/stdlib/ast_nodes.krak b/stdlib/ast_nodes.krak index d820690..ba3a2e8 100644 --- a/stdlib/ast_nodes.krak +++ b/stdlib/ast_nodes.krak @@ -816,8 +816,8 @@ obj function_call (Object) { return true } } -fun ast_value_ptr(string_value: string): *ast_node { - var to_ret.construct(string_value): value +fun ast_value_ptr(string_value: string, value_type: *type): *ast_node { + var to_ret.construct(string_value, value_type): value var ptr = new() ptr->copy_construct(&ast_node::value(to_ret)) return ptr @@ -830,15 +830,18 @@ fun is_value(node: *ast_node): bool { } obj value (Object) { var string_value: string + var value_type: *type var scope: map> - fun construct(string_value_in: string): *value { + fun construct(string_value_in: string, value_type_in: *type): *value { scope.construct() string_value.copy_construct(&string_value_in) + value_type = value_type_in return this } fun copy_construct(old: *value) { scope.copy_construct(&old->scope) string_value.copy_construct(&old->string_value) + value_type = old->value_type } fun destruct() { scope.destruct() @@ -849,7 +852,7 @@ obj value (Object) { copy_construct(&other) } fun operator==(other: ref value): bool { - return string_value == other.string_value + return string_value == other.string_value && value_type == other.value_type } } @@ -868,7 +871,7 @@ fun get_ast_children(node: *ast_node): vector<*ast_node> { ast_node::case_statement(backing) return vector<*ast_node>() ast_node::while_loop(backing) return vector<*ast_node>() ast_node::for_loop(backing) return vector<*ast_node>() - ast_node::return_statement(backing) return vector<*ast_node>() + ast_node::return_statement(backing) return vector(backing.return_value) ast_node::break_statement(backing) return vector<*ast_node>() ast_node::continue_statement(backing) return vector<*ast_node>() ast_node::defer_statement(backing) return vector<*ast_node>() @@ -904,7 +907,7 @@ fun get_ast_name(node: *ast_node): string { ast_node::if_comp(backing) return string("if_comp: ") + backing.wanted_generator ast_node::simple_passthrough(backing) return string("simple_passthrough: , string:") + backing.passthrough_str ast_node::function_call(backing) return string("function_call") - ast_node::value(backing) return string("value") + ast_node::value(backing) return string("value: ") + backing.string_value + ": " + backing.value_type->to_string() } } fun get_ast_scope(node: *ast_node): *map> { diff --git a/stdlib/ast_transformation.krak b/stdlib/ast_transformation.krak index d19e335..d96c907 100644 --- a/stdlib/ast_transformation.krak +++ b/stdlib/ast_transformation.krak @@ -204,7 +204,29 @@ obj ast_transformation (Object) { var name = concat_symbol_tree(node) return ast_identifier_ptr(name, type_ptr(base_type::void_return())) } - fun transform_value(node: *tree, scope: *ast_node): *ast_node return ast_value_ptr(concat_symbol_tree(node)) + fun transform_value(node: *tree, scope: *ast_node): *ast_node { + var value_str = concat_symbol_tree(node) + var value_type = null() + if (value_str[0] == '"') + value_type = type_ptr(base_type::character()) // and indirection, sigh + else if (value_str[0] == '\'') + value_type = type_ptr(base_type::character()) + else { + // should differentiate between float and double... + var contains_dot = false + for (var i = 0; i < value_str.length(); i++;) { + if (value_str[i] == '.') { + contains_dot = true + break + } + } + if (contains_dot) + value_type = type_ptr(base_type::floating()) + else + value_type = type_ptr(base_type::integer()) + } + return ast_value_ptr(value_str, value_type) + } fun transform_expression(node: *tree, scope: *ast_node): *ast_node { // figure out what the expression is, handle overloads, or you know // ignore everything and do a passthrough