From 43dfa75b74adb507f81d1189f79c3e07f6b8c416 Mon Sep 17 00:00:00 2001 From: ProgramSnail Date: Sat, 12 Aug 2023 15:55:33 +0300 Subject: [PATCH] change in literals, literal types --- deps/tree-sitter-lang | 2 +- etc/kate_highlighting_lang.xml | 9 +++--- include/builders/basic_builders.hpp | 15 +++++++-- include/nodes/basic_nodes.hpp | 12 +++++++- include/tokens.hpp | 36 +++++++++++++++++----- src/builders/basic_builders.cpp | 46 ++++++++++++++++++++++++++-- src/builders/expression_builders.cpp | 30 +++++++++++++----- src/expression_type_check.cpp | 2 +- src/printers/basic_printers.cpp | 40 +++++++++++++++++------- tests/test.langexp | 15 +++++++++ 10 files changed, 168 insertions(+), 39 deletions(-) diff --git a/deps/tree-sitter-lang b/deps/tree-sitter-lang index 8e0cea2..17a67d2 160000 --- a/deps/tree-sitter-lang +++ b/deps/tree-sitter-lang @@ -1 +1 @@ -Subproject commit 8e0cea277edec400aefe29ed7aca9037348b9806 +Subproject commit 17a67d236113bf22fa516c08d2872f35b06dae9c diff --git a/etc/kate_highlighting_lang.xml b/etc/kate_highlighting_lang.xml index 4fd8678..b076662 100644 --- a/etc/kate_highlighting_lang.xml +++ b/etc/kate_highlighting_lang.xml @@ -59,8 +59,10 @@ - - + + + + @@ -72,9 +74,6 @@ - - - diff --git a/include/builders/basic_builders.hpp b/include/builders/basic_builders.hpp index fa2e2b3..1479756 100644 --- a/include/builders/basic_builders.hpp +++ b/include/builders/basic_builders.hpp @@ -12,14 +12,25 @@ nodes::Node build_node(parser::ParseTree::Node parser_node); // --- literals -nodes::Literal build_float_number_literal(parser::ParseTree::Node parser_node); +nodes::Literal build_float_literal(parser::ParseTree::Node parser_node); -nodes::Literal build_number_literal(parser::ParseTree::Node parser_node); +nodes::Literal build_double_literal(parser::ParseTree::Node parser_node); + +nodes::Literal build_int_literal(parser::ParseTree::Node parser_node); + +nodes::Literal build_long_literal(parser::ParseTree::Node parser_node); + +nodes::Literal build_index_literal(parser::ParseTree::Node parser_node); nodes::Literal build_string_literal(parser::ParseTree::Node parser_node); +nodes::Literal +build_unicode_string_literal(parser::ParseTree::Node parser_node); + nodes::Literal build_char_literal(parser::ParseTree::Node parser_node); +nodes::Literal build_unicode_literal(parser::ParseTree::Node parser_node); + nodes::Literal build_bool_literal(parser::ParseTree::Node parser_node); nodes::Literal build_unit_literal(parser::ParseTree::Node parser_node); diff --git a/include/nodes/basic_nodes.hpp b/include/nodes/basic_nodes.hpp index d9125f3..6392a26 100644 --- a/include/nodes/basic_nodes.hpp +++ b/include/nodes/basic_nodes.hpp @@ -79,6 +79,14 @@ protected: struct unit {}; struct null {}; +struct unicode_string { + std::string str; +}; + +struct unicode { + std::string ch; +}; + class Literal : public Node { public: template @@ -103,7 +111,9 @@ public: auto get_any() const { return &value_; } private: - std::variant value_; + std::variant + value_; }; class Identifier : public Node { diff --git a/include/tokens.hpp b/include/tokens.hpp index 44abb69..52c0fce 100644 --- a/include/tokens.hpp +++ b/include/tokens.hpp @@ -83,10 +83,15 @@ enum class Type { OPERATOR_TAIL2, OPERATOR_TAIL3, - FLOAT_NUMBER_LITERAL, - NUMBER_LITERAL, + FLOAT_LITERAL, + DOUBLE_LITERAL, + INT_LITERAL, + LONG_LITERAL, + INDEX_LITERAL, STRING_LITERAL, + UNICODE_STRING_LITERAL, CHAR_LITERAL, + UNICODE_LITERAL, BOOL_LITERAL, UNIT_LITERAL, NULL_LITERAL, @@ -173,10 +178,15 @@ const static std::string OPERATOR_TAIL1 = "operator_tail1"; const static std::string OPERATOR_TAIL2 = "operator_tail2"; const static std::string OPERATOR_TAIL3 = "operator_tail3"; -const static std::string FLOAT_NUMBER_LITERAL = "float_number_literal"; -const static std::string NUMBER_LITERAL = "number_literal"; +const static std::string FLOAT_LITERAL = "float_literal"; +const static std::string DOUBLE_LITERAL = "double_literal"; +const static std::string INT_LITERAL = "int_literal"; +const static std::string LONG_LITERAL = "long_literal"; +const static std::string INDEX_LITERAL = "index_literal"; const static std::string STRING_LITERAL = "string_literal"; +const static std::string UNICODE_STRING_LITERAL = "unicode_string_literal"; const static std::string CHAR_LITERAL = "char_literal"; +const static std::string UNICODE_LITERAL = "unicode_literal"; const static std::string BOOL_LITERAL = "bool_literal"; const static std::string UNIT_LITERAL = "unit_literal"; const static std::string NULL_LITERAL = "null_literal"; @@ -270,14 +280,24 @@ inline Type string_to_type(const std::string &str) { return Type::OPERATOR_TAIL2; } else if (str == OPERATOR_TAIL3) { return Type::OPERATOR_TAIL3; - } else if (str == FLOAT_NUMBER_LITERAL) { - return Type::FLOAT_NUMBER_LITERAL; - } else if (str == NUMBER_LITERAL) { - return Type::NUMBER_LITERAL; + } else if (str == FLOAT_LITERAL) { + return Type::FLOAT_LITERAL; + } else if (str == DOUBLE_LITERAL) { + return Type::DOUBLE_LITERAL; + } else if (str == INT_LITERAL) { + return Type::INT_LITERAL; + } else if (str == LONG_LITERAL) { + return Type::LONG_LITERAL; + } else if (str == INDEX_LITERAL) { + return Type::INDEX_LITERAL; } else if (str == STRING_LITERAL) { return Type::STRING_LITERAL; + } else if (str == UNICODE_STRING_LITERAL) { + return Type::UNICODE_STRING_LITERAL; } else if (str == CHAR_LITERAL) { return Type::CHAR_LITERAL; + } else if (str == UNICODE_LITERAL) { + return Type::UNICODE_LITERAL; } else if (str == BOOL_LITERAL) { return Type::BOOL_LITERAL; } else if (str == UNIT_LITERAL) { diff --git a/src/builders/basic_builders.cpp b/src/builders/basic_builders.cpp index 8806d01..f08b653 100644 --- a/src/builders/basic_builders.cpp +++ b/src/builders/basic_builders.cpp @@ -88,14 +88,35 @@ nodes::Node build_node(parser::ParseTree::Node parser_node) { // --- literals -nodes::Literal build_float_number_literal(parser::ParseTree::Node parser_node) { +nodes::Literal build_float_literal(parser::ParseTree::Node parser_node) { + std::string literal = parser_node.get_value(); + return nodes::Literal( + build_node(parser_node), + std::stof(literal.substr(0, literal.size() - 1))); // remove 'f' suffix +} + +nodes::Literal build_double_literal(parser::ParseTree::Node parser_node) { return nodes::Literal(build_node(parser_node), std::stod(parser_node.get_value())); } -nodes::Literal build_number_literal(parser::ParseTree::Node parser_node) { +nodes::Literal build_int_literal(parser::ParseTree::Node parser_node) { + std::string literal = parser_node.get_value(); return nodes::Literal(build_node(parser_node), - std::stoll(parser_node.get_value())); + (int32_t)std::stoll(literal.substr( + 0, literal.size() - 1))); // remove 'i' suffix +} + +nodes::Literal build_long_literal(parser::ParseTree::Node parser_node) { + std::string literal = parser_node.get_value(); + return nodes::Literal(build_node(parser_node), + (int64_t)std::stoll(literal.substr( + 0, literal.size() - 1))); // remove 'l' suffix +} + +nodes::Literal build_index_literal(parser::ParseTree::Node parser_node) { + return nodes::Literal(build_node(parser_node), + (size_t)std::stoull(parser_node.get_value())); } nodes::Literal build_string_literal(parser::ParseTree::Node parser_node) { @@ -131,6 +152,16 @@ nodes::Literal build_string_literal(parser::ParseTree::Node parser_node) { return nodes::Literal(build_node(parser_node), literal); } +// TODO: decode escape characters, etc. +nodes::Literal +build_unicode_string_literal(parser::ParseTree::Node parser_node) { + std::string literal = parser_node.get_value(); + + // remove " from both sides + 'u' ("string"u) + return nodes::Literal(build_node(parser_node), + literal.substr(1, literal.size() - 3)); +} + nodes::Literal build_char_literal(parser::ParseTree::Node parser_node) { std::string literal = parser_node.get_value(); @@ -154,6 +185,15 @@ nodes::Literal build_char_literal(parser::ParseTree::Node parser_node) { return nodes::Literal(build_node(parser_node), ch); } +// TODO: decode escape characters, etc. +nodes::Literal build_unicode_literal(parser::ParseTree::Node parser_node) { + std::string literal = parser_node.get_value(); + + // remove '' from both sides + 'u' (''x''u) + return nodes::Literal(build_node(parser_node), + nodes::unicode{literal.substr(2, literal.size() - 5)}); +} + nodes::Literal build_bool_literal(parser::ParseTree::Node parser_node) { std::string literal = parser_node.get_value(); diff --git a/src/builders/expression_builders.cpp b/src/builders/expression_builders.cpp index 6db1d4c..7b37920 100644 --- a/src/builders/expression_builders.cpp +++ b/src/builders/expression_builders.cpp @@ -116,19 +116,35 @@ build_expression(parser::ParseTree::Node parser_node, build_lambda(parser_node, expression_storage, type_storage), is_scoped)); // --- literals - case tokens::Type::FLOAT_NUMBER_LITERAL: - return expression_storage.add_expression( - nodes::Expression(build_node(parser_node), - build_float_number_literal(parser_node), is_scoped)); - case tokens::Type::NUMBER_LITERAL: + case tokens::Type::FLOAT_LITERAL: return expression_storage.add_expression(nodes::Expression( - build_node(parser_node), build_number_literal(parser_node), is_scoped)); + build_node(parser_node), build_float_literal(parser_node), is_scoped)); + case tokens::Type::DOUBLE_LITERAL: + return expression_storage.add_expression(nodes::Expression( + build_node(parser_node), build_double_literal(parser_node), is_scoped)); + case tokens::Type::INT_LITERAL: + return expression_storage.add_expression(nodes::Expression( + build_node(parser_node), build_int_literal(parser_node), is_scoped)); + case tokens::Type::LONG_LITERAL: + return expression_storage.add_expression(nodes::Expression( + build_node(parser_node), build_long_literal(parser_node), is_scoped)); + case tokens::Type::INDEX_LITERAL: + return expression_storage.add_expression(nodes::Expression( + build_node(parser_node), build_index_literal(parser_node), is_scoped)); case tokens::Type::STRING_LITERAL: return expression_storage.add_expression(nodes::Expression( build_node(parser_node), build_string_literal(parser_node), is_scoped)); + case tokens::Type::UNICODE_STRING_LITERAL: + return expression_storage.add_expression(nodes::Expression( + build_node(parser_node), build_unicode_string_literal(parser_node), + is_scoped)); case tokens::Type::CHAR_LITERAL: return expression_storage.add_expression(nodes::Expression( build_node(parser_node), build_char_literal(parser_node), is_scoped)); + case tokens::Type::UNICODE_LITERAL: + return expression_storage.add_expression( + nodes::Expression(build_node(parser_node), + build_unicode_literal(parser_node), is_scoped)); case tokens::Type::BOOL_LITERAL: return expression_storage.add_expression(nodes::Expression( build_node(parser_node), build_bool_literal(parser_node), is_scoped)); @@ -412,7 +428,7 @@ nodes::Access build_tuple_access(parser::ParseTree::Node parser_node, type_storage), expression_storage.add_expression(nodes::Expression( build_node(parser_node.nth_named_child(1)), - build_number_literal(parser_node.nth_named_child(1)), false))); + build_index_literal(parser_node.nth_named_child(1)), false))); } // 'break' | 'continue' diff --git a/src/expression_type_check.cpp b/src/expression_type_check.cpp index 8832cb0..b38334e 100644 --- a/src/expression_type_check.cpp +++ b/src/expression_type_check.cpp @@ -337,7 +337,7 @@ nodes::TypeCheckResult type_check_tuple_access(const nodes::Access &expression, size_t index = *expression.get_index() ->get() .value() - ->get() // TODO: replace with size_t + ->get() // Index type .value(); if (value_result.get().get_type()->to_builtin() != diff --git a/src/printers/basic_printers.cpp b/src/printers/basic_printers.cpp index f10b817..647785c 100644 --- a/src/printers/basic_printers.cpp +++ b/src/printers/basic_printers.cpp @@ -87,36 +87,54 @@ void print_modifier(const nodes::Modifier &modifier, Printer &printer, void print_literal(const nodes::Literal &literal, Printer &printer) { switch (literal.get_any()->index()) { - case 0: // double - // print in parseable form ?? + case 0: // float + printer.print(std::to_string(*literal.get().value())); + return; + case 1: // double printer.print(std::to_string(*literal.get().value())); return; - case 1: // long long - printer.print(std::to_string(*literal.get().value())); + case 2: // int32_t + printer.print(std::to_string(*literal.get().value())); return; - case 2: // std::string + case 3: // int64_t + printer.print(std::to_string(*literal.get().value())); + return; + case 4: // size_t + printer.print(std::to_string(*literal.get().value())); + return; + case 5: // std::string printer.print("\""); printer.print_converted( *literal.get() .value()); // special symbols are converted inside printer.print("\""); return; - case 3: // char + case 6: // unicode_string + printer.print("\""); + printer.print_converted(literal.get() + .value() + ->str); // special symbols are converted inside + printer.print("\"u"); + return; + case 7: // char printer.print("\'\'"); printer.print_converted(std::string(1, *literal.get().value())); printer.print("\'\'"); return; - case 4: // bool + case 8: // unicode + printer.print("\'\'"); + printer.print_converted(literal.get().value()->ch); + printer.print("\'\'u"); + return; + case 9: // bool printer.print(literal.get().value() ? "true" : "false"); return; - case 5: // unit + case 10: // unit printer.print("()"); return; - case 6: // null + case 11: // null printer.print("null"); return; - default: - break; } error_handling::handle_general_error("Unreachable"); diff --git a/tests/test.langexp b/tests/test.langexp index 552a20e..64964b8 100644 --- a/tests/test.langexp +++ b/tests/test.langexp @@ -228,3 +228,18 @@ tuple_argument_test 'x : (A & B & C) = do_something; // ((A1 & A2) | B | C) same to Variant[Tuple[A1 A2] B C] variant_argument_test 'x : ((A1 & A2) | B | C) = do_something; + +literals_test = { + %float_number_literal := 1.0f; + %double_number_literal := 1.0; + %int_literal := 1i; + %long_literal := 1l; + %index_literal := 1; + %string_literal := ""; + %unicode_string_literal := ""u; + %char_literal := ''a''; + %unicode_literal := ''↪''u; + %bool_literal := true; + %unit_literal := (); + %null_literal := null; +}