Skip to content

Commit

Permalink
Merge pull request #339 from andrey-terekhov/feature
Browse files Browse the repository at this point in the history
Feature
  • Loading branch information
bugdea1er authored Nov 24, 2022
2 parents 7f4f481 + 5433579 commit df21fb2
Show file tree
Hide file tree
Showing 19 changed files with 1,543 additions and 651 deletions.
193 changes: 181 additions & 12 deletions libs/compiler/AST.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ expression_t expression_get_class(const node *const nd)
return EXPR_ASSIGNMENT;
case OP_INITIALIZER:
return EXPR_INITIALIZER;
case OP_EMPTY_BOUND:
return EXPR_EMPTY_BOUND;
default:
return EXPR_INVALID;
}
Expand Down Expand Up @@ -505,6 +507,20 @@ node expression_initializer_get_subexpr(const node *const nd, const size_t index
}


node expression_empty_bound(node *const context, const location loc)
{
node nd = node_create(context, OP_EMPTY_BOUND);


node_add_arg(&nd, TYPE_INTEGER); // Тип значения выражения
node_add_arg(&nd, RVALUE); // Категория значения выражения
node_add_arg(&nd, (item_t)loc.begin); // Начальная позиция оператора
node_add_arg(&nd, (item_t)loc.end); // Конечная позиция оператора

return nd;
}


statement_t statement_get_class(const node *const nd)
{
switch (node_get_type(nd))
Expand Down Expand Up @@ -871,6 +887,30 @@ node statement_return_get_expression(const node *const nd)
return node_get_child(nd, 0);
}

node statement_declaration(node *const context)
{
node nd = node_create(context, OP_DECLSTMT);

node_add_arg(&nd, ITEM_MAX); // Начальная позиция оператора
node_add_arg(&nd, ITEM_MAX); // Конечная позиция оператора

return nd;
}

void statement_declaration_add_declarator(const node *const nd, node *const declarator)
{
assert(node_get_type(nd) == OP_DECLSTMT);
node_set_child(nd, declarator);
}

node statement_declaration_set_location(const node *const nd, const location loc)
{
assert(node_get_type(nd) == OP_DECLSTMT);
node_set_arg(nd, 0, (item_t)loc.begin);
node_set_arg(nd, 1, (item_t)loc.end);

return *nd;
}

size_t statement_declaration_get_size(const node *const nd)
{
Expand All @@ -891,8 +931,10 @@ declaration_t declaration_get_class(const node *const nd)
{
case OP_DECL_VAR:
return DECL_VAR;
case OP_DECL_TYPE:
return DECL_TYPE;
case OP_DECL_MEMBER:
return DECL_MEMBER;
case OP_DECL_STRUCT:
return DECL_STRUCT;
case OP_FUNC_DEF:
return DECL_FUNC;
default:
Expand All @@ -901,18 +943,139 @@ declaration_t declaration_get_class(const node *const nd)
}


item_t declaration_type_get_type(const node *const nd)
node declaration_member(node *const context, const item_t type, const size_t name
, node_vector *const bounds, const location loc)
{
assert(node_get_type(nd) == OP_DECL_TYPE);
node nd = node_create(context, OP_DECL_MEMBER);

node_add_arg(&nd, type); // Тип поля
node_add_arg(&nd, (item_t)name); // Имя поля
node_add_arg(&nd, (item_t)loc.begin); // Начальная позиция объявления
node_add_arg(&nd, (item_t)loc.end); // Конечная позиция объявления

if (node_vector_is_correct(bounds))
{
const size_t amount = node_vector_size(bounds);
for (size_t i = 0; i < amount; i++)
{
node item = node_vector_get(bounds, i);
node_set_child(&nd, &item);
}
}

return nd;
}

size_t declaration_member_get_name(const node *const nd)
{
assert(node_get_type(nd) == OP_DECL_MEMBER);
return (size_t)node_get_arg(nd, 1);
}

item_t declaration_member_get_type(const node *const nd)
{
assert(node_get_type(nd) == OP_DECL_MEMBER);
return node_get_arg(nd, 0);
}

size_t declaration_type_get_id(const node *const nd)
size_t declaration_member_get_bounds_amount(const node *const nd)
{
assert(node_get_type(nd) == OP_DECL_MEMBER);
return node_get_amount(nd);
}

node declaration_member_get_bound(const node *const nd, const size_t index)
{
assert(node_get_type(nd) == OP_DECL_MEMBER);
return node_get_child(nd, index);
}


node declaration_struct(node *const context, const size_t name, const location loc)
{
node nd = node_create(context, OP_DECL_STRUCT);

node_add_arg(&nd, (item_t)name); // Имя структуры
node_add_arg(&nd, TYPE_UNDEFINED); // Тип структуры
node_add_arg(&nd, (item_t)loc.begin); // Начальная позиция объявления
node_add_arg(&nd, (item_t)loc.end); // Конечная позиция объявления

return nd;
}

void declaration_struct_add_declarator(node *const nd, node *const member)
{
assert(node_get_type(nd) == OP_DECL_STRUCT);
node_set_child(nd, member);
}

void declaration_struct_set_type(node *const nd, const item_t type)
{
assert(node_get_type(nd) == OP_DECL_STRUCT);
node_set_arg(nd, 1, type);
}

node declaration_struct_set_location(node *const nd, const location loc)
{
assert(node_get_type(nd) == OP_DECL_STRUCT);
node_set_arg(nd, 2, (item_t)loc.begin);
node_set_arg(nd, 3, (item_t)loc.end);

return *nd;
}

size_t declaration_struct_get_name(const node *const nd)
{
assert(node_get_type(nd) == OP_DECL_TYPE);
return node_get_arg(nd, 1) == ITEM_MAX ? SIZE_MAX : (size_t)node_get_arg(nd, 1);
assert(node_get_type(nd) == OP_DECL_STRUCT);
return (size_t)node_get_arg(nd, 0);
}

item_t declaration_struct_get_type(const node *const nd)
{
assert(node_get_type(nd) == OP_DECL_STRUCT);
return node_get_arg(nd, 1);
}

size_t declaration_struct_get_size(const node *const nd)
{
assert(node_get_type(nd) == OP_DECL_STRUCT);
return node_get_amount(nd);
}

node declaration_struct_get_member(const node *const nd, const size_t index)
{
assert(node_get_type(nd) == OP_DECL_STRUCT);
return node_get_child(nd, index);
}


node declaration_variable(node *const context, const size_t id, node_vector *const bounds
, node *const initializer, const location loc)
{
node nd = node_create(context, OP_DECL_VAR);

node_add_arg(&nd, (item_t)id); // Идентификатор переменной
node_add_arg(&nd, initializer ? 1 : 0); // Имеет ли инициализатор
node_add_arg(&nd, (item_t)loc.begin); // Начальная позиция объявления
node_add_arg(&nd, (item_t)loc.end); // Конечная позиция оператора

if (node_vector_is_correct(bounds))
{
const size_t amount = node_vector_size(bounds);
for (size_t i = 0; i < amount; i++)
{
node item = node_vector_get(bounds, i);
node_set_child(&nd, &item);
}
}

if (node_is_correct(initializer))
{
node_set_child(&nd, initializer);
}

return nd;
}

size_t declaration_variable_get_id(const node *const nd)
{
Expand All @@ -923,7 +1086,7 @@ size_t declaration_variable_get_id(const node *const nd)
bool declaration_variable_has_initializer(const node *const nd)
{
assert(node_get_type(nd) == OP_DECL_VAR);
return node_get_arg(nd, 2) != 0;
return node_get_arg(nd, 1) != 0;
}

node declaration_variable_get_initializer(const node *const nd)
Expand All @@ -933,15 +1096,15 @@ node declaration_variable_get_initializer(const node *const nd)
return node_get_child(nd, node_get_amount(nd) - 1);
}

size_t declaration_variable_get_dim_amount(const node *const nd)
size_t declaration_variable_get_bounds_amount(const node *const nd)
{
assert(node_get_type(nd) == OP_DECL_VAR);
return node_get_amount(nd) - (declaration_variable_has_initializer(nd) ? 1 : 0);
}

node declaration_variable_get_dim_expr(const node *const nd, const size_t index)
node declaration_variable_get_bound(const node *const nd, const size_t index)
{
assert(declaration_variable_get_dim_amount(nd) > index);
assert(declaration_variable_get_bounds_amount(nd) > index);
return node_get_child(nd, index);
}

Expand All @@ -952,7 +1115,13 @@ size_t declaration_function_get_id(const node *const nd)
return (size_t)node_get_arg(nd, 0);
}

size_t declaration_function_get_param(const node *const nd, const size_t index)
size_t declaration_function_get_parameters_amount(const node *const nd)
{
assert(node_get_type(nd) == OP_FUNC_DEF);
return node_get_amount(nd) - 1;
}

size_t declaration_function_get_parameter(const node *const nd, const size_t index)
{
assert(node_get_type(nd) == OP_FUNC_DEF);

Expand Down
Loading

0 comments on commit df21fb2

Please sign in to comment.