feat+ref: refactor + new types

This commit is contained in:
samsonium
2026-10-11 08:51:54 +03:00
parent e3b8ec6b7d
commit 83e20d78f3
13 changed files with 532 additions and 341 deletions
+49 -45
View File
@@ -19,7 +19,7 @@ fzl_parser_t *fzl_mkparser(fzl_reader_ll_t *first)
if (!parser)
return NULL;
parser->root = NULL;
parser->root = NULL;
parser->cursor = first->next;
if (!parser->cursor)
return NULL;
@@ -36,10 +36,10 @@ fzl_node_t *fzl_mknode(fzl_nodetype_t type, fzl_token_t *token)
if (!node)
return NULL;
node->type = type;
node->token = token;
node->type = type;
node->token = token;
node->parent = NULL;
node->next = NULL;
node->next = NULL;
return node;
}
@@ -71,7 +71,7 @@ static fzl_token_t *consume(fzl_parser_t *parser)
if (!parser || !parser->cursor)
return NULL;
fzl_token_t *tok = parser->cursor->token;
parser->cursor = parser->cursor->next;
parser->cursor = parser->cursor->next;
return tok;
}
@@ -149,8 +149,8 @@ fzl_node_t *parse_primary(fzl_parser_t *parser)
fzl_node_t *node = parse_expression(parser);
if (!is(parser, FZL_TOKTYPE_RPAREN))
{
snprintf(plast_err, sizeof(plast_err), "expected rparen at %d",
parser->cursor->token->i0);
snprintf(plast_err, sizeof(plast_err), "expected ')' at %ld:%ld",
parser->cursor->token->ln, parser->cursor->token->cn);
return NULL;
}
consume(parser);
@@ -162,8 +162,8 @@ fzl_node_t *parse_primary(fzl_parser_t *parser)
return fzl_mknode(FZL_NODETYPE_IDENTIFIER, name);
}
snprintf(plast_err, sizeof(plast_err), "failed to parse primary at %d",
peek(parser)->i0);
snprintf(plast_err, sizeof(plast_err), "failed to parse primary at %ld:%ld",
peek(parser)->ln, peek(parser)->cn);
return NULL;
}
@@ -173,13 +173,13 @@ fzl_node_t *parse_postfix(fzl_parser_t *parser)
if (!parser)
return NULL;
fzl_node_t *left = parse_primary(parser);
fzl_node_t *left = parse_primary(parser);
fzl_node_t *right = NULL;
if (!left)
{
snprintf(plast_err, sizeof(plast_err), "failed to parse postfix at %d",
peek(parser)->i0);
snprintf(plast_err, sizeof(plast_err), "failed to parse postfix at %ld:%ld",
peek(parser)->ln, peek(parser)->cn);
return NULL;
}
@@ -188,8 +188,8 @@ fzl_node_t *parse_postfix(fzl_parser_t *parser)
consume(parser);
size_t args_capacity = 2;
size_t args_count = 0;
fzl_node_t **args = malloc(args_capacity * sizeof(fzl_node_t *));
size_t args_count = 0;
fzl_node_t **args = malloc(args_capacity * sizeof(fzl_node_t *));
while (!is(parser, FZL_TOKTYPE_RPAREN))
{
@@ -218,13 +218,14 @@ fzl_node_t *parse_postfix(fzl_parser_t *parser)
{
free(args);
snprintf(plast_err, sizeof(plast_err),
"expected ')' after argument list at %d", peek(parser)->i0);
"expected ')' after argument list at %ld:%ld", peek(parser)->ln,
peek(parser)->cn);
return NULL;
}
fzl_node_t *node = fzl_mknode(FZL_NODETYPE_CALL, left->token);
node->call.callee = left;
node->call.args = args;
fzl_node_t *node = fzl_mknode(FZL_NODETYPE_CALL, left->token);
node->call.callee = left;
node->call.args = args;
node->call.args_count = args_count;
left = node;
@@ -242,13 +243,13 @@ fzl_node_t *parse_unary(fzl_parser_t *parser)
if (!is(parser, FZL_TOKTYPE_MINUS) && !is(parser, FZL_TOKTYPE_PLUS))
return parse_postfix(parser);
fzl_token_t *op = consume(parser);
fzl_token_t *op = consume(parser);
fzl_node_t *operand = parse_unary(parser);
if (!operand)
return NULL;
fzl_node_t *result = fzl_mknode(unary_op_to_type(op->type), op);
fzl_node_t *result = fzl_mknode(unary_op_to_type(op->type), op);
result->unary_op.operand = operand;
return result;
@@ -259,13 +260,13 @@ fzl_node_t *parse_power(fzl_parser_t *parser)
if (!parser)
return NULL;
fzl_node_t *left = parse_unary(parser);
fzl_node_t *left = parse_unary(parser);
fzl_node_t *right = NULL;
if (!left)
{
snprintf(plast_err, sizeof(plast_err), "failed to parse power at %d",
peek(parser)->i0);
snprintf(plast_err, sizeof(plast_err), "failed to parse power at %ld:%ld",
peek(parser)->ln, peek(parser)->cn);
return NULL;
}
@@ -277,12 +278,13 @@ fzl_node_t *parse_power(fzl_parser_t *parser)
if (!right)
{
snprintf(plast_err, sizeof(plast_err),
"failed to parse right side of power at %d", peek(parser)->i0);
"failed to parse right side of power at %ld:%ld",
peek(parser)->ln, peek(parser)->cn);
return NULL;
}
fzl_node_t *node = fzl_mknode(FZL_NODETYPE_POW, caret);
node->binary_op.left = left;
fzl_node_t *node = fzl_mknode(FZL_NODETYPE_POW, caret);
node->binary_op.left = left;
node->binary_op.right = right;
left = node;
@@ -297,14 +299,14 @@ fzl_node_t *parse_factor(fzl_parser_t *parser)
if (!parser)
return NULL;
fzl_node_t *left = parse_power(parser);
fzl_node_t *left = parse_power(parser);
fzl_node_t *right = NULL;
if (!left)
{
if (!plast_err[0])
snprintf(plast_err, sizeof(plast_err), "invalid expression at %u",
parser->cursor->token->i0);
snprintf(plast_err, sizeof(plast_err), "invalid expression at %ld:%ld",
parser->cursor->token->ln, parser->cursor->token->cn);
return NULL;
}
@@ -317,14 +319,15 @@ fzl_node_t *parse_factor(fzl_parser_t *parser)
if (!right)
{
snprintf(plast_err, sizeof(plast_err),
"unfinished factor (mul/div) expression at %u", left->token->i0);
"unfinished factor (mul/div) expression at %ld:%ld",
left->token->ln, left->token->cn);
return NULL;
}
fzl_node_t *node = fzl_mknode(math_op_to_type(op->type), op);
node->binary_op.left = left;
fzl_node_t *node = fzl_mknode(math_op_to_type(op->type), op);
node->binary_op.left = left;
node->binary_op.right = right;
left = node;
left = node;
}
return left;
@@ -336,13 +339,13 @@ fzl_node_t *parse_term(fzl_parser_t *parser)
if (!parser)
return NULL;
fzl_node_t *left = parse_factor(parser);
fzl_node_t *left = parse_factor(parser);
fzl_node_t *right = NULL;
if (!left)
{
snprintf(plast_err, sizeof(plast_err), "invalid expression at %u",
parser->cursor->token->i0);
snprintf(plast_err, sizeof(plast_err), "invalid expression at %ld:%ld",
parser->cursor->token->ln, parser->cursor->token->cn);
return NULL;
}
@@ -354,14 +357,15 @@ fzl_node_t *parse_term(fzl_parser_t *parser)
if (!right)
{
snprintf(plast_err, sizeof(plast_err),
"unfinished term (add/sub) expression at %u", left->token->i0);
"unfinished term (add/sub) expression at %ld:%ld",
left->token->ln, left->token->cn);
return NULL;
}
fzl_node_t *node = fzl_mknode(math_op_to_type(op->type), op);
node->binary_op.left = left;
fzl_node_t *node = fzl_mknode(math_op_to_type(op->type), op);
node->binary_op.left = left;
node->binary_op.right = right;
left = node;
left = node;
}
return left;
@@ -383,8 +387,8 @@ fzl_node_t *parse_statement(fzl_parser_t *parser)
fzl_node_t *parse_program(fzl_parser_t *parser)
{
fzl_node_t *first = NULL;
fzl_node_t *last = NULL;
fzl_node_t *node = NULL;
fzl_node_t *last = NULL;
fzl_node_t *node = NULL;
while (peek(parser) != NULL)
{
node = parse_statement(parser);
@@ -394,18 +398,18 @@ fzl_node_t *parse_program(fzl_parser_t *parser)
if (!last)
{
first = node;
last = node;
last = node;
}
else
{
last->next = node;
last = node;
last = node;
}
}
if (!first)
{
snprintf(plast_err, sizeof(plast_err), "empty ;(");
snprintf(plast_err, sizeof(plast_err), "nothing to parse >:(");
return NULL;
}