mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2025-12-08 16:08:46 +00:00
fixes, expression printers
This commit is contained in:
parent
3669084f55
commit
bf49f4030c
9 changed files with 349 additions and 101 deletions
|
|
@ -16,94 +16,109 @@ build_expression(parser::ParseTree::Node parser_node,
|
|||
nodes::TypeStorage &type_storage) {
|
||||
tokens::Type type = tokens::string_to_type(parser_node.get_type());
|
||||
|
||||
auto maybe_parenthesis = parser_node.next_sibling();
|
||||
bool is_scoped =
|
||||
(!maybe_parenthesis.is_null() && maybe_parenthesis.get_value() == "(");
|
||||
|
||||
switch (type) {
|
||||
// --- flow control
|
||||
case tokens::Type::MATCH:
|
||||
return expression_storage.add_expression(nodes::Expression(
|
||||
build_match(parser_node, expression_storage, type_storage)));
|
||||
build_match(parser_node, expression_storage, type_storage), is_scoped));
|
||||
case tokens::Type::CONDITION:
|
||||
return expression_storage.add_expression(nodes::Expression(
|
||||
build_condition(parser_node, expression_storage, type_storage)));
|
||||
build_condition(parser_node, expression_storage, type_storage),
|
||||
is_scoped));
|
||||
case tokens::Type::LOOP:
|
||||
return expression_storage.add_expression(nodes::Expression(
|
||||
build_loop(parser_node, expression_storage, type_storage)));
|
||||
build_loop(parser_node, expression_storage, type_storage), is_scoped));
|
||||
// --- operators
|
||||
case tokens::Type::COMMA_EXPRESSION:
|
||||
return expression_storage.add_expression(nodes::Expression(
|
||||
build_comma_expression(parser_node, expression_storage, type_storage)));
|
||||
build_comma_expression(parser_node, expression_storage, type_storage),
|
||||
is_scoped));
|
||||
case tokens::Type::OPERATOR_EXPRESSION:
|
||||
return expression_storage.add_expression(
|
||||
nodes::Expression(build_operator_expression(
|
||||
parser_node, expression_storage, type_storage)));
|
||||
parser_node, expression_storage, type_storage),
|
||||
is_scoped));
|
||||
// --- containers
|
||||
case tokens::Type::BLOCK:
|
||||
return expression_storage.add_expression(nodes::Expression(
|
||||
build_block(parser_node, expression_storage, type_storage)));
|
||||
build_block(parser_node, expression_storage, type_storage), is_scoped));
|
||||
case tokens::Type::ARRAY:
|
||||
return expression_storage.add_expression(nodes::Expression(
|
||||
build_array(parser_node, expression_storage, type_storage)));
|
||||
build_array(parser_node, expression_storage, type_storage), is_scoped));
|
||||
// --- modifiers
|
||||
case tokens::Type::RETURN:
|
||||
return expression_storage.add_expression(nodes::Expression(
|
||||
build_return(parser_node, expression_storage, type_storage)));
|
||||
build_return(parser_node, expression_storage, type_storage),
|
||||
is_scoped));
|
||||
case tokens::Type::NAME_DEFINITION:
|
||||
return expression_storage.add_expression(
|
||||
nodes::Expression(build_name_definition(parser_node)));
|
||||
nodes::Expression(build_name_definition(parser_node), is_scoped));
|
||||
case tokens::Type::ARRAY_ACCESS:
|
||||
return expression_storage.add_expression(nodes::Expression(
|
||||
build_array_access(parser_node, expression_storage, type_storage)));
|
||||
build_array_access(parser_node, expression_storage, type_storage),
|
||||
is_scoped));
|
||||
case tokens::Type::TUPLE_ACCESS:
|
||||
return expression_storage.add_expression(nodes::Expression(
|
||||
build_tuple_access(parser_node, expression_storage, type_storage)));
|
||||
build_tuple_access(parser_node, expression_storage, type_storage),
|
||||
is_scoped));
|
||||
case tokens::Type::LOOP_CONTROL:
|
||||
return expression_storage.add_expression(
|
||||
nodes::Expression(build_loop_control(parser_node)));
|
||||
nodes::Expression(build_loop_control(parser_node), is_scoped));
|
||||
case tokens::Type::REFERENCE_EXPRESSION:
|
||||
return expression_storage.add_expression(
|
||||
nodes::Expression(build_reference_expression(
|
||||
parser_node, expression_storage, type_storage)));
|
||||
parser_node, expression_storage, type_storage),
|
||||
is_scoped));
|
||||
case tokens::Type::SUFFIX_EXPRESSION:
|
||||
return expression_storage.add_expression(
|
||||
nodes::Expression(build_suffix_expression(
|
||||
parser_node, expression_storage, type_storage)));
|
||||
return expression_storage.add_expression(nodes::Expression(
|
||||
build_suffix_expression(parser_node, expression_storage, type_storage),
|
||||
is_scoped));
|
||||
// --- other
|
||||
case tokens::Type::NAME_EXPRESSION:
|
||||
return expression_storage.add_expression(nodes::Expression(
|
||||
build_name_expression(parser_node, expression_storage, type_storage)));
|
||||
build_name_expression(parser_node, expression_storage, type_storage),
|
||||
is_scoped));
|
||||
case tokens::Type::ARGUMENT_NAME_IDENTIFIER:
|
||||
case tokens::Type::SIMPLE_NAME_IDENTIFIER:
|
||||
case tokens::Type::PLACEHOLDER:
|
||||
return expression_storage.add_expression(
|
||||
nodes::Expression(nodes::NameExpression(
|
||||
build_node(parser_node), build_identifier(parser_node))));
|
||||
nodes::Expression(nodes::NameExpression(build_node(parser_node),
|
||||
build_identifier(parser_node)),
|
||||
is_scoped));
|
||||
case tokens::Type::CONSTRUCTOR:
|
||||
return expression_storage.add_expression(nodes::Expression(
|
||||
build_constructor(parser_node, expression_storage, type_storage)));
|
||||
build_constructor(parser_node, expression_storage, type_storage),
|
||||
is_scoped));
|
||||
case tokens::Type::LAMBDA:
|
||||
return expression_storage.add_expression(nodes::Expression(
|
||||
build_lambda(parser_node, expression_storage, type_storage)));
|
||||
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_float_number_literal(parser_node)));
|
||||
nodes::Expression(build_float_number_literal(parser_node), is_scoped));
|
||||
case tokens::Type::NUMBER_LITERAL:
|
||||
return expression_storage.add_expression(
|
||||
nodes::Expression(build_number_literal(parser_node)));
|
||||
nodes::Expression(build_number_literal(parser_node), is_scoped));
|
||||
case tokens::Type::STRING_LITERAL:
|
||||
return expression_storage.add_expression(
|
||||
nodes::Expression(build_string_literal(parser_node)));
|
||||
nodes::Expression(build_string_literal(parser_node), is_scoped));
|
||||
case tokens::Type::CHAR_LITERAL:
|
||||
return expression_storage.add_expression(
|
||||
nodes::Expression(build_char_literal(parser_node)));
|
||||
nodes::Expression(build_char_literal(parser_node), is_scoped));
|
||||
case tokens::Type::BOOL_LITERAL:
|
||||
return expression_storage.add_expression(
|
||||
nodes::Expression(build_bool_literal(parser_node)));
|
||||
nodes::Expression(build_bool_literal(parser_node), is_scoped));
|
||||
case tokens::Type::UNIT_LITERAL:
|
||||
return expression_storage.add_expression(
|
||||
nodes::Expression(build_unit_literal(parser_node)));
|
||||
nodes::Expression(build_unit_literal(parser_node), is_scoped));
|
||||
case tokens::Type::NULL_LITERAL:
|
||||
return expression_storage.add_expression(
|
||||
nodes::Expression(build_null_literal(parser_node)));
|
||||
nodes::Expression(build_null_literal(parser_node), is_scoped));
|
||||
default:
|
||||
error_handling::handle_parsing_error("Unexprected expression node type",
|
||||
parser_node);
|
||||
|
|
@ -370,7 +385,7 @@ nodes::Access build_tuple_access(parser::ParseTree::Node parser_node,
|
|||
build_expression(parser_node.nth_named_child(0), expression_storage,
|
||||
type_storage),
|
||||
expression_storage.add_expression(nodes::Expression(
|
||||
build_number_literal(parser_node.nth_named_child(1)))));
|
||||
build_number_literal(parser_node.nth_named_child(1)), false)));
|
||||
}
|
||||
|
||||
// 'break' | 'continue'
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue