change in literals, literal types

This commit is contained in:
ProgramSnail 2023-08-12 15:55:33 +03:00
parent 17ff590048
commit 43dfa75b74
10 changed files with 168 additions and 39 deletions

View file

@ -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();

View file

@ -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'