mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2025-12-25 00:08:45 +00:00
change in literals, literal types
This commit is contained in:
parent
17ff590048
commit
43dfa75b74
10 changed files with 168 additions and 39 deletions
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -337,7 +337,7 @@ nodes::TypeCheckResult type_check_tuple_access(const nodes::Access &expression,
|
|||
size_t index = *expression.get_index()
|
||||
->get<nodes::Literal>()
|
||||
.value()
|
||||
->get<long long>() // TODO: replace with size_t
|
||||
->get<size_t>() // Index type
|
||||
.value();
|
||||
|
||||
if (value_result.get().get_type()->to_builtin() !=
|
||||
|
|
|
|||
|
|
@ -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<float>().value()));
|
||||
return;
|
||||
case 1: // double
|
||||
printer.print(std::to_string(*literal.get<double>().value()));
|
||||
return;
|
||||
case 1: // long long
|
||||
printer.print(std::to_string(*literal.get<long long>().value()));
|
||||
case 2: // int32_t
|
||||
printer.print(std::to_string(*literal.get<int32_t>().value()));
|
||||
return;
|
||||
case 2: // std::string
|
||||
case 3: // int64_t
|
||||
printer.print(std::to_string(*literal.get<int64_t>().value()));
|
||||
return;
|
||||
case 4: // size_t
|
||||
printer.print(std::to_string(*literal.get<size_t>().value()));
|
||||
return;
|
||||
case 5: // std::string
|
||||
printer.print("\"");
|
||||
printer.print_converted(
|
||||
*literal.get<std::string>()
|
||||
.value()); // special symbols are converted inside
|
||||
printer.print("\"");
|
||||
return;
|
||||
case 3: // char
|
||||
case 6: // unicode_string
|
||||
printer.print("\"");
|
||||
printer.print_converted(literal.get<nodes::unicode_string>()
|
||||
.value()
|
||||
->str); // special symbols are converted inside
|
||||
printer.print("\"u");
|
||||
return;
|
||||
case 7: // char
|
||||
printer.print("\'\'");
|
||||
printer.print_converted(std::string(1, *literal.get<char>().value()));
|
||||
printer.print("\'\'");
|
||||
return;
|
||||
case 4: // bool
|
||||
case 8: // unicode
|
||||
printer.print("\'\'");
|
||||
printer.print_converted(literal.get<nodes::unicode>().value()->ch);
|
||||
printer.print("\'\'u");
|
||||
return;
|
||||
case 9: // bool
|
||||
printer.print(literal.get<bool>().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");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue