wip: working on variables

This commit is contained in:
samsonium
2026-10-11 19:11:49 +03:00
parent 01afe2e972
commit 2c76277a68
8 changed files with 215 additions and 72 deletions
+64 -20
View File
@@ -4,6 +4,7 @@
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char plast_err[256];
@@ -93,21 +94,21 @@ static fzl_nodetype_t math_op_to_type(fzl_toktype_t type)
{
switch (type)
{
case FZL_TOKTYPE_PLUS:
return FZL_NODETYPE_ADD;
case FZL_TOKTYPE_MINUS:
return FZL_NODETYPE_SUB;
case FZL_TOKTYPE_STAR:
return FZL_NODETYPE_MUL;
case FZL_TOKTYPE_SLASH:
return FZL_NODETYPE_DIV;
case FZL_TOKTYPE_CARET:
return FZL_NODETYPE_POW;
case FZL_TOKTYPE_PERCENT:
return FZL_NODETYPE_MOD;
case FZL_TOKTYPE_PLUS:
return FZL_NODETYPE_ADD;
case FZL_TOKTYPE_MINUS:
return FZL_NODETYPE_SUB;
case FZL_TOKTYPE_STAR:
return FZL_NODETYPE_MUL;
case FZL_TOKTYPE_SLASH:
return FZL_NODETYPE_DIV;
case FZL_TOKTYPE_CARET:
return FZL_NODETYPE_POW;
case FZL_TOKTYPE_PERCENT:
return FZL_NODETYPE_MOD;
default:
return 0;
default:
return 0;
}
}
@@ -115,13 +116,13 @@ static fzl_nodetype_t unary_op_to_type(fzl_toktype_t type)
{
switch (type)
{
case FZL_TOKTYPE_PLUS:
return FZL_NODETYPE_UNARY_PLUS;
case FZL_TOKTYPE_MINUS:
return FZL_NODETYPE_UNARY_MINUS;
case FZL_TOKTYPE_PLUS:
return FZL_NODETYPE_UNARY_PLUS;
case FZL_TOKTYPE_MINUS:
return FZL_NODETYPE_UNARY_MINUS;
default:
return 0;
default:
return 0;
}
}
@@ -380,6 +381,49 @@ fzl_node_t *parse_expression(fzl_parser_t *parser)
// Statement parsing
fzl_node_t *parse_statement(fzl_parser_t *parser)
{
if (is(parser, FZL_TOKTYPE_TYPE) || is(parser, FZL_TOKTYPE_NAME))
{
fzl_token_t *type = peek(parser);
if (type->type == FZL_TOKTYPE_TYPE)
consume(parser);
if (type->type == FZL_TOKTYPE_TYPE || next(parser)->type == FZL_TOKTYPE_EQ)
{
fzl_node_t *identifier = parse_primary(parser);
if (!identifier || identifier->type != FZL_NODETYPE_IDENTIFIER)
{
snprintf(plast_err, sizeof(plast_err), "expected identifier at %ld:%ld",
type->ln, type->cn);
return NULL;
}
fzl_node_t *left = fzl_mknode(FZL_NODETYPE_DECLARATION, type);
left->var.type = type;
left->var.identifier = identifier;
if (!is(parser, FZL_TOKTYPE_EQ))
return left;
fzl_node_t *right;
while (is(parser, FZL_TOKTYPE_EQ))
{
fzl_token_t *asn = consume(parser);
right = parse_expression(parser);
if (!right)
return NULL;
fzl_node_t *node = fzl_mknode(FZL_NODETYPE_ASSIGN, asn);
node->binary_op.left = left;
node->binary_op.right = right;
left = node;
}
return left;
}
}
return parse_expression(parser);
}